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

Unity C#-围绕一个点随机生成游戏对象,c#,unity3d,instantiation,gameobject,C#,Unity3d,Instantiation,Gameobject,我不知道如何解决这个问题,也不知道是否有任何内置的Unity函数可以帮助解决这个问题,因此,任何建议都是非常感谢的 以下是一幅有助于描述我想做什么的图片: 我想在设定半径范围内围绕给定点生成游戏对象。但是,应随机选择其在此半径内的位置。该位置应与原点(位于地面)具有相同的Y轴。下一个主要问题是,每个对象不应碰撞和重叠另一个游戏对象,也不应进入其个人空间(橙色圆圈) 到目前为止,我的代码不是很好: public class Spawner : MonoBehaviour { publi

我不知道如何解决这个问题,也不知道是否有任何内置的Unity函数可以帮助解决这个问题,因此,任何建议都是非常感谢的

以下是一幅有助于描述我想做什么的图片:

我想在设定半径范围内围绕给定点生成游戏对象。但是,应随机选择其在此半径内的位置。该位置应与原点(位于地面)具有相同的Y轴。下一个主要问题是,每个对象不应碰撞和重叠另一个游戏对象,也不应进入其个人空间(橙色圆圈)

到目前为止,我的代码不是很好:

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)));
    }
}
公共类生成程序:单行为{
public int spawnRadius=30;//还不确定它有多大。。
public int agentRadius=5;//代理的个人空间
公共游戏对象代理;//添加到Unity GUI中
矢量3原点;
void CreateGroup(){
GameObject产卵器=GetRandomSpawnPoint();
originPoint=spawner.gameObject.transform.position;
对于(inti=0;i

感谢您提供的任何建议

要生成圆内的对象,可以定义生成圆的半径,只需将-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
}
if(矢量3.距离(原点,其他GameObject.transform.position
我对unity3d不太在行,所以可能不是最好的答案^^

同时

要首先检查哪些游戏对象位于繁殖区域,可以使用此处定义的Physics.OverlapSphere函数:

对于个人空间,您可以使用碰撞器来避免重叠

对于在圆中繁殖,您可以使用
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)));
    }

希望这对你有所帮助。

在圆圈中产卵不是问题,但告诉我你为什么不使用碰撞器来维持空间?@HamzaHasan-我真的不知道从哪里开始。碰撞器是一个好主意,可以检测其他代理是否进入另一个代理的个人区域,但我如何将一个代理移离另一个代理?目前每个代理都没有let’不要动。我只是想在它们产卵时在一个有效的地方产卵,不确定碰撞器会有什么帮助。好的,让我做一些工作,告诉我你使用的是2D还是3D?哇,非常感谢。它是3D的:)不客气:)让我写下你的答案:)这肯定对我有帮助,谢谢。我曾考虑过随机挑选产卵位置,直到它们不重叠,但这在处理上是非常浪费的,因为如果我不小心使产卵半径过短,可能会发现很难找到一个好的位置。我将检查该函数:)啊,这非常简单。谢谢。我决定使用NavMeshAgent,因为它能够自动确保敌人不会相互碰撞,而不是使用碰撞器。我希望这能奏效。老兄,你可以清楚地表明你想要那种东西:我主要在敌人产卵后使用NavMeshAgent。当它们不幸地产卵时,它并不会自动将它们移到正确的位置。哦,我只是想记录一下,我只是想把它加进去^^