Unity2D父物体旋转时子物体本地定位异常问题
解决方案
你的问题核心是手动计算本地坐标时没考虑父物体的旋转影响,Unity自带的父子坐标转换可以直接解决这个问题,不用自己做复杂的几何计算。
问题根源
原代码先把Mask设为云朵的子物体,再手动计算localPosition,但这个计算只处理了缩放,完全没考虑旋转。当云朵旋转后,本地坐标系的轴向跟着改变,原来的差值直接除以缩放自然会出现错位。
修改后的代码
public void SpawnGasCloudMask(Transform collisionTransform, Vector2 difference) { GasCloudMaskController selectedGasCloudMask = null; // 修复循环边界错误,原代码会漏掉最后一个可用Mask for (int i = 0; i < gasCloudMaskList.Count; i++) { if (!gasCloudMaskList[i].gameObject.activeSelf) { selectedGasCloudMask = gasCloudMaskList[i]; break; } } if(selectedGasCloudMask == null) { selectedGasCloudMask = InstantiateGasCloudMaskController(); } // 先把Mask放到世界空间的正确位置 Vector3 worldPosition = collisionTransform.position + new Vector3(difference.x, difference.y, 0); selectedGasCloudMask.transform.position = worldPosition; // 设置父物体时保持世界位置不变,Unity自动转换为正确的本地坐标 selectedGasCloudMask.transform.SetParent(collisionTransform, false); selectedGasCloudMask.gameObject.SetActive(true); }
关键改动说明
- 修复循环边界:原代码
i < gasCloudMaskList.Count - 1会跳过列表最后一个元素,导致最后一个Mask永远无法被复用。 - 利用Unity自动坐标转换:先设置Mask的世界位置(云朵位置+碰撞差值),再调用
SetParent并传入false作为第二个参数。这个参数会让Unity自动处理父物体旋转、缩放带来的坐标转换,直接生成正确的本地坐标,无需手动计算旋转矩阵或逆变换。
这样修改后,不管云朵旋转多少度、缩放多少倍,Mask都会保持在正确的碰撞位置,并且作为子物体跟随云朵一起旋转移动。
内容的提问来源于stack exchange,提问作者William Patrick
相关产品推荐
相关产品推荐

