Unity中如何修改父GameObject的缩放而不影响子GameObject?
核心原因
Unity的变换层级默认是完全继承的,父对象的缩放会直接应用到所有子对象的变换计算中,所以修改玩家根对象的localScale.y时,挂载在其下的枪子对象必然会同步继承缩放,出现压扁效果。
可行解决方案
调整对象层级结构(最优方案)
重构玩家节点的层级,不要将武器直接挂载在玩家根对象下,在根对象下拆分两个平级的子节点:- 角色身体容器:存放所有角色身体相关的模型、动画组件
- 武器容器:存放所有武器、枪械相关的对象
下蹲操作时仅修改角色身体容器的localScale.y,同时调整玩家根对象上CapsuleCollider的height参数即可,武器容器和身体容器平级,完全不会受到缩放影响。
子对象反向抵消缩放(适配不想改层级的场景)
如果你暂时不想调整现有层级结构,可以在修改父对象缩放的同时,同步给枪对象的localScale做反向计算,抵消父级的缩放影响,参考代码示例:public Transform playerRoot; public Transform gun; public float crouchScale = 0.5f; void DoCrouch() { // 应用父对象下蹲缩放 playerRoot.localScale = new Vector3(playerRoot.localScale.x, crouchScale, playerRoot.localScale.z); // 反向抵消枪的y轴缩放,保持枪的原始比例 gun.localScale = new Vector3(gun.localScale.x, 1 / crouchScale, gun.localScale.z); }该方案弊端是如果有多个需要忽略父级缩放的子对象,需要逐一处理,嵌套层级过深时还可能出现计算误差。
替换下蹲实现逻辑(无缩放方案)
你也可以完全放弃缩放父对象的实现方式,通过以下操作实现下蹲效果,从根源避免缩放继承问题:- 向下偏移角色模型的
localPosition - 调小
CapsuleCollider.height参数,同时向下调整CapsuleCollider.center的y值
该方案无需修改任何缩放属性,自然不会影响挂载在根对象下的武器显示。
- 向下偏移角色模型的
内容的提问来源于stack exchange,提问作者milkastronaut34
相关产品推荐
相关产品推荐

