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# - 在一个点周围随机生成游戏对象的主要内容,如果未能解决你的问题,请参考以下文章
Unity C# - 单击按钮将游戏对象传递给另一个 C# 脚本 [关闭]