我正在Unity中构建一个移动应用程序,允许用户在所有三个维度上缩放对象(当前使用LeanTouch)。这一切都很好,但是很显然,当您缩放父级游戏对象时,所有内容都会在该维度上缩放。我宁愿只允许游戏对象中包含的某些网格根据正在缩放的尺寸进行实际缩放。
例如,如果我有一张桌子,并且用户想要动态增加对象的宽度(即,在X方向上缩放),我希望单元的顶部缩放,但是各个腿保持不变。现在,如果您缩放宽度,则腿本身的厚度会增加。
此图像说明了问题。桌子扩大了,桌腿也扩大了。我希望桌脚B的宽度保持与桌脚A相同,尽管桌面在X方向上“拉伸”。
这些模型为每个组件使用单独的网格,因此我不打算对单个网格进行此操作。
是否有一种方法(或在脚本内)指示网格或游戏对象只能按二维缩放(例如,桌腿可以按Y和Z缩放,而不能按X缩放)?我相信这在Blender中称为“平面锁定”。
现在,我正在使用Blender导入DXF,我正在将其转换为.obj或.fbx,但是我是一个完整的菜鸟。
感谢任何建议
答案 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);
}
}
我还建议您进行类似于以下的对象层次结构:
建议可拉伸对象和锚定对象为具有共同父对象的兄弟姐妹。
通过此操作,您可以根据需要对桌面进行尽可能多的变形,以使支腿保持与锚定对象(应该是可伸缩对象的子对象)的位置保持连接。如果要将变换应用于两个对象(例如,沿z方向缩放),只需变换一个公共父对象即可。该示例是2D模式,但也适用于3D模式。
答案 1 :(得分:0)
解决此问题的两种简单方法是:在缩放父级之前取消对游戏对象的父级(将它们移动到临时父级,缩放父级并向后移动)。或者,您可以将反比例尺应用于所有子级。两者大致相等。请记住,在任何情况下,组合对象的侧面“腿”都不会粘到侧面,在2D中,您可以使用RectTransform类,但是在3D中,我认为您需要一些额外的步骤来实现。