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; }