如何在Unity中将游戏对象设置为精确长度

8

在Unity中,我有一个代表距离的浮点数

float distance = Vector3.Distance(start.position,end.position);

我想使用浮点数来改变一个物体沿着其Z轴的大小。我尝试了:

gameobject.transform.localScale.z = distance;

然而,这只是改变了比例,我需要将游戏对象更改为精确的长度。有没有简单直接的方法实现这个?

不是很准确。你最好的选择是给你要缩放的对象一个1单位的大小。除此之外,在Unity中没有物体长度的概念。 - Bart
是的,缩放是唯一可以用来定义游戏对象长度、宽度和高度的属性。然而,您也可以通过其他方式分配其碰撞器的属性。 - Umair M
4个回答

12

我创建了一个解决方法函数,将一定长度转换为比例尺(适用于未来可能遇到此问题的任何人)。游戏对象只能通过比例尺更改其大小,但可以通过渲染器找到其确切大小。使用一些插值,您可以将其转换为新的比例尺,以将对象调整为精确大小。

public void newScale(GameObject theGameObject, float newSize) {

    float size = theGameObject.GetComponent<Renderer> ().bounds.size.y;

    Vector3 rescale = theGameObject.transform.localScale;

    rescale.y = newSize * rescale.y / size;

    theGameObject.transform.localScale = rescale;

}

这个解决方案对我没用。我的对象被设置为另一个对象的父级,并且被旋转了。 - shieldgenerator7
@shieldgenerator7 这是因为他只修改了y轴。如果你想让它适用于每个轴,你必须根据你的需求修改函数。 - Ray Yago
@RayYago 是的,请看下面我的回答 https://dev59.com/5o3da4cB1Zd3GeqP0XhE#54264294 - shieldgenerator7

1

Unity没有类似于“Length”的任何对象。在(1,1,1)的尺度下,Unity认为每个对象都是一个单位。这意味着如果您希望您的对象沿z轴有3个单位长,您需要将其缩放为(1,1,3),其他轴也是如此。这就是为什么说您需要特别注意为Unity设计资产,因为它们都需要根据Unity定义的比例来制作。


问题在于这将是一个嵌套层次结构,因此比例是基于父级的。所以我需要从中抽象出来。我也不知道如何将距离转换为“单位”。特别是因为单位取决于实例化了哪个基元而是任意的。胶囊体的比例为1与立方体的比例为1是不同的。 - Chris Headleand
1
一个立方体的所有面都是偶数,因此Unity将认为它们都等于1个单位。对于胶囊体而言,高度大于宽度,因此Unity将把高度视为1个单位,并根据与高度的差异来处理宽度。 - Anas iqbal
对于子父关系,您将需要单独对子对象应用比例变化,以便不会干扰其他对象。对于距离单位转换问题,您可以尝试自己的 gameobject.transform.localScale.z = distance; 方法或使用您自己答案中提到的方法。 - Anas iqbal
@ChrisHeadleand Unity中的单位绝对不是任意的,并且在对象之间也绝不会变化。通用单元也不仅限于Unity。从3DS Max到Maya再到其他任何软件,通用单位都很常见。基元的比例将等同于确切的长度。对于导入的资产和贴图,您需要将导入器的比例设置为一个值,以便缩放为1时在世界空间中恰好为1个单位。完成此操作后,缩放解决方案将按预期工作。 - Reasurria

1
这个解决方案对我来说效果更好:

public void convertDistanceToScale(GameObject go, float distance){
     Vector2 size = go.transform.lossyScale;
     size.x = distance;
     size.x = (size.x * go.transform.localScale.x) / go.transform.lossyScale.x;
     size.y = go.transform.localScale.y;
     go.transform.localScale = size;
}

这适用于我测试过的所有对象,包括子对象和旋转的对象。

0

这里插入图片

在我的情况下,这个对象在3dsmax中的半径是243.638。

这里插入图片

但是这个重新缩放导致它成为了子对象。 我想将宽度固定为父对象变量。

这里插入图片

    Transform Truck_Area_Range = transform.Find("Circle");
    Mesh mesh = Truck_Area_Range.GetComponent<MeshFilter>().mesh;
    float Mesh_X = mesh.bounds.size.x;
    Debug.Log(Mesh_X); // this same as my 3dsmax Radius * 2
    Vector3 LocalScale = transform.localScale;
    Debug.Log(LocalScale.x); // parent object LocalScale
    float current_size = Mesh_X * LocalScale.x;
    Debug.Log(current_size); // Circle object size in scene
    float distance = 30;
    float newSize = distance / current_size;
    Debug.Log(newSize);  
    Truck_Area_Range.localScale = new Vector3 (newSize, newSize, 1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接