Unity C# - 在一个点周围随机生成游戏对象

Unity C# - Spawning GameObjects randomly around a point

我不确定如何解决这个问题,也不知道是否有任何内置的 Unity 函数可以帮助解决这个问题,所以欢迎任何建议。

这是一张有助于描述我想做的事情的图片:

我想在设定半径范围内的给定点周围生成游戏对象。然而,它们在这个半径中的位置应该是随机选择的。该位置应与原点(在地面上)具有相同的 Y 轴。下一个主要问题是每个对象不应该与另一个游戏对象发生冲突和重叠,并且不应该进入他们自己的space(橙色圆圈)。

我的代码目前还不是很好:

public class Spawner : MonoBehaviour {

    public int spawnRadius = 30; // not sure how large this is yet..
    public int agentRadius = 5; // agent's personal space
    public GameObject agent; // added in Unity GUI

    Vector3 originPoint;    

    void CreateGroup() {
        GameObject spawner = GetRandomSpawnPoint ();        
        originPoint = spawner.gameObject.transform.position;        

        for (int i = 0; i < groupSize; i++) {           
            CreateAgent ();
        }
    }

    public void CreateAgent() {
        float directionFacing = Random.Range (0f, 360f);

        // need to pick a random position around originPoint but inside spawnRadius
        // must not be too close to another agent inside spawnRadius

        Instantiate (agent, originPoint, Quaternion.Euler (new Vector3 (0f, directionFacing, 0f)));
    }
}

感谢您提供的任何建议!

为了在圆圈内生成对象,您可以定义生成圆圈的半径,并将 -radius 和 radius 之间的随机数添加到生成器的位置,如下所示:

float radius = 5f;
originPoint = spawner.gameObject.transform.position;
originPoint.x += Random.Range(-radius, radius);
originPoint.z += Random.Range(-radius, radius);

为了检测出生点是否靠近另一个游戏对象,如何检查它们之间的距离:

if(Vector3.Distance(originPoint, otherGameObject.transform.position < personalSpaceRadius)
{
    // pick new origin Point
}

我不太擅长unity3d,所以很抱歉可能不是最佳答案^^

还有:

要首先检查生成区域中有哪些游戏对象,您可以使用此处定义的 Physics.OverlapSphere 函数: http://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html

对于个人 space 您可以使用 colliders 来避免重叠。

要在圆圈中生成,您可以使用 Random.insideUnitSphere。您可以将您的方法修改为,

 public void CreateAgent() {
        float directionFacing = Random.Range (0f, 360f);

        // need to pick a random position around originPoint but inside spawnRadius
        // must not be too close to another agent inside spawnRadius
        Vector3 point = (Random.insideUnitSphere * spawnRadius) + originPoint;
        Instantiate (agent, point, Quaternion.Euler (new Vector3 (0f, directionFacing, 0f)));
    }

希望对您有所帮助。