Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从预设中获取场景中游戏对象的引用_C#_Unity3d_Instance_Gameobject - Fatal编程技术网

C# 如何从预设中获取场景中游戏对象的引用

C# 如何从预设中获取场景中游戏对象的引用,c#,unity3d,instance,gameobject,C#,Unity3d,Instance,Gameobject,目前,我正在开发一个设备系统,该系统将从列表中将游戏对象实例化到场景中,在此之前,我没有使用实例化系统,只是始终保持游戏对象在场景中处于活动状态 现在,在实例化游戏对象(预置)时,我遇到了在实例化它们时丢失引用的错误,我已经看过了前面的其他文章,比如这里的讨论: 然而,我正在寻找使用标签以外的其他方法,因为该系统可能会使用大量标签,从而降低游戏性能,是否有人知道将场景中的引用保存到预设中的不同方法 由于这是一个新的系统,我真的只是在寻找如何将场景游戏对象的引用保存到预制件中的建议,因为我的旧系统

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

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

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

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

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

public-Transform-camPos;
公共场所;
公共场所;
目前,我只是将游戏对象从场景拖放到脚本中的公共字段中

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

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

有问题尽管问吧

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

  • 如果每种变换都只有一个,则进行所需的变换(cam位置、目标位置等)。您可以为每个类专门创建一个脚本类,将该类设置为单例,并将其放在游戏对象上。然后,在实例化预置之后,可以执行如下操作:
    camPos=camPos.Instance.transform您可以阅读单例模式

  • 如果每个游戏都有多个对象,则将所有相关对象分组到一个层次结构中(即,使它们都成为单个游戏对象的子对象)。例如,如果有许多角色,并且每个角色都有一个单独的目标位置,则可以将目标位置设置为角色游戏对象的子对象。然后,在预置中(注意使预置也成为同一根游戏对象的子对象),可以按照以下方式执行:
    camPos=transform.root.getComponentChildren().transform更好的是,您可以拥有一个引用了所有此类对象的组件,并将其附加到根游戏对象。然后,您可以执行以下操作:
    camPos=transform.root.GetComponent().camPos

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

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

    预置不能包含场景引用(因为在调用
    实例化时它们可能不存在)。第二,
    Instantiate
    返回对派生实例的引用。