可编写脚本的对象中的 UnityEvent

问题描述 投票:0回答:1

我想我遇到了一个非常基本的问题。 基本上我试图创建一个名为 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) 现在,显然我缺少一些有关可编写脚本的对象如何工作的信息,因为我无法将游戏对象或脚本拖到统一事件列表中。 我也尝试过在可编写脚本的对象内创建游戏对象列表,但遇到了同样的问题:我无法从场景中拖动游戏对象。 现在有人能解决这个问题吗?我错过了什么吗?可编写脚本的对象不是为此而设计的吗? 谢谢你!

unity-game-engine events scriptable-object
1个回答
0
投票

正如评论中已经提到的

资产不能引用场景对象

此类事件 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;
© www.soinside.com 2019 - 2024. All rights reserved.