如何在一帧内对多个GameObject使用“ OnClick.AddListener”

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

我对Unity和C#脚本非常陌生。

在我的场景中,我有四个按钮。我在脚本中将它们声明为公共,并通过拖放将检查器(放在Button类型上)统一放在检查器中。根据要单击哪个按钮,我希望我的程序执行某些操作。您可以在下面的脚本中看到我所做的事情。该脚本可以像我想要的那样完美地工作。

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Example : MonoBehaviour
{
    public Button Left;
    public Button Right;
    public Button Starten;
    public Button Zurueck;

    private void Start()
    { 
        loadRezept(0);
        Right.onClick.AddListener(iterationUp);
        Left.onClick.AddListener(iterationDown);
        Starten.onClick.AddListener(starten);
        Zurueck.onClick.AddListener(zurueck);
    }


... (here are the methods "iterationUp" and so on...)

此脚本运行完美。但是现在我有一个问题:在使用游戏对象时该如何做?

[如果我只是将类型“ Button”更改为“ GameObject”,则无法使用“ onClick.AddListener”。我不希望每个游戏对象都有一个脚本。我只想要类似我上面发布的内容。

c# unity3d gameobject
1个回答
0
投票

GameObject本身没有此类事件。


听起来像您想要的是自定义UnityEvent

您可以创建自己的组件,例如。

UnityEvent

您现在可以在其中通过代码或通过检查器添加侦听器(就像public class HighlightController : MonoBehaviour { public UnityEvent OnHighlight; // Somewhere Invoke the event e.g. public void SetHighlighted() { OnHighlight.Invoke(); } } 一样。

因此将其放在您的onClicked上,然后例如有类似

的字段
GameObject

或者是提到的简单的[SerializeField] private HighlightController highlight; //etc... private void Awake() { highlight.OnHighlight.AddListener(HandleHighlight); //etc... } private void HandleHighlight () { ... } // Make sure to cleanup listeners when not needed anymore private void OnDestroy() { highlight.OnHighlight.RemoveListener(HandleHighlight); //etc... } ,可以在不进行序列化的情况下执行相同的操作:

event

和做

public class HighlightController : MonoBehaviour
{
    public event Action OnHighlight;

    public void SetHighlighted ()
    {
        OnHighlight?.Invoke();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.