【发布时间】: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