当前,我正在开发一种设备系统,该系统将从列表中实例化游戏对象到场景中,在此之前,我没有使用仅在游戏场景中始终保持游戏对象处于活动状态的实例化系统。
现在实例化游戏对象(Prefab)时我遇到了在实例化实例时松开引用的错误,我之前看过其他各种文章,例如此处的讨论:
但是我正在寻找使用标签以外的其他方式,因为该系统可能会使用大量标签,从而导致游戏性能随着时间的推移而降低,有人会知道将场景中的引用保存到预制件中的其他方法吗?
因为这是一个新系统,所以我实际上只是在寻找有关如何将场景游戏对象的引用保存到预制件中的建议,因为我的旧系统只是将游戏对象保持在场景中而不实际实例化它们,我很想听听不同类型的方法,不仅仅是使用标签。
我要保存的参考文献是来自附着在我的预制件上的脚本的三个变换元素,它们是以下
public Transform camPos;
public Transform aimLocation;
public Transform crosshairLocation;
目前,我只是将游戏对象从场景中拖放到脚本的公共字段中
由于这将是一个主要系统,因此我不想在该系统上使用标签。但这绝对是一个有效的选择,我只是在寻找将场景游戏对象的引用保存到预制件中的其他方法,当将预制件实例化到场景中时,
感谢您抽出宝贵的时间阅读,任何建议将不胜感激!
任何问题都可以问!
答案 0 :(得分:1)
出于明显的原因(如果您将该预制实例化到另一个场景会发生什么情况?),您可以不将场景参考保存在预制件中。预制后,您的预制件需要发现所需的对象。我不是Unity中的标签系统的忠实拥护者(或者使用字符串作为标识符的任何其他系统,错误的空间都太大了)。我建议您采用以下三种方法之一:
如果只有一个,则使您需要的变换(摄像机位置,目标位置等)成为单例。您将专门为每个脚本类创建一个脚本类,将该类设为单例,然后将其放在游戏对象上。然后,在实例化预制件之后,可以执行以下操作:camPos = CamPos.Instance.transform;
您可以阅读单例模式here。
如果每个对象都不止一个,则将所有相关对象归为一个层次结构(即,使它们成为单个游戏对象的子对象)。例如,如果将有许多角色,并且每个角色都有一个单独的瞄准位置,则可以将瞄准位置作为角色游戏对象的子代。然后,在您的预制件中(注意使预制件也成为同一根游戏对象的子代),您可以按照以下步骤进行操作:camPos = transform.root.GetComponentInChildren<CamPos>().transform;
更好的是,您可以拥有一个引用所有组件的组件。这样的对象,并将一个附加到根游戏对象。然后,您可以执行以下操作:camPos = transform.root.GetComponent<ReferenceRepository>().CamPos;
var weapon = Instantiate<Weapon>(myWeaponPrefab); weapon.CamPos = camPos;
但是请注意,当您以这种方式分配公共字段时,只有在调用Start
后才能访问它们。换句话说,它们在Awake
中不可用。也就是说,我不认为将目标位置和十字线位置这样的对象分开是一个好主意。您应该有一个player / human / pawn类,并且该类可以将此信息提供给需要它的其他对象。