我在 Unity3D 中有一个立方体。我知道它的 8 个顶点的向量。它围绕所有轴进行 3D 旋转和缩放。如何在运行时在该立方体内的随机位置实例化一个对象?
2 回答
如果您知道立方体的 8 个顶点,则很容易随机化该立方体内的对象。考虑随机对象在变换的位置有一个x
,y
和z
值。UnityScript 和 C# 都提供了一个很好的Random
类,它可以轻松地为您提供两个值之间的随机数。使用该类 3 次:
-
在所有 8 个顶点的最大值
x
和最小值之间创建一个随机数。x
-
在所有 8 个顶点的最大值
y
和最小值之间创建一个随机数。y
-
在所有 8 个顶点的最大值
z
和最小值之间创建一个随机数。z
接下来,创建必须在此立方体中实例化的游戏对象,并使用您从上述三个步骤计算的x
、y
和值。z
这将在多维数据集中随机创建您的对象。
请注意,如果您的随机对象具有一定的大小,从技术上讲,可以在立方体边缘随机生成对象,从而让随机对象“伸出”立方体。为避免这种情况,请确保从您在 randomize 函数中输入的最大值中减去对象大小的一半,并从您在 randomize 函数中输入的最小值中将对象的一半大小相加。
编辑:要在对象旋转时获得积分,您可以使用cube.transform.localScale / 2
. 这将为您提供立方体角之一的本地位置。Vector3.Scale(cube.transform.localScale / 2, new Vector3(1,1,-1))
会让你得到其他人之一(1和-1的不同组合会让你得到全部8个)。然后,要在世界空间中找到它们,请使用cube.transform.TransformPoint()
.
如果我理解您要正确执行的操作,我可能会建议以下内容。
public class Instantiation : MonoBehaviour {
void Start() {
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.AddComponent<Rigidbody>();
cube.transform.position = new Vector3(x, y, 0);
}
}
}
}
它将在新的 transform.position 处创建 GameObject 立方体(或任何你想要的)。但是,它的位置不是特定的 Vector3,而是从新方法中随机生成的 Vector3。将创建此方法以在特定边界内随机化 x、y 和 z 的数字。然后,您只需将其喂入新位置即可。
我希望这是有道理的,我不是一个了不起的老师。
编辑:http : //docs.unity3d.com/Documentation/Manual/InstantiatingPrefabs.html 这是实例化预制件的一个很好的参考。您的运行时实例化对象应该是预制件。