在 Unity 中锁定子网格的尺寸比例

Lock dimension scale of child meshes in Unity

我正在 Unity 中构建一个移动应用程序,允许用户在所有三个维度上缩放对象(目前使用 LeanTouch)。这一切都很好,但显然当你缩放父游戏对象时,所有东西都会在那个维度上缩放。我宁愿只允许游戏对象中包含的某些网格根据缩放的维度进行实际缩放。

例如,如果我有一个 table,并且用户想要动态增加对象的宽度(即在 X 方向上缩放),我希望单元的顶部缩放,但各个腿的厚度保持不变。现在,如果你缩放宽度,腿本身的厚度就会增加。

这张图片说明了这个问题。随着 table 变宽,腿也变宽了。尽管 X 方向上 table 顶部 "stretching",但我希望腿 B 的宽度与腿 A 保持相同。

这些模型是用每个组件的单独网格制作的,所以我不会尝试对单个网格执行此操作。

有没有办法表明(或在脚本中)网格或游戏对象只能在两个维度上缩放(例如 table 腿可以在 Y 和 Z 上缩放,但不能在 X 上缩放)?我相信这在 Blender 中称为 "Plane Locking"。

现在我正在使用 Blender 导入 DXF,我正在将其转换为 .obj 或 .fbx,但我完全是个菜鸟。

感谢任何建议

解决此问题的两种简单方法是:在缩放父级之前取消游戏对象的父级(将它们移至临时父级,缩放父级并将其移回)。或者,您可以对所有子项应用逆比例。两者大致相当。请记住,在任何情况下,组合对象的边 'legs' 都不会粘在边上,在 2D 中,您可以为此使用 RectTransform class,但在 3D 中,我认为您需要一些额外的步骤来做到这一点。

我建议您编写一个简单的脚本,将一个对象锚定到另一个对象的特定位置,如下所示:

using UnityEngine;
using UnityEditor;

[ExecuteInEditMode, DisallowMultipleComponent]
public class Anchor : MonoBehaviour
{
  public Transform target;
  public Vector3 localPosition;

  void Update()
  {
    if (target == null) return;
    transform.position = target.position - transform.TransformVector(localPosition);
  }

  void OnDrawGizmos()
  {
    if (!enabled) return;
    var pos = transform.TransformPoint(localPosition);
    Gizmos.color = Color.red;
    Gizmos.DrawSphere(pos, HandleUtility.GetHandleSize(pos) * .05f);
  }
}

我还建议你做一个类似于这样的对象层次结构:

可伸缩对象和锚定对象最好是具有共同父对象的兄弟对象。

有了这个,您可以根据需要随意变换 table 顶部,腿将保持附着在锚定对象(应该是可拉伸对象的子对象)的位置。如果您希望对两个对象都应用变换(例如,在 z 方向缩放),只需变换一个公共父对象即可。该示例是 2D 的,但它也适用于 3D。