В рамках нее я реализую собираемые предметы (такие как монеты, топор и жизни).
Я начал с реализации монеты и топора. монета работает хорошо. У меня есть сценарий монеты, связанный с игровым объектом монеты в редакторе Unity. у меня есть скрипт coinManager, который унаследован от общего класса с именем CollectablesManager.
вот логика монеты (и общий класс предметов коллекционирования):
CollectableManager.cs:
Код: Выделить всё
using System;
using System.Reflection;
using UnityEngine;
public class CollectableManager : MonoBehaviour where T : MonoBehaviour
{
protected int count = 0;
protected virtual void OnEnable()
{
//create delegate instance and add the handles to it
EventInfo eventInfo = typeof(T).GetEvent("OnCollision");
if (eventInfo != null)
{
Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "OnCollect");
eventInfo.AddEventHandler(this, handler);
}
}
protected virtual void OnDisable()
{
EventInfo eventInfo = typeof(T).GetEvent("OnCollision");
if (eventInfo != null)
{
Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "OnCollect");
eventInfo.RemoveEventHandler(this, handler);
}
}
protected virtual void OnCollect()
{
count++;
UpdateUI();
}
protected virtual void UpdateUI()
{
}
}
Код: Выделить всё
using UnityEngine;
public class SC_Coin : MonoBehaviour
{
public delegate void CoinCollisionHandler();
public static event CoinCollisionHandler OnCollision;
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
OnCollision();
Destroy(gameObject);
}
}
}
Код: Выделить всё
using TMPro;
using UnityEngine;
public class SC_CoinsManager : CollectableManager
{
protected override void UpdateUI()
{
GameObject.Find("Txt_Coins").GetComponent().text = "X " + count.ToString();
}
}
вот логика топора:
SC_Axe.cs:
Код: Выделить всё
using System.Collections;
using UnityEngine;
public class SC_Axe : MonoBehaviour
{
public delegate void AxeCollisionHandler();
public static event AxeCollisionHandler OnCollision;
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
OnCollision();
Destroy(gameObject);
}
}
}
Код: Выделить всё
using TMPro;
using UnityEngine;
public class SC_AxeManager : CollectableManager
{
protected override void UpdateUI()
{
GameObject.Find("Txt_Axes").GetComponent().text = "X " + count.ToString();
}
}
Я понимаю, что если событие имеет значение NULL, это потому, что никто на него не подписывается. универсальный класс подписывается на событие SC_Coin, но по какой-то причине он не подписывается на событие SC_Axe.
Я попытался выполнить отладку до начала CollectableManager, чтобы увидеть, создается ли он с SC_Axe как T. похоже, этого не происходит
Подробнее здесь: https://stackoverflow.com/questions/784 ... lass-event