Unity 2D中旋转父物体使子物体朝向目标点的问题
Unity 2D 父物体旋转使子物体朝向目标点的正确实现
原代码的核心问题是用了父物体到目标点的方向计算旋转,而非子物体到目标点的方向,且偏移量的计算没有抓住本质——子物体相对于父物体的局部旋转是固定值,无需实时计算父子轴的夹角。
直接用以下代码即可解决子物体位置非零时的问题:
// 计算子物体到目标点的方向向量(归一化) Vector3 childToTarget = (targetPoint - child.transform.position).normalized; // 计算子物体朝向目标所需的世界空间Z轴旋转角度 float targetAngle = Mathf.Atan2(childToTarget.y, childToTarget.x) * Mathf.Rad2Deg; // 获取子物体相对于父物体的局部Z旋转角度(这是固定值,可提前缓存提升性能) float childLocalRotZ = child.transform.localEulerAngles.z; // 父物体需要的最终Z轴旋转角度:目标角度减去子物体的局部旋转 float parentRotZ = targetAngle - childLocalRotZ; // 应用旋转到父物体 transform.rotation = Quaternion.Euler(0, 0, parentRotZ);
代码说明:
- 我们需要让子物体的朝向指向目标,因此必须以子物体的位置为起点计算目标方向,而非父物体位置。
- 子物体的世界空间旋转角度 = 父物体旋转角度 + 子物体局部旋转角度,因此反向推导即可得到父物体需要的旋转角度。
- 子物体的局部旋转是固定值(除非你动态修改子物体的局部旋转),可以提前缓存到
Start()方法中,避免每帧重复计算。
如果你的子物体朝向不是基于right轴(比如用up轴作为朝向),只需要调整targetAngle的计算:将Mathf.Atan2(childToTarget.y, childToTarget.x)替换为Mathf.Atan2(childToTarget.x, -childToTarget.y)(对应up轴指向目标的角度)。
内容的提问来源于stack exchange,提问作者s_marcell
相关产品推荐
相关产品推荐

