我需要在运行时创建一组Toggle
,并在其中一个更改时设置一个侦听器。因此,这意味着知道谁更改了。
我看到了如何在用户界面中静态地进行操作,而不是通过编程方式来进行操作,并且很难找到有关此主题的文档。
答案 0 :(得分:3)
Toggle.onValueChanged
事件用于订阅Toggle
事件,以检测何时切换事件。 Toggle.toggle.isOn
用于检查切换的状态。使用AddListener
和delegate
帮助注册切换,以便在切换时获得切换的名称:
public Toggle toggle1;
void OnEnable()
{
//Register Toggle Events
toggle1.onValueChanged.AddListener(delegate
{
ToggleCallValueChanged(toggle1);
});
}
private void ToggleCallValueChanged(Toggle toggle)
{
Debug.Log("Toggle: " + toggle + " is " + toggle.isOn);
}
void OnDisable()
{
//Un-Register Toggle Events
toggle1.onValueChanged.RemoveAllListeners();
}
如果使用多个切换,则还可以重复使用该功能,但可以使用if
语句来确定切换哪个功能。如果切换相关,则执行此操作。这比为每个切换控件创建一个新的回调函数要好。
使用一种功能检测到3个切换的示例:
public Toggle toggle1;
public Toggle toggle2;
public Toggle toggle3;
void OnEnable()
{
//Register Toggle Events
toggle1.onValueChanged.AddListener(delegate { ToggleCallBack(toggle1); });
toggle2.onValueChanged.AddListener(delegate { ToggleCallBack(toggle2); });
toggle3.onValueChanged.AddListener(delegate { ToggleCallBack(toggle3); });
}
private void ToggleCallBack(Toggle toggle)
{
if (toggle == toggle1)
{
//Your code for Toggle 1
Debug.Log("Toggled: " + toggle1.name);
}
if (toggle == toggle2)
{
//Your code for Toggle 2
Debug.Log("Toggled: " + toggle2.name);
}
if (toggle == toggle3)
{
//Your code for Toggle 3
Debug.Log("Toggled: " + toggle3.name);
}
}
void OnDisable()
{
//Un-Register Toggle Events
toggle1.onValueChanged.RemoveAllListeners();
toggle2.onValueChanged.RemoveAllListeners();
toggle3.onValueChanged.RemoveAllListeners();
}
答案 1 :(得分:0)
您可以使用所谓的Observer pattern。这就是许多 events 工作系统。
基本上,您创建的每个切换器都可以发送一些事件“我被切换”(给已订阅它的某个对象提供一些ID,名称,值等...)。
它还具有“订阅”或“附加”功能,该功能允许任何对象在运行时对其进行订阅。
订阅时,您提供一个回调函数(如果您已经听说过该术语,可以调用该函数和 event handler )。
使用切换功能时将发生该功能:它将仅查看已订阅该功能的对象列表,并在每个对象上调用回调。这就是切换器传达事件的方式。
基本上,在您的情况下,您可能会拥有一个简单的控制器,该控制器将订阅切换。该控制器可以(但不一定)是最初创建切换的类。
整个模式很有用,因为绝对不需要切换器彼此之间或在其代码中了解控制器(低耦合)。而且,您不必经常检查是否有任何更改,仅在相关时才正确发送“信息”。
有关可能的实现,请参见Programmers's answer。