如何将游戏对象设置为统一的精确长度

时间:2015-07-28 05:39:36

标签: c# unity3d

在Unity中,我有一个表示距离

的浮点数
float distance = Vector3.Distance(start.position,end.position);

我想使用该浮点数来改变对象沿Z轴的大小。我试过了:

gameobject.transform.localScale.z = distance;

但是,这只是改变比例,我需要将游戏对象更改为精确的长度。有没有直接的方法来实现这一目标?

4 个答案:

答案 0 :(得分:9)

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

{{1}}

答案 1 :(得分:1)

Unity对任何对象都没有“长度”这样的东西。在(1,1,1)的范围内,统一认为每个物体都是一个单位。意思是如果您希望对象沿z轴长3个单位,则将其比例更改为(1,1,3),对于其他轴也是如此。这就是为什么说你需要特别小心,同时为统一设计资产,因为他们都需要按照统一的规模来制作。

答案 2 :(得分: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;
}

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

答案 3 :(得分:0)

image here

在我的情况下,该对象在3dsmax处的半径243.638。

image here

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

image here

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