将玩家对象设为父对象子物体时,如何保持其原始缩放比例?
解决玩家设为子物体后缩放异常的问题
问题根源
把玩家设成某个物体的子物体后,玩家的世界缩放会被父物体的缩放带偏——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
相关产品推荐
相关产品推荐

