【发布时间】:2021-12-23 12:01:41
【问题描述】:
实例化后,我无法将两个按钮分配给预制件。 按钮在场景中,我不知道如何分配它们。 拖放当然不起作用。我对此很清楚。 当我做类似的东西时
btnnext = GameObject.Find("Next").GetComponent<Button>();
在 Prefabs 脚本的 Start() 函数中它也不起作用。
还有其他解决方法吗?
【问题讨论】:
实例化后,我无法将两个按钮分配给预制件。 按钮在场景中,我不知道如何分配它们。 拖放当然不起作用。我对此很清楚。 当我做类似的东西时
btnnext = GameObject.Find("Next").GetComponent<Button>();
在 Prefabs 脚本的 Start() 函数中它也不起作用。
还有其他解决方法吗?
【问题讨论】:
正如@slowikowskiarkadiusz 所说,GameObject.Find 不是最佳解决方案,因为它速度慢且容易出错。但是有一个简单的解决方案。
在预制件上的脚本上创建一个公共函数,称为 AssignButton:
class ScriptOnPrefab : MonoBehaviour {
public void AssignButton(Button button) {
btnnext = button;
}
}
在实例化预制件的脚本中,然后链接按钮并分配它们:
var instance = Instantiate(prefab);
var scriptOnPrefab = instance.GetComponent<ScriptOnPrefab>();
scriptOnPrefab.AssignButton(button);
注意:要使ScriptOnPrefab 必须位于预制件的根部,请注意子对象。
注意:prefab 链接为GameObject。
注意:如果您将预制件链接为ScriptOnPrefab,您可以跳过GetComponent 步骤并立即调用Assign 方法。
【讨论】:
“也不起作用”是指btnnext 为空,还是说.GetComponent<Button>() 抛出异常?第一种情况意味着找到的名为“Next”的对象上没有 Button 组件。您可以检查您是否期望它具有 Button 组件或者可能略有不同。您还可以拥有多个名为“Next”的对象,而您得到的对象不是您期望得到的对象。第二种情况意味着您的对象很可能处于非活动状态。 Find(string) 不在非活动对象中搜索。
话虽如此 - Find(string) 在任何方面都不可靠,我建议避免它(它也非常慢)。相反,我会创建一个脚本以放置在带有按钮的对象上。在 Awake() 方法中的该脚本内部,我会将 Button 组件的实例分配给某种公共静态字段,以便其他脚本稍后可以拾取它(如果您正在处理两个按钮,它可能是一个列表或两个单独的字段。取决于你的情况,我猜)。
【讨论】:
onClick。您可以使用button.onClick.AddListener(()=>{<<stuff you want to be exectuted>>}) 或button.onClick.AddListener(someObject.SomeMethod)。第二个更好,因为你可以使用相同的参数调用button.onClick.RemoveListener(someObject.SomeMethod)。