Unity 3D Learn示例中的2D roguelike (一)
Board Manager
1.使用[Serializable] 将此类序列化,保持活性
2.InitialiseList()函数初始化 grid的位置信息
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));
}
}
}
清除链表数据后双层for循环给gridPositions赋值(声明为: private List gridPositions = new List ();)
3.BoardSetup()函数设定整个场景的Board
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;
instance.transform.SetParent (boardHolder);
}
}
}
设置 Board的函数(生成的子对象存放在一个叫”Board”的空物件下)
先随机实例化一个(public)FloorTiles[]里面的自定义prefab(当I,j循环至外围的时候要用墙的prefab)
4.RandomPosition()函数确定物件位置
Vector3 RandomPosition ()
{
int randomIndex = Random.Range (0, gridPositions.Count);
Vector3 randomPosition = gridPositions[randomIndex];
gridPositions.RemoveAt (randomIndex);
return randomPosition;
}
随机生成一个值域为gridPositions的Vector3类型的位置信息randomPosition,随即在gridPositions数组中移除该对象(public class List:public void RemoveAt(int index);)
返回随机生成的Vector位置信息
5. LayoutObjectAtRandom(GameObject[] tileArray, int minimum, int maximum)函数
void LayoutObjectAtRandom (GameObject[] tileArray, int minimum, int maximum)
{
int objectCount = Random.Range (minimum, maximum+1);
for(int i = 0; i < objectCount; i++)
{
Vector3 randomPosition = RandomPosition();
GameObject tileChoice = tileArray[Random.Range (0, tileArray.Length)];
Instantiate(tileChoice, randomPosition, Quaternion.identity);
}
}
设置一个随机数objectCount,范围在miniumu,maximum+1之间
循环objectCount次,每次利用RandomPosition()函数生成一个随机位置,再在该位置随机实例化一个Gameobject
6.SetupScene(int level)函数 利用上面的函数生成每个关卡场景
public void SetupScene (int level)
{
BoardSetup ();
InitialiseList ();
LayoutObjectAtRandom (wallTiles, wallCount.minimum, wallCount.maximum);
LayoutObjectAtRandom (foodTiles, foodCount.minimum, foodCount.maximum);
int enemyCount = (int)Mathf.Log(level, 2f);
LayoutObjectAtRandom (enemyTiles, enemyCount, enemyCount);
Instantiate (exit, new Vector3 (columns - 1, rows - 1, 0f), Quaternion.identity);
}
1.生成背景、外围墙壁
2.初始化gridPositions
3.生成不可穿过的墙壁
4.生成食物
5.设置敌人数量
6.生成敌人
7.实例化出口