【解决】修改子物体Transform信息导致变换不对称、异常问题的解决方案

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

问题描述


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

在这里插入图片描述
补充说明

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

问题原因


  在 Unity 世界中,Scale 数值的大小 基于其父对象的 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
      = 国旗旗杆 模型
      = 国旗缆绳 模型
    = 国旗平台 模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值