【问题标题】:In Unity, Events in C# fire but suscriber methods don't?在 Unity 中,C# 中的事件会触发,但订阅者方法不会触发?
【发布时间】:2021-06-17 22:08:30
【问题描述】:

我在将触发的事件连接到另一个类中的订阅者方法时遇到了困难。这是整个设置:

首先,我得到了这个作为发布者类的类:

  public class OpenInteraction : IInteraction
  {
        public event EventHandler<bool> OpenStateChange;

        private void OnOpenStateChange(bool e)
        {
            Debug.Log("open = " + e);     
            OpenStateChange?.Invoke(this, e);
        }     
  }

我有第二堂课,应该是订阅者:

    public class AttachedContainer : MonoBehaviour
    { 
        private OpenInteraction openInteraction;

        public void Start()
        {
            Debug.Log("create OpenInteraction in AttachedContainer");
            openInteraction = new OpenInteraction();
            openInteraction.OpenStateChange += ContainerOpened;    
        }

        static void ContainerOpened(object sender, bool e)
        {
            Debug.Log("container state changed");
        }
    }

就一点上下文而言,每次我在游戏中打开/关闭容器时都会触发该事件。当播放器执行此操作时,方法OnOpenStateChange(bool e) 被正确调用,并且调试控制台显示消息“open = ..”

在游戏开始时在每个 AttachedContainer 上创建一个 openInteraction,“在 AttachedContainer 中创建 OpenInteraction”的消息也适当地记录在此处。

但是,我从未在订阅者方法中看到消息“容器状态已更改”,应该在每次关闭/打开交互时触发。

这段代码有什么问题?

【问题讨论】:

  • 我没有看到任何明显的原因可能导致它。我无法从您的说明中重现所描述的问题,我得到与此处相同的统一结果:dotnetfiddle.net/wG12eq。考虑开始一个空项目,重现问题,然后编辑到这个问题,包括这样做的必要步骤。有关更多信息,请参阅minimal reproducible example。需要特别注意的是,没有关于如何调用 OnOpenStateChange 的有用描述,只是在某些条件下“正确”地调用它。
  • @Ruzihm 谢谢,看到它在像您提供的那样的最小示例中工作非常有用。我想做一个,但这段代码是更复杂的东西的一部分,它是联网的,有许多相互连接的脚本。关于 OnOpenStateChange 的调用,我只知道每次执行打开/关闭操作时都会调用它,正如预期的那样.
  • 您注册事件的实例和您正在查看的实例是否可能不同? ;) 在创建 new OpenInteraction("some unique ID") 时尝试给它一个名称或唯一 ID,然后记录 Debug.Log($"{theID} open = {e}");
  • @derHugo 这绝对是这里的问题,现在我明白了。我还没有解决它,但绝对是这样。

标签: c# unity3d events eventhandler


【解决方案1】:

调用事件的OpenInteraction类的实例和Class AttachedContainer中的这个类的实例必须是同一个。

【讨论】:

  • 谢谢,这就是两个实例的问题。您回答的第二部分,我知道这一点,并且我不会在 OpenInteraction 类之外对其进行任何调用。如果您编辑答案以摆脱第二部分,我会将其视为已接受:)
  • 好吧,这取决于你的项目逻辑。另一个可能的解决方案是您将事件设为静态。因此,您可以从任何实例中引发事件。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2017-02-06
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多