如何在一帧中对多个游戏对象使用“OnClick.AddListener”

Posted

技术标签:

【中文标题】如何在一帧中对多个游戏对象使用“OnClick.AddListener”【英文标题】:How to use "OnClick.AddListener" on multiple GameObjects in one Frame 【发布时间】: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”。我不想要每个游戏对象的脚本。我只想要上面发布的内容。

【问题讨论】:

循环遍历对象? 为什么要 GameObject? @derHugo:我正在使用 myo 臂章 (neurosciencenews.com/shop/neuroscience-clothing/…),我需要类似“Highlight”功能的东西来显示将选择哪个对象。 【参考方案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 也可以;)

以上是关于如何在一帧中对多个游戏对象使用“OnClick.AddListener”的主要内容,如果未能解决你的问题,请参考以下文章

XMLSocket 可以在一帧中多次发送吗?

unity检查函数是否在一帧中执行

如何从下一帧 AS3 中引用对象

Android - 如何减慢电池消耗

目标跟踪(3)MultiTracker : 基于 OpenCV (C++/Python) 的多目标跟踪

单击一帧中的链接并在另一帧中显示 JSP