Unity 随机向四周生成预制地图板块

 实现向四周无限生成不同的地图板块。需要提前布置好不同的地图预制件模块。

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

public class GameBlockCreator : MonoBehaviour
{
    public class MapPos 
    {
        public int x, y;
        public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType()) return false;
            MapPos mp = (MapPos)obj;
            return (x == mp.x && y == mp.y);
        }//重写判断相等
        public override int GetHashCode()
        {
            return System.Tuple.Create(x, y).GetHashCode();
        }
    }//地图坐标类
    private int[] dx = { 1, 0, -1, 0 }, dy = { 0, 1, 0, -1};

    public float blockSpacing;//地图间距
    public Transform blockParent;//存放所有的地图
    public GameObject[] blockPrefabs;//地图预制件
    private List<MapPos> blockMap = new List<MapPos>();//已有地图坐标
    private MapPos curPos = new MapPos();//当前地图坐标
    private void Start()
    {
        blockMap.Add(curPos);//默认从(0,0)开始生成地图
    }
    public void testCreate()
    {
        if(CreateNewBlockPosition(curPos))
        {
            CreateNewBlockObject(curPos);
        }
    }//用按钮测试生成效果
    public bool CreateNewBlockPosition(MapPos mapPos)
    {
        MapPos mp = new MapPos();
        bool isSuccess = false;
        bool[] isFull = { false, false, false, false }; 
        while(!isSuccess)
        {
            int moveIdx = Random.Range(0, 4);
            isFull[moveIdx] = true;
            if(isFull[0] && isFull[1] && isFull[2] && isFull[3] )
            {
                return false;
            }
            mp.x = mapPos.x + dx[moveIdx];
            mp.y = mapPos.y + dy[moveIdx];
            if (!blockMap.Contains(mp))
            {
                curPos = mp;
                blockMap.Add(mp);
                isSuccess = true;
                return true;
            }
        }
        return false;
    }//确定新地图板块坐标
    public void CreateNewBlockObject(MapPos mapPos)
    {
        int blockIdx = Random.Range(0, blockPrefabs.Length);
        GameObject newBlock = GameObject.Instantiate(blockPrefabs[blockIdx]);
        newBlock.transform.SetParent(blockParent);
        newBlock.transform.localPosition = (Vector3.forward * mapPos.y + Vector3.right * mapPos.x) * blockSpacing;
    }//创建新地图板块游戏物体
}

猜你喜欢

转载自blog.csdn.net/weixin_64080879/article/details/131225419