Событие C# в единстве всегда равно нулю, несмотря на присвоение, почему? - PullRequest
0 голосов
/ 08 мая 2020

Последние два дня я боролся с базовой c системой событий в моей игре на единство. Для некоторого контекста в игре есть система упражнений, в которой интерактивные объекты запускают событие для запуска валидаторов упражнений, которые определяют, было ли упражнение завершено.

У меня есть абстрактный класс Interactive, который содержит basi c событие и его триггер:

public abstract class Interactive : MonoBehaviour
{
    public event EventHandler Interacted;

    protected virtual void OnInteraction()
    {
        Interacted?.Invoke(this, EventArgs.Empty);
    }
}

Абстрактный класс реализован в интерактивном объекте, на данный момент ShootingTarget:

public class ShootingTarget : Interactive, IHitable
{
    public HitType OnHit(Gun gun, RaycastHit raycastHit)
    {
        var partHit = GetHitboxTypeFromHit(raycastHit);
        var hitType = HitType.Miss;

        if (Goals.Contains(partHit))
        {
            hitType = HitType.Right;
        }

        else if (Unwanted.Contains(partHit))
        {
            hitType = HitType.Unwanted;
        }

        OnInteraction();
        return hitType;
    }
}

Скрипт упражнения привязан к пустому объект в единстве. У него есть свойство public Interactive[] Interactives;, в котором интерактивный объект для этого упражнения настраивается через инспектор единства. На Start() класс упражнений проходит по предоставленным интерактивным объектам и устанавливает обработчик событий для каждого .Interacted события:

public class Exercise : MonoBehaviour
{
    public Interactive[] Interactives;

    public ExerciseValidator[] ExerciseValidators;

    public void Start()
    {
        foreach (var interactive in Interactives)
        {
            interactive.Interacted += OnInteractionHandler;
        }
    }

    public void OnInteractionHandler(object sender, EventArgs e)
    {
        foreach (var exerciseValidator in ExerciseValidators)
        {
            exerciseValidator.Validate();
        }
    }
}

Цель состоит в том, что при вызове ShootingTarget.OnHit() будет ShootingTarget.OnInteraction() срабатывает, что должно происходить через триггер события ShootingTarget.Interacted Exercise.OnInteractionHandler().

Однако во время отладки ShootingTarget.Interacted всегда будет иметь значение null . Несмотря на то, что к нему привязаны Exercise.OnInteractionHandler() . Я попытался назначить объекту уникальный идентификатор, чтобы убедиться, что он во время выполнения такой же, как и был. Кто-нибудь знает, почему это не работает? Мы будем благодарны за руку помощи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...