实现向四周无限生成不同的地图板块。需要提前布置好不同的地图预制件模块。
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;
}//创建新地图板块游戏物体
}