1. 程式人生 > >unity5 in action學習筆記

unity5 in action學習筆記

本文章所記載的程式碼來自Unity 5 實戰,使用c#和Unity開發多平臺程式

本文章是原創文章,記載的是一個2d遊戲,來自unity5實戰第五章內容,下圖是遊戲執行的樣子,下面來說步驟

首先匯入精靈,需要精靈的可以留下郵箱,我傳送原始碼,下面我會詳細描述步驟,希望大家都可以看懂,知道過程

首先將背景圖拖入scene,注意影象的transform的z軸,z軸越小那麼離場景越近,在2d遊戲中需要將攝像機檢視設定為正交,而不是透視,因為背景圖最靠外,或者說最遠離場景,所以z軸最大,其次是卡片正面精靈,卡片背面精靈,然後是攝像機的z軸,攝像機的z軸最小,可以設定為-100

說完精靈的transfrom的position。下面來講具體步驟

第一,選擇Gameobject-》2dObject-》Sprite,建立一個空的Sprite,然後再SpriteRender的Image選擇拾起上拖動其中一個卡片精靈到其上,這樣場景就顯示了一個精靈,然後在新建一個sprite,再將卡背拖動到其上,然後將卡背移到正面精靈之上,並把卡背精靈設定為正面精靈的子節點,即為將卡背移動到正面精靈之下,

第二開始編寫程式碼,並將其附加到卡片精父靈上,

[serilizefiled] private GameObject cardback;將該指令碼拖動到場景物件,在Inspector就會出現cardback值域,然後將卡片後背拖動到這個GameObject上。

public void OnMouseDown()

{

if(cardback.activeSelf)

cardback.SetActive(false);//這個函式使得當前物件不可見

}

為了讓影象可以被點選,必須在Inspector新增碰撞器元件,box colider,就可以了

下面必須新增一個控制系統,控制系統同樣在場景物件中,但是這個控制系統是不可見的,所以必須使用gameobject的enemy物件,因為enemy物件是一個空物件,不會在場景中具體顯示,一般都為其掛載程式碼元件,並在場景中發揮作用,

scencecontrol的程式碼如下,

void Start() {   Vector3 startPos = originalCard.transform.position;

  // create shuffled list of cards   int[] numbers = {0, 0, 1, 1, 2, 2, 3, 3};   numbers = ShuffleArray(numbers);//這個函式是用來打亂numbers陣列的值,因為我們有八張精靈,每一個精靈都有它的id和id對應的圖片,注意八個精靈對應八個索引,但是索引的值只能是[0,3],

  // place cards in a grid   for (int i = 0; i < gridCols; i++) {    for (int j = 0; j < gridRows; j++) {     MemoryCard card;

    // use the original for the first grid space     if (i == 0 && j == 0) {      card = originalCard;//我們需要引用一個memorycard,這是一個實體,接著使用這個實體來不斷拷貝剩下7個卡片組合     } else {      card = Instantiate(originalCard) as MemoryCard;//這個是建立其他實體     }

    // next card in the list for each grid space     int index = j * gridCols + i;     int id = numbers[index];     card.SetCard(id, images[id]);

    float posX = (offsetX * i) + startPos.x;     float posY = -(offsetY * j) + startPos.y;     card.transform.position = new Vector3(posX, posY, startPos.z);    }   }  }

Images是一個數組,可以在Inspector控制陣列個數以及其索引值的引用

這裡的Original Card是引用的一個指令碼類,注意不要直接將asset的指令碼拖過來,而是將MemoryCard指令碼拖動到卡片物件,再卡片物件拖動到Inspector的Original Card上,這時Unity會自動引用該物件的指令碼,這樣就可以在程式碼中來引用另一個物件所掛載的指令碼,由此在程式碼中控制象。

值得一提的是,指令碼中的this指的是此指令碼,而this.gameObject,指的是此指令碼所掛載的物件,當然,在指令碼直接可以控制物件行為,關於其幕後我是新手不太瞭解希望可以自行理解

public void CardRevealed(MemoryCard card) {//這是兩個卡片匹配的函式   if (_firstRevealed == null) {//所以需要在類中儲存兩個資料,分別是第一個memorycard和第二個memorycard    _firstRevealed = card;   } else {    _secondRevealed = card;    StartCoroutine(CheckMatch());//這是一個協程函式,專門返回IEnumerator的並且有yield return的函式   }  }    private IEnumerator CheckMatch() {

  // increment score if the cards match   if (_firstRevealed.id == _secondRevealed.id) {//兩個卡片匹配成功則將uiscore分數更新    _score++;    scoreLabel.text = "Score: " + _score;   }

  // otherwise turn them back over after .5s pause   else {    yield return new WaitForSeconds(.5f);

   _firstRevealed.Unreveal();//將卡片重新反回至背面public void Unreveal() { cardBack.SetActive(true);}    _secondRevealed.Unreveal();   }      _firstRevealed = null;   _secondRevealed = null;  }