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
Unity3d 未在预期位置实例化Unity预置_Unity3d_Navigation_Transform_Unity5 - Fatal编程技术网

Unity3d 未在预期位置实例化Unity预置

Unity3d 未在预期位置实例化Unity预置,unity3d,navigation,transform,unity5,Unity3d,Navigation,Transform,Unity5,你好,stackoverflow社区。 我有一个脚本正在实例化NPC的位置,这些位置保存在一个特殊的列表中。NPC预制件上确实有一个NavMesh代理,并放置在普通的NavMesh上。在实例化预置之后,我将父对象以及新对象的位置和旋转设置为一个名为“DynamicObjects”的空对象(仅用于在场景视图中分组)。父变换处于0/0/0且旋转为零,因此设置法线位置应该没有问题。问题是,对象不是在给定坐标处创建的。例如,给定位置为193/6.2/87,但NPC将位于170/6.4/87,而不是193

你好,stackoverflow社区。
我有一个脚本正在实例化NPC的位置,这些位置保存在一个特殊的列表中。NPC预制件上确实有一个NavMesh代理,并放置在普通的NavMesh上。在实例化预置之后,我将父对象以及新对象的位置和旋转设置为一个名为“DynamicObjects”的空对象(仅用于在场景视图中分组)。父变换处于0/0/0且旋转为零,因此设置法线位置应该没有问题。问题是,对象不是在给定坐标处创建的。例如,给定位置为193/6.2/87,但NPC将位于170/6.4/87,而不是193/6.2/87。
以下是我的脚本(详细说明如下):

GameObject npcPrefab=Resources.Load(“prefables/NPC/NPC_default”);
foreach(NPC_包装中的NPC_包装){
if(wrapper.position.map!=mapID)
继续;
GameObject npcObject=实例化(npcPrefab);
npcObject.transform.SetParent(dynamicbjects);
NPCBase NPCBase=npcObject.GetComponent();
SetPosition(新向量3(wrapper.position.x,wrapper.position.y,wrapper.position.z));
SetRotation(新向量3(wrapper.position.rotX、wrapper.position.rotY、wrapper.position.rotZ));
npcBase.SetEntityID(wrapper.npcID);
npcBase.SetWorldPosition(wrapper.position);
Debug.Log(“在“+wrapper.position.x+”/“+wrapper.position.y+”/“+wrapper.position.z”处生成NPC“+wrapper.npcID+”);
}
说明:
第一步是装载预制件。我有一个包含NPC_包装器对象的列表。这些包装纸包含NPC的位置。我检查每个NPC,如果它在此地图(mapID)中。如果在这个映射中,我实例化预置并将父对象设置为dynamicObjects(我的空对象的转换)。现在,我从实例化的对象中获取NPCBase类,并使用SetPosition和SetRotation方法设置transform.position和transform.rotation(它只是这样做,但在NPCBase类中)。SetEntityID和SetWorldPosition没有效果,因此我们可以跳过它们。当我完成时,我将其位置记录到控制台上。虽然我设置了正确的坐标,但游戏对象不会位于wrapper.position.xyz中的位置

我尝试过的:

  • 将transform.position替换为transform.localPosition
  • 使用NavMeshAgent.nextPosition而不是transform.position
  • 设置为0/0/0(似乎工作正常)
  • 实例化而不设置父级(无差异)
  • 直接在此方法内设置位置:npcObject.transform.position=。。。(没有区别)
  • 搜索互联网和本论坛(但找不到好的答案或解决我问题的答案)
我试着自己解决了一段时间,但我真的很沮丧,所以我想问问是否有人知道问题出在哪里。

提前谢谢你,我很乐意回答任何问题

好吧,经过两天的调试,我终于明白了

因此,实例化的游戏对象上有一个NavMeshAgent。我实例化了它,并将位置设置为我想要的位置。问题是,NavMeshAgent会在繁殖后的第一帧中更改游戏对象的位置。这是因为,尽管对象位于有效的NavMesh上,代理仍会以某种方式调整其初始位置

我是如何修复的:
老实说,像这样的大多数问题都有相当简单的解决方案。在这种情况下,不要使用transform.position=newVector设置对象的位置,而是使用navmeshagent.Warp(newVector)。这在所有测试案例中都可以正常工作。

希望其他有此问题的人也能从中获益:)

您需要发布SetPosition和SetRotation的代码
public virtual void SetPosition(Vector3 newPosition){transform.position=newPosition;}public virtual void SetRotation(Vector3 newRotation){transform.eulerAngles=newRotation;}
好的,很公平。调用SetPosition后立即记录包装器位置和npcbase位置,对SetRotation执行相同的操作。如果SetEntityID和SetWorldPosition没有执行任何操作,则删除对它们的调用。您确定是代理执行此操作,而不是参数吗?非常确定,因为我没有立即更改此参数ll,但对定位方法的更改起到了作用。您没有更改参数,UNITY更改了。默认值为
true
,这与以前的默认行为相反。如果根本不传递参数,则使用的是默认值。您必须传递false或被迫手动修改
localPosition
值。
GameObject npcPrefab = Resources.Load<GameObject>("Prefabs/NPC/NPC_default");
foreach (NPC_Wrapper wrapper in npc_wrappers) {
    if (wrapper.position.map != mapID)
        continue;

    GameObject npcObject = Instantiate(npcPrefab);
    npcObject.transform.SetParent(dynamicObjects);

    NPCBase npcBase = npcObject.GetComponent<NPCBase>();
    npcBase.SetPosition(new Vector3(wrapper.position.x, wrapper.position.y, wrapper.position.z));
    npcBase.SetRotation(new Vector3(wrapper.position.rotX, wrapper.position.rotY, wrapper.position.rotZ));
    npcBase.SetEntityID(wrapper.npcID);
    npcBase.SetWorldPosition(wrapper.position);

    Debug.Log("Spawn NPC " + wrapper.npcID + " at " + wrapper.position.x + "/" + wrapper.position.y + "/" + wrapper.position.z);
}