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

Posted

技术标签:

【中文标题】Unity C# - 在一个点周围随机生成游戏对象【英文标题】:Unity C# - Spawning GameObjects randomly around a point 【发布时间】:2016-04-13 01:27:20 【问题描述】:

我不确定如何解决这个问题,或者是否有任何内置的 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)));
    

感谢您提供的任何建议!

【问题讨论】:

圆圈生成不是问题,但请告诉我你为什么不使用对撞机来维护空间? @HamzaHasan - 我不知道从哪里开始。碰撞器是检测另一个特工是否进入另一个人的个人区域的好主意,但是我如何将一个从另一个移开?目前每个代理都没有移动。我只是想在它们生成时将它们生成在一个有效的地方,但不确定碰撞器将如何提供帮助。 好的,让我做一些工作,告诉我你使用的是 2D 还是 3D? 哇,非常感谢。它是 3D 的 :) 不客气 :) 让我写下你的答案 :) 【参考方案1】:

对于个人空间,您可以使用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)));
    

希望对你有所帮助。

【讨论】:

啊,这很简单。非常感谢。我决定使用 NavMeshAgent,因为它能够自动确保敌人不会相互碰撞,而不是使用对撞机。我希望这会奏效。 伙计,你可以明确表示你想要那种东西:D 我主要在敌人生成后使用 NavMeshAgent。当它们悲伤地生成时,它并没有真正将它们自动移动到正确的位置。 哦,为了记录,我只是想在 ^^ 中添加它【参考方案2】:

为了在圆内生成对象,您可以定义生成圆的半径,然后将 -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

【讨论】:

这对我很有帮助,谢谢。我正在考虑随机选择生成位置,直到它们不重叠,但这对处理非常浪费,因为如果我不小心将生成半径设置得太短,它可能会发现很难找到一个好的位置。我会检查那个功能:)

以上是关于Unity C# - 在一个点周围随机生成游戏对象的主要内容,如果未能解决你的问题,请参考以下文章

随机自动生成的 C# 编码问题

Unity C# - 单击按钮将游戏对象传递给另一个 C# 脚本 [关闭]

如何生成一个随机数并确保在 Unity 中使用 Photon 的每个人都相同?

如何随机调用函数unity c# [重复]

Unity C# 向围绕移动轴旋转的目标发射弹丸

在 Unity C# 中实例化游戏对象列表