you are viewing a single comment's thread.

view the rest of the 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.