Последние два дня я боролся с базовой 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()
. Я попытался назначить объекту уникальный идентификатор, чтобы убедиться, что он во время выполнения такой же, как и был. Кто-нибудь знает, почему это не работает? Мы будем благодарны за руку помощи!