<p>
一個(gè)卡片消除小游戲,主要是用來(lái)熟悉unity的基本用法归斤,功能比較簡(jiǎn)單痊夭,完成了隨機(jī)發(fā)牌以及卡牌對(duì)比消除功能~
</p>
--
一刁岸、代碼的主體思路:
代碼包括兩塊:
- 用來(lái)做初始化模板的卡牌
這里包括卡牌自身的屬性字段脏里,以及使用方法,包括:卡牌的序號(hào)(id)虹曙,卡背迫横,設(shè)置卡牌的方法(SetCard)番舆,卡牌點(diǎn)擊方法(OnMouseDown),卡背消失方法(SetBack)矾踱。 - 游戲中恨狈,用來(lái)負(fù)責(zé)卡牌發(fā)送,點(diǎn)擊判斷等處理的卡牌管理代碼呛讲。
這是用來(lái)對(duì)整個(gè)游戲做管理的代碼禾怠,包括:卡牌的數(shù)量(CARD_NUMBER),所有卡牌的ID贝搁,以及所有卡牌的圖片(sprite)和卡牌之間的間隔(offsetX吗氏,offsetY);
方法包括:卡牌序號(hào)的隨機(jī)初始化(ArrayInit)雷逆,接收卡牌方法(ReceiveCard)弦讽,卡牌比較方法(Macth)
<pre>
上面是整體代碼的結(jié)構(gòu),下面會(huì)根據(jù)自己開(kāi)發(fā)的思路一步一步完成膀哲。
</pre>
二往产、開(kāi)發(fā)步驟:
- 1.先把需要的卡牌拖入到hierarchy中,并且將卡背作為卡牌的子對(duì)象:
完成后記得把卡背的z軸坐標(biāo)調(diào)整為-2某宪,讓卡背在前仿村。
- 2.完成卡牌模板后,給卡片添加script組件Card缩抡,以及碰撞組件(collider 2d):
<pre>
這里先實(shí)現(xiàn)基本功能奠宜,卡背,卡牌的ID瞻想,卡牌點(diǎn)擊方法(先完成點(diǎn)點(diǎn)擊卡背消失)
</pre>
private int id; //卡片的序號(hào)id
public GameObject cardBack; //卡背對(duì)象压真,在unity拖拽賦值
//鼠標(biāo)點(diǎn)擊事件需要在對(duì)象上添加collider組件
void OnMouseDown()
{
cardBack.SetActive(false);
}
- 3.有了模板卡牌后沮脖,可以完成卡牌的隨機(jī)分發(fā)功能了:
為了完成隨機(jī)分發(fā)塔插,需要用到卡牌的設(shè)置方法還有隨機(jī)數(shù)組:
//首先在卡牌的script組件中,添加卡牌的設(shè)置方法SetCard队询,有兩個(gè)參數(shù)佃迄,一個(gè)是id泼差,一個(gè)是sprite
public void SetCard(int id, Sprite fruit)
{
this.id = id;
this.GetComponent<SpriteRenderer>().sprite = fruit;
}
然后在hierarchy中創(chuàng)建一個(gè)空對(duì)象,用來(lái)掛CardManage腳本呵俏,來(lái)負(fù)責(zé)整個(gè)游戲的處理:
//設(shè)置卡牌的數(shù)量堆缘,和精靈的數(shù)量,精靈用拖拽賦值普碎;
private const int CARD_NUMBER = 10;
int[] cardId=new int[CARD_NUMBER];
public Sprite[] fruitSprites=new Sprite[5];
//在CardManage中寫(xiě)上生成隨機(jī)數(shù)組的方法
void ArrayInit(int[] array)
{
//給數(shù)組每一個(gè)元素賦值吼肥,分別為0,0,1,1,2,2,3,3,4,4,5,5
for (int i = 0; i < array.Length; i++)
{
array[i] = i/2;
}
//對(duì)有了初值的數(shù)組做亂序處理,從最后一個(gè)元素往前和隨機(jī)的元素調(diào)換位置。
int swap, temp;
for (int i = array.Length-1; i > 0; i--)
{
swap = Random.Range(0, i);
temp = array[swap];
array[swap] = array[i];
array[i] = temp;
}
}
完成之后再CardManage中的Star方法中缀皱,開(kāi)始生成隨機(jī)卡牌:
//聲明初始的卡牌和后續(xù)用到的實(shí)例化的卡牌對(duì)象
public Card oriCard;
private Card cloneCard;
//每張卡牌的間隔
private int offsetX = 2;
private int offsetY = 2;
// Use this for initialization
void Start()
{
//給oriCard賦值并且記錄初始卡牌的位置信息(startpoz)
oriCard = GameObject.Find("Card").GetComponent<Card>();
Vector3 startPoz = oriCard.transform.position;
ArrayInit(cardId);
//通過(guò)for循環(huán)給所有的卡牌賦值并設(shè)置位置
for (int i = 0; i < CARD_NUMBER; i++)
{
if (i == 0)
{
cloneCard = oriCard;
}
else
{
cloneCard = Instantiate(oriCard);//實(shí)例化卡牌
}
//通過(guò)setCard方法設(shè)置每張卡牌的精靈斗这。
cloneCard.SetCard(cardId[i], fruitSprites[cardId[i]]);
//設(shè)置每張卡牌的位置
cloneCard.transform.position = new Vector3(startPoz.x + offsetX * (i % 5), startPoz.y - offsetY * (i / 5), startPoz.z);
}
}
- 4.隨機(jī)卡牌生成完成之后,就是對(duì)點(diǎn)擊的卡牌進(jìn)行比較啤斗,這個(gè)功能也是在CardManage中完成:
這個(gè)功能分為兩個(gè)步驟:
a表箭,首先是接收鼠標(biāo)點(diǎn)擊了的卡牌;
b钮莲,對(duì)存儲(chǔ)了的卡牌進(jìn)行比較(這里可以通過(guò)卡牌的ID來(lái)進(jìn)行比較)免钻。
//接收鼠標(biāo)點(diǎn)擊的卡牌,這個(gè)在CardManage中完成:
//聲明兩個(gè)空對(duì)象用來(lái)接收點(diǎn)擊的卡牌
public Card first = null;
public Card second = null;
//接收方法
public void ReceiveCard(Card card)
{
if(first==null)
{
first = card;
}
else
{
second = card;
//開(kāi)啟一個(gè)協(xié)程崔拥,當(dāng)兩張卡牌進(jìn)行比較的時(shí)候伯襟,如果不一致,延遲執(zhí)行卡背恢復(fù)的操作握童。
StartCoroutine(Macth(first, second));
}
}
//寫(xiě)好接收的方法后姆怪,在Card中,進(jìn)行調(diào)用:
//首先實(shí)例化CardManage中的腳本
CardManage manage;
private void Awake()
{
manage = GameObject.Find("CardManage").GetComponent<CardManage>();
}
//然后在鼠標(biāo)點(diǎn)擊事件調(diào)用接收方法:
//鼠標(biāo)點(diǎn)擊事件要記得加collider
void OnMouseDown()
{
//接收的條件為澡绩,當(dāng)?shù)诙€(gè)接收的卡牌對(duì)象為空稽揭,并且該次點(diǎn)擊的卡牌是沒(méi)有被點(diǎn)擊過(guò)的。
if(manage.second==null&&cardBack.activeSelf)
{
cardBack.SetActive(false);
manage.ReceiveCard(this);
}
}
完成接收后肥卡,可以進(jìn)行比較了溪掀,這里用到了:
設(shè)置卡背消失方法,這個(gè)是在Card中實(shí)現(xiàn).
比較方法步鉴,這個(gè)是在CardManage中實(shí)現(xiàn)揪胃,
//設(shè)置卡背方法
public void SetBack(bool isTurn)
{
cardBack.SetActive(isTurn);
}
//比較方法,由開(kāi)啟了協(xié)程氛琢,所以需要返回IEnumerator類型的方法
IEnumerator Macth(Card fir,Card sec)
{
if(fir.GetId!=sec.GetId)
{
//程序執(zhí)行到這里的時(shí)候會(huì)等待1秒后在執(zhí)行
yield return new WaitForSeconds(1);
fir.SetBack(true);
sec.SetBack(true);
}
//比較完畢后喊递,清空接受的卡牌
first = null;
second = null;
}
- 5.游戲結(jié)束
當(dāng)卡牌全部翻轉(zhuǎn)過(guò)來(lái)的時(shí)候,則結(jié)束游戲阳似。
//結(jié)束的思路是骚勘,首先設(shè)置一個(gè)判定值,每成功比較出一對(duì)撮奏,加1俏讹,當(dāng)判定值達(dá)到了,則結(jié)束畜吊。
//判定值泽疆,從0開(kāi)始計(jì)數(shù)
int index = 0;
//游戲勝利時(shí)條件
int end = CARD_NUMBER / 2;
//在比較方法中添加一個(gè)判斷,當(dāng)成功時(shí)玲献,index+1殉疼;
IEnumerator Macth(Card fir,Card sec)
{
if (fir.GetId == sec.GetId)
{
index++;
}
}
//最后在Update方法中逗嫡,實(shí)時(shí)進(jìn)行判斷是否滿足勝利條件。
void Update () {
if(index==end)
{
print("游戲勝利~");
index = 0;
}
}
寫(xiě)到這里主體的功能也就完成啦株依,有興趣的話可以增加更多的關(guān)卡。