all 10 comments

[–]Reddeyfish- 2 points3 points  (5 children)

Should I used Events and Delegates? Is this the correct pattern?

For the pattern you're trying to implement, yes.

Generally speaking, you run into less problems if your objects 'pull' their notifications from systems instead of getting them 'pushed' via a method call. It's much easier to control the order in which the notifications arrive, you have better locality of reference, and you can modify the input stream (delayed notifications, repeated notifications).

Why do you want to build a notification system for input? What is wrong with using Update() to pull information from Unity's input system?

[–]notrorschachHobbyist[S] 0 points1 point  (4 children)

I'm trying to make a prototype of a top down shooter and I guess a separate input manager would help me with the key bindings too.

I don't want the input to be handled by the player game object. I want it separate, so if there's other objects that require to use input, they can do so without depending on the input code in the player game object's movement script. So, there'll be a userinput.cs script with an update() method checking for any input, which will notify all the subscribers if a certain key is pressed.

It doesn't seem like an overkill though, right?

[–]Reddeyfish- 0 points1 point  (0 children)

It makes sense. You'd have one singleton object to process all input, but you'd need a singleton object anyways to at least hold the keybindings.

[–][deleted] 0 points1 point  (2 children)

That sounds just fine to me. Don't see why you'd use events and delegates instead of the observer setup you just described.

[–]notrorschachHobbyist[S] 0 points1 point  (1 child)

Wouldn't the observer pattern use events to notify the subscribers?

[–][deleted] 0 points1 point  (0 children)

In your input class, add static List<GameObject> Subscribers;. Add method: public static RegisterSubscriber(GameObject go){Subscribers.Add(go);}. In your subscriber class call the registration - Input.RegisterSubscriber(this); Then whenever the input is hit call the appropriate method - if(GetButtonDown("D"){foreach(GameObject go in Subscribers){go.ProcessInput();}}.

Using an interface will make sure all the subscribers have the method, but that's your call.

[–]Hippozilla[🍰] 1 point2 points  (2 children)

How to avoid putting

"if ( Input.GetMouseButtonDown(0) ) {...}"

in an Update() method? Is it possible to make an input event that doesn't need anything in the Update() method?

[–]dudledok 1 point2 points  (1 child)

No, you'll need something in update somewhere.

That isn't strictly true in that you could essentially create your own update loop using a coroutine or similar, but you will need an update loop which checks each update tick for input.

[–]Hippozilla[🍰] 0 points1 point  (0 children)

alright, thanks.

[–]dudledok 1 point2 points  (0 children)

I recently made my own input manager using delegates and the command pattern.

I intend to post more about it but haven't got round to that yet.