Подписка на делегата, который вызывается несколько раз - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть 4 экземпляра GameObjectONE в моей сцене.Скрипт, который прикреплен к GameObjectONE, вызывает делегата.У меня есть другой объект под названием GameObjectTwo в моей сцене.Скрипт, который прикреплен к GameObjectTwo, содержит функцию, которая подписывается на делегат, вызываемый GameObjectONE.Однако эта функция вызывается 4 раза.Я думаю, это потому, что на сцене есть 4 копии GameObjectONE.Есть ли способ вызвать функцию внутри GameObjectTwo только один раз, независимо от того, сколько экземпляров GameObjectONE существует в сцене?

Это псевдокод, но он показывает, чего я пытаюсь достичь

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.
}
}

1 Ответ

0 голосов
/ 29 декабря 2018
  1. Сделать событие в GameObjectONE статическим (чтобы оно не связывалось с объектом).
  2. В GameObjectTWO подпишитесь на это событие, вызвав метод класса (не объект)

    GameObjectONE.OnEventThatIsFiredByGameObjectOne + = ...

...