五关卡管理器
切换Project/Asserts/Scripts窗口下,创建脚本文件BoardManager.cs(本文以C#为开发语言)
5.1创建脚本
首先选择Scripts文件夹,右侧窗口为文件夹内容窗口,默认为空白。鼠标右键Create/C# Script即可。如图:
选择任何一个脚本文件,双击,系统弹出脚本编辑窗口。如图:
5.2关卡脚本
首先编辑BoardManager代码如下:
using UnityEngine;
using System.Collections.Generic;
using System;
using Random = UnityEngine.Random;
public class BoardManager : MonoBehaviour {
[Serializable]
public class Count
{
public int minimum;
public int maxmum;
public Count(int min,int max)
{
minimum = min;
maxmum = max;
}
}
//场景尺寸
public int columns = 8;
public int rows = 8;
//内墙数量
public Count wallCount = new Count(5,9);
//食物数量
public Count foodCount = new Count(1,5);
//出口
public GameObject exit;
//地板精灵
public GameObject[] floorTiles;
//内墙精灵
public GameObject[] wallTiles;
//食物精灵
public GameObject[] foodTiles;
//敌人精灵
public GameObject[] enemyTiles;
//外墙精灵
public GameObject[] outerWallTiles;
//Hierarchy中产生的对象,都放进来,让项目更整洁。
private Transform boardHolder;
//跟踪地图中的所有位置
private List<Vector3> gridPositions = new List<Vector3>();
//初始化位置信息
void InitialiseList()
{
//清除上衣关卡的对象
gridPositions.Clear();
//构造位置信息
for(int x=1;x<columns -1 ;x++)
{
for(int y=1;y<rows -1 ;y++)
{
gridPositions.Add(new Vector3(x,y,0f));
}
}
}
//初始化墙信息
void BoardSetup()
{
boardHolder = new GameObject("Board").transform;
for(int x=-1;x<columns +1 ;x++)
{
for(int y=-1;y<rows +1 ;y++)
{
//创建地板
GameObject toInstantiate = floorTiles[Random.Range(0,floorTiles.Length)];
if(x==-1 || x==columns || y ==-1 ||y==rows)
{
//创建外墙
toInstantiate = outerWallTiles[Random.Range(0,outerWallTiles.Length)];
}
GameObject instance = Instantiate(toInstantiate,new Vector3(x,y,0f),Quaternion.identity) as GameObject;
//放入board中
instance.transform.SetParent(boardHolder);
}
}
}
//场景中活动区域,随机选取一个位置
Vector3 RandomPosition()
{
int randomIndex = Random.Range(0,gridPositions.Count);
Vector3 randomPosition = gridPositions[randomIndex];
gridPositions.RemoveAt(randomIndex);
return randomPosition;
}
//设置物品
void LayoutObjectAtRandom(GameObject[] tileAttay,int minimum,int maxmum)
{
//随机物品数量
int objectCount = Random.Range(minimum,maxmum+1);
for(int i=0;i<objectCount;i++)
{
//一个随机位置
Vector3 randomPosition = RandomPosition();
//产生一个物品的随机精灵
int tmp = Random.Range(0,tileAttay.Length);
GameObject tileChoice = tileAttay[tmp];
//添加到场景
Instantiate(tileChoice,randomPosition,Quaternion.identity);
}
}
//创建场景
public void SetupScene(int level)
{
BoardSetup();
InitialiseList();
//创建内墙
LayoutObjectAtRandom(wallTiles , wallCount.minimum, wallCount.maxmum);
//创建食物
LayoutObjectAtRandom(foodTiles , foodCount.minimum, foodCount.maxmum);
//创建敌人
int enemyCount = (int)Mathf.Log(level,2f);
LayoutObjectAtRandom(enemyTiles , enemyCount, enemyCount);
//创建出口
Instantiate(exit , new Vector3(columns-1,rows-1,0f),Quaternion.identity);
}
}
场景坐标系如图: