1. 程式人生 > >Unity自學之路(1)

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.例項化出口