Unity 随机生成道路-最小生成树

 要使用Prim算法来确保生成的 Cube 之间不会有孤岛,你需要按照以下步骤进行实现:

1. 创建一个数据结构来表示 Cube,包括位置信息和是否已经被连接的状态。
2. 初始化一个空列表(或优先队列)来存储已连接的 Cube。
3. 随机选择一个 Cube 作为起始点,将其添加到已连接列表中。
4. 重复以下步骤,直到已连接列表中包含所有的 Cube:
a. 在已连接列表中选择一个 Cube(A)和一个未连接的 Cube(B),使得连接 A 和 B 的距离最短。
b. 将 Cube B 添加到已连接列表中,同时绘制连接线。
5. 所有 Cube 都被连接后,算法结束。

下面是一个使用Prim算法的示例代码:

这个示例代码使用Prim算法确保了生成的 Cube 之间不会有孤岛,所有 Cube 都会被连接起来。在 `ConnectCubes` 方法中,算法会遍历连接的 Cube 和未连接的 Cube,找到距离最近的未连接的 Cube,然后将它们连接起来。一旦所有 Cube 都被连接,算法结束。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeGenerator : MonoBehaviour
{
    public GameObject cubePrefab; // 你的Cube预制体
    public int numCubes = 5;
    public float range = 100f;

    private List<Transform> cubes = new List<Transform>();
    private List<Transform> connectedCubes = new List<Transform>();

    void Start()
    {
        GenerateCubes();
        ConnectCubes();
    }

    void GenerateCubes()
    {
        for (int i = 0; i < numCubes; i++)
        {
            Vector3 randomPosition = new Vector3(Random.Range(-range, range), 0, Random.Range(-range, range));
            GameObject cube = Instantiate(cubePrefab, randomPosition, Quaternion.identity);
            cubes.Add(cube.transform);
        }
    }

    void ConnectCubes()
    {
        if (cubes.Count == 0)
            return;

        connectedCubes.Add(cubes[0]);

     // connectedCubes的数量会逐渐递增
while (connectedCubes.Count < cubes.Count) { Transform closestCube = null; Transform currentCube = null; float shortestDistance = float.MaxValue; //重置 shortestDistance,为了在后面的双重循环里面获取最短距离的点
       //此函数确保了,每个连进来的点都是与已经连接的点是最小的距离那个
foreach (Transform connected in connectedCubes) {
          // 遍历连接的,在非连接的里面去找距离自己最短的那个
foreach (Transform unconnected in cubes) { if (!connectedCubes.Contains(unconnected)) { float distance = Vector3.Distance(connected.position, unconnected.position); if (distance < shortestDistance) { shortestDistance = distance; closestCube = unconnected; currentCube = connected; } } } } if (closestCube != null) {
          //添加连接点 connectedCubes.Add(closestCube); Debug.DrawLine(currentCube.position, closestCube.position, Color.black,
1000); } } } private void OnDrawGizmos() { Gizmos.color = Color.red; foreach (Transform cube in cubes) { Gizmos.DrawWireSphere(cube.position, 1.0f); } } }

 口述

一堆散乱的点

1.先随机找一个点,作为连接点A

2.找到和当前连接点A 最近的点B 进行连接

3.找和B最近的点C,因为此时已经连接点有A和B,所以C需要做判断和所有已经连接的点哪个近就和哪个连

4.找和C最近的D,重复上面的步骤,直到所有的点全部连完

posted @ 2023-11-08 18:11  三页菌  阅读(65)  评论(0编辑  收藏  举报