Unity中使用Instantiate添加对象到父物体时如何正确转换坐标?
解决Unity实例化对象时局部坐标/世界坐标转换问题
- 问题核心:Unity的
Instantiate重载方法中,若直接指定父物体,传入的position会被识别为父物体的局部坐标;但手动拖动物体到父物体下时,Unity会自动保留物体的世界位置,并同步转换为父物体的局部坐标。要实现和手动拖拽一致的效果,有两种直接方案:
方法一:先实例化再设置父物体(逻辑更直观,推荐)
先以目标世界坐标实例化对象,再设置父物体并保持世界位置不变:
// 按设定的世界坐标实例化,暂不指定父物体 GameObject targetClone = Instantiate(LeftTargetPrefab, new Vector3(10f, 10f, 10f), Quaternion.identity); // 设置父物体,同时保持当前世界位置(第二个参数设为true) targetClone.transform.SetParent(BallTargets.transform, worldPositionStays: true);
这么处理后,对象会保持你设定的(10,10,10)世界位置,同时自动转换为BallTargets的局部坐标,和手动拖拽的效果完全一致。
方法二:提前转换坐标再实例化
先把目标世界坐标转换成BallTargets的局部坐标,再用带父物体的重载方法实例化:
// 将目标世界坐标转换为BallTargets的局部坐标 Vector3 localPosition = BallTargets.transform.InverseTransformPoint(new Vector3(10f, 10f, 10f)); // 以计算好的局部坐标实例化并绑定父物体 GameObject targetClone = Instantiate(LeftTargetPrefab, localPosition, Quaternion.identity, BallTargets.transform);
该方法提前算出对应局部坐标,直接传入实例化方法,最终效果和方法一相同。
内容的提问来源于stack exchange,提问作者Operator
相关产品推荐
相关产品推荐

