Unity中AddListener绑定EventManager委托事件报错,求正确格式
Hey there! Let's break down why you're hitting that error and fix your code step by step.
What's Causing the Error?
Your issue stems from two key misunderstandings:
- You can't directly call an event like a regular method:
EventManager.OnGenerateNewDriftSetClickedis defined as anevent, not a standard method. Events only support+=(subscribe) or-=(unsubscribe) operations from outside their defining class—direct invocation like you tried isn't allowed. - Unity Button's
onClickexpects a parameterless delegate: TheAddListenermethod for UI Buttons requires anAction(a delegate with no parameters), but your event uses a delegate that takes two parameters (intandstring). These don't match directly.
Fixed Code for GameManager.cs
Here's the corrected way to hook up your button click to trigger the event:
public void AddListeners() { // Use a lambda expression to wrap the event trigger logic, matching Button's parameterless requirement newDriftBtn.onClick.AddListener(() => { // Safely invoke the event with your parameters (null check avoids crashes if no subscribers exist) EventManager.OnGenerateNewDriftSetClicked?.Invoke(driftNumSteps, driftName); }); }
Key Notes:
- The
?.Invoke()syntax is crucial: If no scripts have subscribed toOnGenerateNewDriftSetClicked(e.g., ifGenerateNewDriftis disabled), callingInvoke()directly would throw a null reference error. The?.operator checks if the event has subscribers first. - Your existing code in
EventManager.csandGenerateNewDrift.csis correct! The+=/-=logic inGenerateNewDriftproperly subscribes/unsubscribes to the event, and it will receive thedriftNumStepsanddriftNameparameters when the event is triggered.
Optional Cleanup: Encapsulate Event Triggering
For better encapsulation, you can add a dedicated method in EventManager to handle triggering the event, instead of invoking it directly from outside the class:
Updated EventManager.cs
public class EventManager : MonoBehaviour { public delegate void GenerateNewDriftSetHandler(int steps, string title); public static event GenerateNewDriftSetHandler OnGenerateNewDriftSetClicked; // Public static method to safely trigger the event public static void TriggerGenerateNewDriftSet(int steps, string title) { OnGenerateNewDriftSetClicked?.Invoke(steps, title); } }
Updated GameManager.cs
public void AddListeners() { newDriftBtn.onClick.AddListener(() => { EventManager.TriggerGenerateNewDriftSet(driftNumSteps, driftName); }); }
This keeps all event-related logic contained within EventManager, making your code easier to maintain and follow.
内容的提问来源于stack exchange,提问作者greyBow
相关产品推荐
相关产品推荐

