【发布时间】:2016-11-14 13:34:21
【问题描述】:
在运行时使用 Instantiate() 克隆按钮时,该按钮在其 onClick 事件中包含侦听器,克隆中不存在侦听器。
可以通过带有按钮的画布和附加的脚本来测试行为:
void Start () {
var button = transform.GetChild (0);
button.GetComponent<Button> ().onClick.AddListener (new UnityAction(() => Debug.Log("Event triggered!")));
var button2 = Instantiate (button);
button2.SetParent (transform);
}
克隆的按钮在单击时不会向控制台打印任何内容。
有没有办法克隆 GameObject 以便它保留事件侦听器?
【问题讨论】:
-
嗨 Felk - 这是正确且明显的行为。我看不出它如何以其他方式工作。它在
AddListenerdoco 中说得对。我想,您可以编写一个扩展 (intro for any new programmers reading) 来实例化并复制它们。 -
对吗?大概。明显的?不。它确实没有在文档中这么说:
This function adds a "non persistent" delegate, which means it will not show up in the inspector, and will be forgotten when you exit play mode in the editor. -
很公平,你的问题很好,因为它会帮助很多人。我只想说,(对我来说不幸)经常使用 Unity(而不是说,躺在海滩上)这是“它唯一可以工作的明显方式”。我希望这是有道理的。如果在你实例化它时保持它的连接,那将是非常奇怪的;我的意思是,这只是整个系统中一个令人震惊的奇怪功能!我什至无法想象使用它。我的意思是,在你真正做最简单的事情(即“制作任何游戏对象”)之前,你必须编写一套代码来......
-
...否定该功能,你知道的!呵!同样,很容易添加带有一行代码的扩展来执行您在特定情况下所说的操作。 (也只是出于好奇,很难看到很多用例;另一个具有相同功能的按钮。)
-
我的用例只是一个工厂,它生产一些“原始”小部件,这些小部件显示在多个位置(克隆),但它们的点击行为应该相同。
标签: button unity3d listener clone