Unity自學之路(1)
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.例項化出口