我对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”。我不希望每个游戏对象都有一个脚本。我只想要类似我上面发布的内容。
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();
}
}