【问题标题】:How to access a script after object has spawned?对象生成后如何访问脚本?
【发布时间】:2016-08-06 05:57:41
【问题描述】:

在统一多人游戏中,玩家预制件在场景加载后生成,声明所需脚本并避免 NullReferenceException 错误的最佳方法是什么?

【问题讨论】:

    标签: networking unity3d unity5 unity3d-unet


    【解决方案1】:

    我自己对多人游戏不是很熟悉,但我相信这可以通过 GameObject.Find("") 和 GetComponent 来完成。 我还偶然发现了FindObjectOfType。我不确定这是否是你要找的,但发布它并没有什么坏处。祝你好运。

    【讨论】:

      【解决方案2】:

      与其让脚本查找预制件何时生成,为什么不让预制件告诉脚本它已生成?

      当没有指定用例时,很难给出任何类型的示例。

      非常基本的示例(并且由于您要将其用于网络,因此您可能必须重做很多,以免您过分信任客户端):

      class ScriptA : Monobehaviour () {
          List<GameObject> prefabs;
      
          public void AddPrefab (GameObject Prefab) {
              prefabs.Add (Prefab) 
          }
      }
      
      class Prefab : Monobehaviour () {
          void Start () {
              FindObjectOfType(ScriptA).AddPrefab(gameObject);
          }
      }
      

      这不是最好的例子,但重点是,您可能需要重新考虑架构

      【讨论】:

      • 我无法真正改变 Unity 5 在多人游戏中生成的方式(a. 以我的知识水平或 b. 没有自定义脚本。播放器是预制件,一个例子是玩家与给玩家 10 分的硬币进行交互,例如分数系统将在玩家身上并且硬币已经在场景中。当关卡加载时,硬币上会出现空异常错误,因为它不能找到它试图改变的评分系统。
      • 这听起来仍然像是一个架构问题,为什么硬币必须访问分数系统,而它只是应该在与玩家互动时改变玩家的个人分数。我的做法是,当玩家与硬币交互时,它会调用 GiveMePoints() 方法,该方法返回硬币的价值,然后玩家将其添加到分数中。
      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 2016-05-03
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多