2016年8月5日 星期五

【Unity】轉珠系統製作Part.3 - 珠子消除判斷與Combo建立

Part.2    Part.4

在上一篇我們做了同屬性珠子的相連判斷並建立群組,接下來要在各群組中找到符合消除條件的珠子並做上記號,下圖是這次的目標。
將同群組中行或列相連大於3顆的珠子標記消除,同時儲存該combo的屬性及珠子數。

首先是Orb腳本新增的變數。
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
public class Orb : MonoBehaviour
{
    .
    .
    .
    public bool removed = false;
    public Text removeText;
    void Start()
    {
        .
        .
        .
    }
}
Orb腳本宣告布林變數removed來對珠子是否消除做判斷,Text變數則是在珠子上做消除的文字記號,如上圖珠子左上角顯示的紅字C。

接下來是PuzzleSystem腳本。
using UnityEngine;
using System.Collections.Generic;
public class PuzzleSystem : MonoBehaviour
{
    .
    .
    .
    public int removeCount = 3;////(1)
    [System.Serializable]
    public struct Combo////(2)
    {
        public Orb.OrbsType type;
        public int count;
    };
    public Combo [] orbCombo;////(3)

    void Start()
    {
        InitGrid();
        OrbGroup();
        OrbCombo();
    }
    void InitGrid(){...}
    void OrbCreate(Orb orb){...}
    void FindMembers(Orb orb, int groupNum){...}
    void OrbGroup(){...}

    void FindRemoveOrb(Orb orb, int dir, int length, int comboIndex)////(4)
    {

    }
    void OrbCombo()////(5)
    {
        orbCombo = new Combo[orbGroups.Count];////(6)
        foreach (List<Orb> orbGroup in orbGroups)////(7)
        {
            int comboIndex = orbGroups.IndexOf(orbGroup);////(8)
            orbCombo[comboIndex].type = orbGroup[0].type;////(9)
            orbCombo[comboIndex].count = 0;////(10)
            foreach (Orb orb in orbGroup)////(11)
            {
                FindRemoveOrb(orb, 1, columnCount * (orb.row + 1) - 1, comboIndex);////(12)
                FindRemoveOrb(orb, columnCount, columnCount * (rowCount - 1) + orb.column, comboIndex);////(13)
            }
        }
    }
}
(1)宣告珠子消除的數量門檻,這裡為3,當然可以調整成2消或4消,依個人狀況而定。
(2)宣告Combo結構,包含珠子的OrbsType變數,和計算該combo中消除珠子的總數量。
(3)宣告Combo陣列orbCombo
(4)宣告FindRemoveOrb函式,參數依序為珠子(orb)、搜尋方向(dir)、搜尋長度(length)、combo編號(comboIndex),至於函式內容會在下面談到。
(5)宣告OrbCombo函式,並在Start中呼叫。
(6)初始化orbCombo陣列,大小與總群組數相同。
(7)針對珠子總群組執行foreach迴圈。
(8)宣告整數變數comboIndex,數值為當前群組編號。
(9)將當前combo的珠子屬性設定為當前群組屬性。
(10)combo的珠子數量為0。
(11)接著針對當前群組執行foreach迴圈。
(12)往右搜尋,呼叫FindRemoveOrb函式參數為珠子orb、搜尋方向為右方1、搜尋長度為該列最右邊的珠子、combo編號為comboIndex。
(13)往上搜尋,呼叫FindRemoveOrb函式參數為珠子orb、搜尋方向為上方columnCount、搜尋長度為該行最上面的珠子、combo編號為comboIndex。

再來是FindRemoveOrb函式中的內容。
void FindRemoveOrb(Orb orb, int dir, int length, int comboIndex)
{
    int orbCount = 0;////(1)
    int orbIndex = orbs.IndexOf(orb);////(2)
    for (int index = orbIndex; index <= length; index += dir) {////(3)
        if (orbs[index].type == orb.type)////(4)
            orbCount++;
        else////(5)
            break;
    }
    if (orbCount >= removeCount)////(6)
    {
        for (int index = orbIndex; index < orbIndex + (orbCount * dir); index += dir)////(7)
        {
            if (orbs[index].removed == false)////(8)
                orbCombo[comboIndex].count += 1;
            orbs[index].removed = true;////(9)
            orbs[index].removeText.text = "C";////(10)
        }
    }
}
(1)宣告用來計算相連珠子數量的整數orbCount,初始值為0。
(2)宣告珠子編號orbIndex。
(3)執行迴圈,從傳入的珠子編號開始、到傳入的搜尋長度結束、增加數值為搜尋方向。
(4)當傳入的珠子屬性與當下的珠子屬性相同時、orbCount加1。
(5)若(4)的條件不成立,表示已經找完相連的珠子,就可以結束迴圈。
(6)當orbCount大於消除門檻removeCount時。
(7)執行for迴圈,起點與方向相同,但這次搜尋只到orbCount數量為止。
(8)當前珠子的removed為false時,將對應combo下的count加1,以計算該combo總數
(9)將當前珠子的removed設為true,這時該顆珠子就會被視為需要消除的珠子。
(10)修改Text,會顯示於執行結果中。

最後執行看看,為了安全起見跑個10次結果。
http://imgur.com/mlZsadx
http://imgur.com/ixUbo3V
http://imgur.com/6GTct5q
http://imgur.com/Kn3KDNj
http://imgur.com/AjKrbvc
http://imgur.com/45KdL5v
http://imgur.com/gytSuyG
http://imgur.com/xWaOunu
http://imgur.com/GGcktDf
http://imgur.com/BwnS2NI

沒想到頭兩次都沒Combo,害我以為寫錯了‧
以上就是珠子消除判斷與Combo建立的說明,接下來會真的把這些珠子消除,然後剩餘珠子掉落,最後針對空格生成珠子。
這次就到這裡。

沒有留言:

張貼留言

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...