unity 通过nav mesh 获得可以生成对象的随机位置
时间: 2023-10-09 14:17:25 浏览: 316
Unity版本的随机迷宫.rar
可以使用以下代码来实现:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class RandomSpawn : MonoBehaviour
{
public GameObject objectToSpawn; // 要生成的对象
public int numToSpawn; // 要生成的数量
public NavMesh navMesh; // NavMesh
// Start is called before the first frame update
void Start()
{
// 随机生成指定数量的对象
for (int i = 0; i < numToSpawn; i++)
{
// 生成随机位置
Vector3 randomPos = GetRandomNavMeshPoint();
// 生成对象
Instantiate(objectToSpawn, randomPos, Quaternion.identity);
}
}
// 获取随机 NavMesh 位置
Vector3 GetRandomNavMeshPoint()
{
NavMeshHit hit;
Vector3 randomPos = Vector3.zero;
// 重复尝试获取随机位置,直到找到可行的位置
while (!NavMesh.SamplePosition(randomPos, out hit, 1.0f, NavMesh.AllAreas))
{
// 生成随机位置
randomPos = new Vector3(Random.Range(transform.position.x - transform.localScale.x / 2, transform.position.x + transform.localScale.x / 2),
Random.Range(transform.position.y - transform.localScale.y / 2, transform.position.y + transform.localScale.y / 2),
Random.Range(transform.position.z - transform.localScale.z / 2, transform.position.z + transform.localScale.z / 2));
}
return hit.position;
}
}
```
在该脚本中,我们首先定义了要生成的对象 `objectToSpawn` 和要生成的数量 `numToSpawn`。然后我们在 `Start()` 方法中使用一个 for 循环来生成指定数量的对象。
在 for 循环中,我们使用 `GetRandomNavMeshPoint()` 方法来获取随机位置。在该方法中,我们首先定义了一个 `NavMeshHit` 类型的变量 `hit`,用于存储 `NavMesh.SamplePosition()` 方法返回的结果。然后我们在一个 while 循环中不断尝试获取随机位置,直到找到可行的位置为止。
在 while 循环中,我们使用 `Random.Range()` 方法来生成随机位置,并使用 `NavMesh.SamplePosition()` 方法检查随机位置是否在 NavMesh 上。如果随机位置不可行,则继续生成新的随机位置。如果找到了可行的位置,则返回该位置。
最后,在 `Start()` 方法中我们使用 `Instantiate()` 方法生成对象,并传入随机位置和默认旋转。这样就可以在 NavMesh 上随机生成指定数量的对象了。
阅读全文