You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:35:50