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

将玩家对象设为父对象子物体时,如何保持其原始缩放比例?

解决玩家设为子物体后缩放异常的问题

问题根源

把玩家设成某个物体的子物体后,玩家的世界缩放会被父物体的缩放带偏——Unity里Transform的缩放是跟着层级继承的,玩家自己的本地缩放会和父物体的缩放相乘,最后得到的就是你看到的异常缩放值。说白了就是你那个父物体本身的缩放就不是(1,1,1),导致玩家继承后变了形。

解决办法

办法1:修正父物体的缩放

直接把父物体的本地缩放调成(1,1,1),这样玩家变成子物体后,世界缩放就和自己的本地缩放一致了。要是父物体需要保持当前的视觉大小,别改Transform缩放,去调它Mesh Filter里的模型缩放就行。

办法2:设子物体时抵消父物体的缩放影响

在把玩家设为子物体的同时,计算父物体缩放的倒数,给玩家的本地缩放做补偿,抵消继承的影响:

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject == Player)
    {
        // 算出父物体缩放的倒数,用来抵消影响
        Vector3 inverseParentScale = new Vector3(1/transform.localScale.x, 1/transform.localScale.y, 1/transform.localScale.z);
        // 先记下来玩家当前的世界缩放
        Vector3 playerWorldScale = Player.transform.lossyScale;
        // 设置父物体
        Player.transform.parent = transform;
        // 给玩家设本地缩放,抵消父物体的缩放,保持世界大小不变
        Player.transform.localScale = Vector3.Scale(playerWorldScale, inverseParentScale);
    }
}

办法3:退出触发时彻底恢复

在OnTriggerExit里把玩家的父物体清空,再重置缩放:

private void OnTriggerExit(Collider other)
{
    if (other.gameObject == Player)
    {
        // 让玩家回到世界空间,取消父子关系
        Player.transform.parent = null;
        // 把玩家缩放重置回初始的(1,1,1)
        Player.transform.localScale = new Vector3(1,1,1);
    }
}

注意事项

  • 别直接改玩家的世界缩放(lossyScale是只读属性),要通过调整本地缩放或者父物体缩放来控制。
  • 如果父物体还有上级父物体,得把整个层级的缩放乘积算出来再做抵消。

内容的提问来源于stack exchange,提问作者thehelaeper67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:12:51