在运行时创建的哪个切换已在Unity中调用?

时间:2018-08-01 14:39:36

标签: c# unity3d

我需要在运行时创建一组Toggle,并在其中一个更改时设置一个侦听器。因此,这意味着知道谁更改了。

我看到了如何在用户界面中静态地进行操作,而不是通过编程方式来进行操作,并且很难找到有关此主题的文档。

2 个答案:

答案 0 :(得分:3)

Toggle.onValueChanged事件用于订阅Toggle事件,以检测何时切换事件。 Toggle.toggle.isOn用于检查切换的状态。使用AddListenerdelegate帮助注册切换,以便在切换时获得切换的名称:

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