如何在一帧中对多个游戏对象使用“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
)。
所以把它放在你的GameObject
s 然后例如有像
[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”的主要内容,如果未能解决你的问题,请参考以下文章