开发平台:Unity
编程平台:Visual Studio 2020以上
使用语言:C#
问题描述
在修改或调整 GameObject 子对象的 Transform 组件信息时,出现的因修改 Rotation 组件值所导致与实际期望不符合的问题。具体表现情况如下图所示:
补充说明:
- 物体01、物体02、物体03、嵌套空 所代表的对象均为 Empty GameObject。且 Transform 组件下 Scale 数值均不为1.
- 圆柱体 为外部模型资源导入对象。在 AssetDatabase 中设置 Scale Factory 为默认值。
- Cube、Plane 的 Transform 组件值均使用默认值大小。
问题原因
基于其父对象的 Scale 值大小进行等效变化。即父对象大小发生变化时,子对象应具备其对应的变化大小。对 Unity Scene 窗口下的根游戏对象,其父对象可看作由 一个名为 Scene 的特殊游戏对象容纳。这类特殊的游戏对象,其 Transform、Rotation、Scale 均为默认不可访问。如果不相信?拖拽多个场景至 Hierarchy 面板中,你会发现其和普通游戏对象的拖拽结果相仿,唯一区别是 Scene 之间互不包容(父与子)。
Unity Scale 计算公式
【待补充】
解决方案
影响形变的根本原因是其路径上的所有父对象使用的 Scale 值不为1所导致。根据现实情况的模型背景,解决方法大致如下:
- 检查路径下 Empty GameObject 对象的 Scale 值是否为 1(恒定)
有时候,程序或动画的某一举动也会修改其值,这个一定要确认! - 重设 外部引用模型的 Scale 值为1
如果本身因为模型问题,则需要向模型师提出现状,重新检查模型面的参数设定值是否正常、正确。 - 切忌 在已形变对象的子对象下进行 Rotate 操作。
这样嵌套形变环境下,只会变的更复杂。
案例剖析
规范所有确认使用的 Mesh Renderer、Mesh Filter 组件的 GameObject 对象的父对象及其路径上所有父对象。使其所有的父对象 Scale 值均控制在数值1上。例如 国企旗杆 模型进行内部分解:
- Empty GameObject
= 国旗旗帜 模型
= 国旗旗杆 模型
= 国旗平台 模型
若细化 国旗旗杆 模型还需细化,则应当如下:
- Empty GameObject
= 国旗旗帜 模型
= Empy GameObject
= 国旗旗杆 模型
= 国旗缆绳 模型
= 国旗平台 模型