目前我正在开发一个设备系统,它将从列表中将游戏对象实例化到场景中,在此之前,我没有使用实例化系统,只是让游戏对象始终处于活动状态。
现在实例化游戏对象(Prefab)我遇到了在实例化它时忽略引用的错误,我在此之前已经查看过各种其他文章,例如此讨论:
但是我正在寻找除了使用Tags之外的其他方法,因为这个系统可能会使用大量标签来降低游戏性能,有人会知道不同的方法来保存从场景到预制件的引用吗?
因此,这是一个新系统,我真的只是在寻找关于如何将场景游戏对象的引用保存到预制件中的建议,因为我的旧系统只是将场景中的游戏对象保持活动而不是实际实例化它们我很想听到不同类型的方法,而不仅仅是使用标签。
我试图保存的参考文件是附加到我的预制件的脚本中的三个变换元素,它们如下所示
public Transform camPos;
public Transform aimLocation;
public Transform crosshairLocation;
目前我只是将游戏对象从场景拖放到脚本中的公共字段中
由于这将是一个主要系统,我不想使用此系统的标签。但它绝对是一个有效的选项我只是在寻找其他方法来保存场景游戏对象的引用到预制件当实例化预制件进入场景时,
感谢您花时间阅读,任何建议都会得到极大的赞赏!
任何问题只是问!
您无法在预制件中保存场景参考,原因很明显(如果您将预制件实例化到另一个场景会发生什么?)。您的预制件需要在实例化后发现所需的对象。我不是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类,该类可以将这些信息提供给需要它的其他对象。