【问题标题】:How to use "OnClick.AddListener" on multiple GameObjects in one Frame如何在一帧中对多个游戏对象使用“OnClick.AddListener”
【发布时间】:2020-09-25 13:15:59
【问题描述】:

我对 Unity 和 C# 脚本还很陌生。

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

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】:

GameObject 本身没有此类事件。


听起来您要求的是自定义UnityEvent

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

public class HighlightController : MonoBehaviour
{
    public UnityEvent OnHighlight;

    // Somewhere Invoke the event e.g.
    public void SetHighlighted()
    {
        OnHighlight.Invoke();
    }
}

您现在可以通过代码或通过 Inspector 添加侦听器(就像 onClicked)。

所以把它放在你的GameObjects 然后例如有像

这样的字段
[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();
    }
}

然后做

private void Awake()
{
    highlight.OnHighlight += HandleHighlight;
}

private void OnDestroy ()
{
    highlight.OnHighlight -= HandleHighlight;
}

【讨论】:

  • 如果不需要在检查器中序列化事件或与之交互,并且侦听器都通过代码添加和删除(如示例中),则 C# 委托或委托对象也足够了。
  • @NSJacob1 是的 .. 或者在这种情况下您可以简单地使用 public event Action .. 但由于 OP 想要类似于 onClick 的东西 UnityEvent 也可以;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多