【问题标题】:Subscribing to a delegate that is invoked multiple times订阅多次调用的委托
【发布时间】:2018-12-29 02:25:01
【问题描述】:

我的场景中有 4 个“GameObjectONE”实例。附加到 GameObjectONE 的脚本调用委托。我的场景中有另一个名为 GameObjectTwo 的对象。附加到 GameObjectTwo 的脚本包含一个订阅 GameObjectONE 调用的委托的函数。但是,该函数被调用了 4 次。我猜那是因为场景中有 4 个 GameObjectONE 副本。无论如何,无论场景中存在多少 GameObjectONE 实例,是否只调用一次 GameObjectTwo 内部的函数?

这是伪代码,但它显示了我想要实现的目标

using System;
using UnityEngine;

public class GameObjectONE : MonoBehaviour
{
public static event Action<Vector3> OnClick;

private void Update()
{
    if (currentlySelected)
        if (clickedOnTerrain)
        {
            var clickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            OnClick?.Invoke(clickPos);
            MoveToTarget();
        }
}

}

二等

using UnityEngine;

public class GameObjectTWO : MonoBehaviour
{

private void Awake()
{
    GameObjectONE.OnClick += AssignTargets;
}

private void OnDestroy()
{
    GameObjectONE.OnClick -= AssignTargets;
}


private void AssignTargets(Vector3 clickPos)
{
    //Based on the click position, find and assign a target for each unit.
}
}

【问题讨论】:

  • 我会说所有四个对象都满足在 GameObjectONE 上调用事件的条件,因此它们都调用静态事件。

标签: c# unity3d events delegates action


【解决方案1】:
  1. 将 GameObjectONE 中的事件设为静态(因此它与对象无关)。
  2. 在 GameObjectTWO 中通过调用类方法(不是对象)订阅此事件

    GameObjectONE.OnEventThatIsFiredByGameObjectOne += ...

【讨论】:

  • 已经是这样了。该事件已经是静态的,我已经通过调用类方法订阅了它。
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2019-05-22
  • 2019-02-12
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多