开发平台:Unity
编程平台:Visual Studio 2020以上
使用语言:C#

问题描述


  在修改或调整 GameObject 子对象的 Transform 组件信息时,出现的因修改 Rotation 组件值所导致与实际期望不符合的问题。具体表现情况如下图所示:

unity子线程可以加载资源吗_unity子线程可以加载资源吗


补充说明

  1. 物体01、物体02、物体03、嵌套空 所代表的对象均为 Empty GameObject。且 Transform 组件下 Scale 数值均不为1.
  2. 圆柱体 为外部模型资源导入对象。在 AssetDatabase 中设置 Scale Factory 为默认值。
  3. Cube、Plane 的 Transform 组件值均使用默认值大小。

问题原因


基于其父对象的 Scale 值大小进行等效变化。即父对象大小发生变化时,子对象应具备其对应的变化大小。对 Unity Scene 窗口下的根游戏对象,其父对象可看作由 一个名为 Scene 的特殊游戏对象容纳。这类特殊的游戏对象,其 Transform、Rotation、Scale 均为默认不可访问。如果不相信?拖拽多个场景至 Hierarchy 面板中,你会发现其和普通游戏对象的拖拽结果相仿,唯一区别是 Scene 之间互不包容(父与子)。

Unity Scale 计算公式
【待补充】

解决方案


  影响形变的根本原因是其路径上的所有父对象使用的 Scale 值不为1所导致。根据现实情况的模型背景,解决方法大致如下:

  1. 检查路径下 Empty GameObject 对象的 Scale 值是否为 1(恒定)
    有时候,程序或动画的某一举动也会修改其值,这个一定要确认!
  2. 重设 外部引用模型的 Scale 值为1
    如果本身因为模型问题,则需要向模型师提出现状,重新检查模型面的参数设定值是否正常、正确。
  3. 切忌 在已形变对象的子对象下进行 Rotate 操作。
    这样嵌套形变环境下,只会变的更复杂。

案例剖析


  规范所有确认使用的 Mesh Renderer、Mesh Filter 组件的 GameObject 对象的父对象及其路径上所有父对象。使其所有的父对象 Scale 值均控制在数值1上。例如 国企旗杆 模型进行内部分解:

  • Empty GameObject
    = 国旗旗帜 模型
    = 国旗旗杆 模型
    = 国旗平台 模型

若细化 国旗旗杆 模型还需细化,则应当如下:

  • Empty GameObject
    = 国旗旗帜 模型
    = Empy GameObject
      = 国旗旗杆 模型
      = 国旗缆绳 模型
    = 国旗平台 模型