1

我在 Unity3D 中有一个立方体。我知道它的 8 个顶点的向量。它围绕所有轴进行 3D 旋转和缩放。如何在运行时在该立方体内的随机位置实例化一个对象?

4

2 回答 2

2

如果您知道立方体的 8 个顶点,则很容易随机化该立方体内的对象。考虑随机对象在变换的位置有一个x,yz值。UnityScript 和 C# 都提供了一个很好的Random类,它可以轻松地为您提供两个值之间的随机数。使用该类 3 次:

  1. 在所有 8 个顶点的最大值x和最小值之间创建一个随机数。x
  2. 在所有 8 个顶点的最大值y和最小值之间创建一个随机数。y
  3. 在所有 8 个顶点的最大值z和最小值之间创建一个随机数。z

接下来,创建必须在此立方体中实例化的游戏对象,并使用您从上述三个步骤计算的xy和值。z这将在多维数据集中随机创建您的对象。

请注意,如果您的随机对象具有一定的大小,从技术上讲,可以在立方体边缘随机生成对象,从而让随机对象“伸出”立方体。为避免这种情况,请确保从您在 randomize 函数中输入的最大值中减去对象大小的一半,并从您在 randomize 函数中输入的最小值中将对象的一半大小相加。

编辑:要在对象旋转时获得积分,您可以使用cube.transform.localScale / 2. 这将为您提供立方体角之一的本地位置。Vector3.Scale(cube.transform.localScale / 2, new Vector3(1,1,-1))会让你得到其他人之一(1和-1的不同组合会让你得到全部8个)。然后,要在世界空间中找到它们,请使用cube.transform.TransformPoint().

于 2013-08-14T07:13:55.497 回答
1

如果我理解您要正确执行的操作,我可能会建议以下内容。

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 这是实例化预制件的一个很好的参考。您的运行时实例化对象应该是预制件。

于 2013-08-13T19:30:47.417 回答