gpt4 book ai didi

c# - Unity3d - 在另一个脚本中定义事件

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:57 25 4
gpt4 key购买 nike

假设我想向下拉元素的 OnSelect() 事件添加功能。

通常我会向特定的下拉游戏对象添加一个新脚本:

Dropdown script

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method.
{
//Do this when the selectable UI object is selected.
public void OnSelect(BaseEventData eventData)
{
Debug.Log(this.gameObject.name + " was selected");
}
}

提示:如果下拉菜单被选中,脚本将简单地输出一条消息。


问题:是否可以在另一个脚本中定义功能?例如。我有一个脚本附加到主父“Menue”,我在其中引用这个特定的下拉游戏对象。

如何在另一个脚本中定义 OnSelect

PS:这是问这个问题的正确地点,还是我应该在 gamedevelopement 上问这个问题?

最佳答案

使用事件和委托(delegate)。您可以找到该内容的简化教程 here如果这对您来说是新的。

应该是这样的:

public delegate void SelectAction(GameObject target);
public static event SelectAction OnSelectedEvent;

将其添加到您的 LanguageDropdown 脚本中,您应该得到:

public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method.
{
public delegate void SelectAction(GameObject target);
public static event SelectAction OnSelectedEvent;

//Do this when the selectable UI object is selected.
public void OnSelect(BaseEventData eventData)
{
Debug.Log(this.gameObject.name + " was selected");

//Invoke Event
if (OnSelectedEvent != null)
{
OnSelectedEvent(this.gameObject);
}
}
}

现在,您可以从另一个脚本分别在 OnEnableOnDisable 函数中订阅和取消订阅事件:

void OnEnable()
{
//subscribe to event
LanguageDropdown.OnSelectedEvent += SelectAction;
}

void OnDisable()
{
//Un-subscribe to event
LanguageDropdown.OnSelectedEvent -= SelectAction;
}

//This will be called when invoked
void SelectAction(GameObject target)
{
Debug.Log(target.name + " was selected");
}

Basically I wanted to know if I am forced to attach the script LanguageDropdown to the gameobject, or If this is not required and I can setup everything from another script which is not attached to that specific dropdown.

不,您可以使用 EventTrigger 类来注册如下事件,而不必将其附加到每个对象:

EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.Select;
entry.callback.AddListener((eventData) => { SelectAction(); });

不要使用它。它很慢,我也从多人那里验证了这一点。

关于c# - Unity3d - 在另一个脚本中定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47039795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com