【问题标题】:How can I grab a reference of a game-object in a scene from a prefab如何从预制件中获取场景中游戏对象的引用
【发布时间】:2019-04-20 02:03:08
【问题描述】:

目前我正在开发一个设备系统,该系统会将游戏对象从列表中实例化到场景中,在此之前我没有使用实例化系统,只是始终保持游戏对象在场景中处于活动状态。

现在在实例化游戏对象(预制件)时,我在实例化它们时遇到了丢失引用的错误,我之前看过其他各种文章,例如这里的讨论:

但是,我正在寻找使用标签以外的其他方法,因为该系统可能会使用大量标签,从而降低游戏性能加班,有人知道将场景中的引用保存到预制件中的不同方法吗?

因此,由于这是一个新系统,我真的只是在寻找有关如何将场景游戏对象的引用保存到预制件中的建议,因为我的旧系统只是在场景中保持游戏对象处于活动状态,而不是实际实例化它们,我再次希望听到不同类型的方法,而不仅仅是使用标签。

我试图保存的参考是附加到我的 Prefab 的脚本中的三个变换元素,它们如下

    public Transform camPos;
    public Transform aimLocation;
    public Transform crosshairLocation;

目前我只是将游戏对象从场景中拖放到脚本中的公共字段中

由于这将是一个主要系统,我不想为这个系统使用标签。但这绝对是一个有效的选择我只是在寻找将场景游戏对象的引用保存到预制件中的其他方法在将预制件实例化到场景中时,

感谢您抽出宝贵时间阅读,我们将不胜感激任何建议!

任何问题都可以问!

【问题讨论】:

  • 预制件不能包含场景引用(因为在您调用 Instantiate 时它们可能不存在)。二、Instantiate 返回对生成实例的引用。

标签: c# unity3d instance gameobject


【解决方案1】:

您可以在预制件中保存场景引用,原因很明显(如果您将该预制件实例化到另一个场景中会发生什么?)。您的预制件需要在实例化后发现它需要的对象。我不是 Unity 中标签系统的忠实粉丝(或任何其他使用字符串作为标识符的系统,错误空间太大)。我建议您采用以下三种方法中的任何一种:

  1. 将您需要的变换(凸轮位置、瞄准位置等)制作成单例,如果每一个都只有一个的话。您需要为每个类专门创建一个脚本类,使该类成为单例,并将其放在游戏对象上。然后,在您的预制件被实例化后,您可以执行以下操作:camPos = CamPos.Instance.transform; 您可以阅读单例模式here

  2. 如果每个对象不止一个,请将所有相关对象分组到一个层次结构中(即,将它们全部设为单个游戏对象的子对象)。例如,如果有很多角色并且每个角色都有一个单独的瞄准位置,您可以将瞄准位置作为角色游戏对象的子对象。然后,在您的预制件中(注意使预制件也成为同一个根游戏对象的子对象),您可以按照以下方式进行操作:camPos = transform.root.GetComponentInChildren<CamPos>().transform; 更好的是,您可以拥有一个引用所有此类对象的组件,并将一个附加到根游戏对象。然后,你可以这样做:camPos = transform.root.GetComponent<ReferenceRepository>().CamPos;

  3. 在实例化预制件时对其进行初始化。例如,假设您有一个实例化武器的玩家类,并且已经引用了 camPos。您可以这样做:var weapon = Instantiate<Weapon>(myWeaponPrefab); weapon.CamPos = camPos; 但是请注意,当您以这种方式分配公共字段时,只有在调用 Start 时才能访问它们。换句话说,它们在Awake 中不可用。

也就是说,我不认为将目标位置和十字准线位置这样的东西分开是一个很好的主意。您应该有一个 player/human/pawn 类,并且该类可以将此信息提供给需要它的其他对象。

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 2017-12-30
    • 2020-01-31
    • 2022-10-18
    • 1970-01-01
    • 2022-08-23
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多