首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从预制件中获取场景中游戏对象的引用?

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

Stack Overflow用户
提问于 2019-04-20 02:03:08
回答 1查看 3.3K关注 0票数 1

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

现在,通过实例化Game (Prefab),我在实例化引用时遇到了丢失引用的错误,在此之前,我查看了其他各种文章,如本文讨论的内容:

然而,除了使用标签之外,我还在寻找其他方法,因为这个系统可能会使用大量的标签来减少游戏性能的超时,是否有人知道将引用从场景保存到预制件中的不同方法?

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

我试图保存的引用是来自附加到我的预置文件的脚本中的三个转换元素,它们如下

代码语言:javascript
复制
    public Transform camPos;
    public Transform aimLocation;
    public Transform crosshairLocation;

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

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

感谢您抽出时间阅读,如有任何建议将不胜感激!

任何问题只要问!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-20 07:18:26

由于明显的原因,无法在预制件中保存场景引用(如果将预置文件实例化到另一个场景,会发生什么情况?)您的预置文件需要在实例化之后发现它需要的对象。我不太喜欢联合中的标记系统(或者使用字符串作为标识符的任何其他系统,有太多的错误空间)。我建议您采取以下三种方法中的任何一种:

  1. 进行所需的转换(凸轮定位、瞄准位置等)如果每个人中只有一个人的话。您可以为每个类专门创建一个脚本类,使该类成为一个单例类,并将其放在游戏对象上。然后,在您的预置文件实例化之后,您可以这样做:camPos = CamPos.Instance.transform;,您可以在单例模式这里上读取它。
  2. 如果每个对象中有多个,那么将所有相关对象分组到一个层次结构中(也就是说,使它们都成为单个游戏对象的子对象)。例如,如果有许多字符,并且每个字符都有一个单独的目标位置,则可以将目标位置设置为字符游戏对象的子对象。然后,在您的prefab中(也要注意使prefab成为同一个根游戏对象的子对象),您可以这样做:camPos = transform.root.GetComponentInChildren<CamPos>().transform;更好的是,您可以有一个具有对所有这些对象的引用的组件,并将一个组件附加到根游戏对象。然后,您可以这样做:camPos = transform.root.GetComponent<ReferenceRepository>().CamPos;
  3. 初始化预制件时,它们被实例化。例如,假设您有一个player类,它实例化一个武器,并且已经有一个对camPos的引用。您可以这样做:var weapon = Instantiate<Weapon>(myWeaponPrefab); weapon.CamPos = camPos;注意,当您以这种方式分配公共字段时,只有在调用Start之后才能访问它们。换句话说,它们在Awake中是不可用的。

尽管如此,我并不认为制造像目标定位和交叉定位这样的东西是一个非常好的主意。您应该有一个player/人工/典当类,该类可以将此信息提供给其他需要它的对象。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55769633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档