我想我遇到了一个非常基本的问题。 基本上我试图创建一个名为 GameEvent 的可编写脚本的对象类。该 SO 包含一个 UnityEvent。 这个想法是将场景中不同脚本的一堆方法与其关联起来。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
[CreateAssetMenu(fileName = "GameEvent", menuName = "CardEmpires/GameEvent", order = 1)]
public class GameEventSO : ScriptableObject
{
[SerializeField] UnityEvent unityEvent;
游戏结束事件 (GameEventSO) 现在,显然我缺少一些有关可编写脚本的对象如何工作的信息,因为我无法将游戏对象或脚本拖到统一事件列表中。 我也尝试过在可编写脚本的对象内创建游戏对象列表,但遇到了同样的问题:我无法从场景中拖动游戏对象。 现在有人能解决这个问题吗?我错过了什么吗?可编写脚本的对象不是为此而设计的吗? 谢谢你!
正如评论中已经提到的
资产不能引用场景对象
此类事件 SO 的想法实际上是相反的:
您有该活动的订阅者,例如
public class Subscriber : MonoBeuaviour
{
[SerializeField] GameEventSO someEvent;
void Awake()
{
someEvent.unityEvent.AddListener(Something);
}
private void Something()
{
Debug.Log("Hello!");
}
void OnDestroy()
{
someEvent.unityEvent.RemoveListener(Something);
}
}
然后在某个地方你有一个调用者
public class Invoker : MonoBehaviour
{
[SerializeField] GameEventSO someEvent;
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
someEvent.unityEvent.Invoke();
}
}
}
为此,尽管您不想/不需要在检查器中公开该事件,而是拥有它,但它完全可以工作
public UnityEvent unityEvent;
但是,我个人根本不会使用
UnityEvent
来实现这个目的。这实际上只是当您想在检查器中公开它时。
而是使用合适的
public event Action Event;
public void Invoke()
{
Event?.Invoke();
}
并通过
订阅/订阅someEvent.Event -= Something;
someEvent.Event += Something;