【问题标题】:Unity - Assign Button in Scene to PrefabUnity - 将场景中的按钮分配给预制件
【发布时间】:2021-12-23 12:01:41
【问题描述】:

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

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

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

还有其他解决方法吗?

【问题讨论】:

    标签: c# unity3d button prefab


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我知道这是一个糟糕的解决方案...... :( 只有一个 Button 和 GameObject 被称为“Next”,这个 Button 应该有一个功能,但是当它被按下时它什么也不做。我不能t帮助自己..
      • 哦,你想在点击时调用一个事件。按钮实例上有onClick。您可以使用button.onClick.AddListener(()=&gt;{&lt;&lt;stuff you want to be exectuted&gt;&gt;}) 或button.onClick.AddListener(someObject.SomeMethod)。第二个更好,因为你可以使用相同的参数调用button.onClick.RemoveListener(someObject.SomeMethod)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多