【问题标题】:Unity3d c#. onClick.AddListener() works onceunity3d c#. onClick.AddListener() 工作一次
【发布时间】:2016-07-17 11:15:01
【问题描述】:

脚本中有一个空白,它会重新加载 Canvas。 Canvas 包含 Button 对象。我将 reload void 与脚本一起附加。

using UnityEngine;
using UnityEngine.UI;

public class Trashscript : MonoBehaviour {

   public GameObject Temp;
   private GameObject Active;
   int Counter;

   void Start()
   {
       Menu();
   }

  void Menu()
   {
       Counter++;

       if (Active != null) Destroy(Active);
       Active = Instantiate(Temp);

       GameObject.Find("Text").GetComponent<Text>().text = Counter.ToString();
       GameObject.Find("Btn").GetComponent<Button>().onClick.AddListener(Menu);
   }
}

第一次调用(来自Start)工作正常,“文本”元素显示“1”。单击“Btn”后画布重新加载,但没有任何“文本”,并且“Btn”不起作用(onClick 事件不执行任何操作)。

帮助。

【问题讨论】:

  • 我不知道统一,但这可能是因为您的 Menu() 正在向自己读取事件。尝试只添加一个监听器

标签: c# button canvas unity3d


【解决方案1】:

我不知道您的代码在做什么,但是每次单击 Button 时,都会调用 Menu 函数,这会导致再次调用 GetComponent&lt;Button&gt;().onClick.AddListener(Menu)

您必须将GetComponent&lt;Button&gt;().onClick.AddListener(Menu) 移出Munu 函数并移入Start() 函数。您还必须在OnDisable() 函数中取消注册Button 事件。

您的代码应如下所示:

Button button;

void Start()
{
    button = GameObject.Find("Btn").GetComponent<Button>();
    button.onClick.AddListener(Menu);
}

void OnDisable()
{
    button.onClick.RemoveListener(Menu);
}

void Menu()
{
    ///Put Your Button click code here

}

【讨论】:

  • 明白,但每次点击按钮我都需要重新创建“菜单”对象。
【解决方案2】:

我通过将GameObject.Find("") 更改为Active.transform.Find("") 解决了我的问题。

【讨论】:

    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 2018-06-22
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多