如何在unity中设置游戏对象的精确长度

本文关键字:对象 游戏 unity 设置 | 更新日期: 2023-09-27 18:05:07

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

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

我想用这个浮动来改变一个对象沿其Z轴的大小。I tried:

gameobject.transform.localScale.z = distance;

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

如何在unity中设置游戏对象的精确长度

我创建了一个变通函数来将特定长度转换为刻度(对于将来可能发现此问题的任何人)。游戏对象只能通过比例改变大小,但它们的确切大小可以通过渲染器找到。使用一点插值,你可以将其转换为一个新的比例,以调整你的对象到一个确切的大小。

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

Unity没有任何对象的"长度"之类的东西。在(1,1,1)的尺度下,单位认为每个物体都是一个单位。这意味着如果你想让你的对象在z轴上有3个单位长,你可以改变它的比例为(1,1,3),其他轴也一样。这就是为什么说你在为unity设计资产时需要特别小心,因为它们都需要根据unity定义的比例制作。

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

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

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

image here

在我的例子中,这个对象的半径为243.638,最大值为3dsmax。

图片在这里

但是这个重新缩放,因为这是子对象。并希望将宽度固定为父对象变量。

图片在这里

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