如何在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;
然而,这只是改变了比例,我需要将游戏对象更改为精确的长度。是否有一个直接的方法来实现这一点?
我创建了一个变通函数来将特定长度转换为刻度(对于将来可能发现此问题的任何人)。游戏对象只能通过比例改变大小,但它们的确切大小可以通过渲染器找到。使用一点插值,你可以将其转换为一个新的比例,以调整你的对象到一个确切的大小。
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);