如何从预制件中获取场景中游戏对象的引用

问题描述 投票:1回答:1

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

现在实例化游戏对象(Prefab)我遇到了在实例化它时忽略引用的错误,我在此之前已经查看过各种其他文章,例如此讨论:

但是我正在寻找除了使用Tags之外的其他方法,因为这个系统可能会使用大量标签来降低游戏性能,有人会知道不同的方法来保存从场景到预制件的引用吗?

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

我试图保存的参考文件是附加到我的预制件的脚本中的三个变换元素,它们如下所示

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

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

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

感谢您花时间阅读,任何建议都会得到极大的赞赏!

任何问题只是问!

c# unity3d instance gameobject
1个回答
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类,该类可以将这些信息提供给需要它的其他对象。

© www.soinside.com 2019 - 2024. All rights reserved.