-1

实例化后,我无法将两个按钮分配给预制件。按钮在场景中,我不知道如何分配它们。拖放当然不起作用。我对此很清楚。当我做类似的东西时

btnnext = GameObject.Find("Next").GetComponent<Button>();

在 Prefabs 脚本的 Start() 函数中它也不起作用。

还有其他解决方法吗?

4

2 回答 2

0

正如@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方法。

于 2021-12-23T13:40:53.057 回答
-1

“也不起作用”是指btnnextnull 还是.GetComponent<Button>()抛出异常?第一种情况意味着找到的名为“Next”的对象上没有 Button 组件。您可以检查您是否期望它具有 Button 组件或者可能略有不同。您还可以拥有多个名为“Next”的对象,而您得到的对象不是您期望得到的对象。第二种情况意味着您的对象很可能处于非活动状态。Find(string)不在非活动对象中搜索。

话虽这么说 -Find(string)在任何方面都不可靠,我建议避免它(它也非常慢)。相反,我会创建一个脚本以放置在带有按钮的对象上。在该Awake()方法的脚本内部,我会将 Button 组件的实例分配给某种公共静态字段,以便其他脚本稍后可以拾取它(如果您正在处理两个按钮,它可能是一个列表或两个单独的字段。取决于你的情况,我猜)。

于 2021-12-23T12:26:42.697 回答