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

时间:2018-06-29 01:36:39

标签: unity3d mobile graphics 3d blender

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

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

Leg Thickness Scales

此图像说明了问题。桌子扩大了,桌腿也扩大了。我希望桌脚B的宽度保持与桌脚A相同,尽管桌面在X方向上“拉伸”。

这些模型为每个组件使用单独的网格,因此我不打算对单个网格进行此操作。

是否有一种方法(或在脚本内)指示网格或游戏对象只能按二维缩放(例如,桌腿可以按Y和Z缩放,而不能按X缩放)?我相信这在Blender中称为“平面锁定”。

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

感谢任何建议

2 个答案:

答案 0 :(得分:1)

我建议您编写一个简单的脚本,将一个对象固定在特定位置的另一个对象上,例如:

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);
  }
}

我还建议您进行类似于以下的对象层次结构:

enter image description here

建议可拉伸对象和锚定对象为具有共同父对象的兄弟姐妹。

通过此操作,您可以根据需要对桌面进行尽可能多的变形,以使支腿保持与锚定对象(应该是可伸缩对象的子对象)的位置保持连接。如果要将变换应​​用于两个对象(例如,沿z方向缩放),只需变换一个公共父对象即可。该示例是2D模式,但也适用于3D模式。

enter image description here

答案 1 :(得分:0)

解决此问题的两种简单方法是:在缩放父级之前取消对游戏对象的父级(将它们移动到临时父级,缩放父级并向后移动)。或者,您可以将反比例尺应用于所有子级。两者大致相等。请记住,在任何情况下,组合对象的侧面“腿”都不会粘到侧面,在2D中,您可以使用RectTransform类,但是在3D中,我认为您需要一些额外的步骤来实现。