在上一篇中我們建立了combo陣列,同時也標記了要消除的珠子,接下來要實際做珠子消除、落下和生成,下面是分階段顯示這次的目標。
上圖動作做完後,再回到分群組的步驟直到沒combo為止,就可以得到以下結果。
可以生成一個無combo的初始化盤面,這就是本篇的目標。
首先是PuzzleSystem腳本的新增變數和程式碼修改。
using UnityEngine;
using System.Collections.Generic;
public class PuzzleSystem : MonoBehaviour
{
.
.
.
public bool hasRemove = false;////(1)
void Start()
{
InitGrid();
do {////(2)
hasRemove = false;
OrbCreate();
OrbGroup();
OrbCombo();
OrbRemove();
} while (hasRemove);
}
void InitGrid()
{
.
.
.
for (int r = 0; r < rowCount; r++)
{
for (int c = 0; c < columnCount; c++)
{
.
.
.
//orb data init
Orb orb = orbObj.GetComponent<Orb>();
orb.type = Orb.OrbsType.Null;////(3)
.
.
.
}
}
.
.
.
}
void OrbCreate()
{
foreach (Orb orb in orbs)////(4)
{
orb.group = false;////(5)
orb.removed = false;////(6)
if (orb.type == Orb.OrbsType.Null)////(7)
{
int typeNum = Random.Range(0, (int)Orb.OrbsType.Null);
orb.type = (Orb.OrbsType)typeNum;
}
}
}
.
.
.
void OrbRemove() {...}////(8)
}
(1)新增布林變數hasRemove,用來判斷是否要重複執行找群組、combo等等動作。(2)將Start中呼叫的函式丟到do while迴圈中,除了盤面初始化以外,依序為珠子屬性生成、找群組、找Combo、珠子消除與落下。
(3)修正在InitGrid中呼叫OrbCreate的地方,改成帶入Null屬性。
(4)對orbs執行foreach迴圈。
(5)初始化group變數。
(6)初始化removed變數。
(7)當珠子屬性為Null時,賦予新的屬性。
(8)宣告OrbRemove函式用來處理珠子消除與落下。
接著是OrbRemove函式的內容。
void OrbRemove()
{
foreach (Orb orb in orbs)////(1)
{
if (orb.removed == true)
{
orb.type = Orb.OrbsType.Null;////(2)
hasRemove = true;////(3)
orb.removeText.text = "";////(4)
}
orb.groupNum.text = "";////(5)
}
foreach (Orb orb in orbs)////(6)
{
if (orb.type == Orb.OrbsType.Null)////(7)
{
for (int index = orbs.IndexOf(orb); index <= columnCount * (rowCount - 1) + orb.column; index += columnCount)////(8)
{
if (orbs[index].type != Orb.OrbsType.Null)////(9)
{
orb.type = orbs[index].type;////(10)
orbs[index].type = Orb.OrbsType.Null;////(11)
break;////(12)
}
}
}
}
}
(1)針對每一個珠子重設屬性。(2)當找到珠子為需要被移除的狀態,把珠子的屬性修改為Null。
(3)同時將hasRemove設為true,這時Start中的while迴圈就會再次執行。
(4)重設珠子群組的text,text元件與程式碼在整個流程確定沒問題後就可以刪除。
(5)同(4)。
(6)針對每一個珠子做掉落判定。
(7)當找到屬性為Null時。
(8)往珠子的上方搜尋。
(9)當找到非Null屬性的珠子時。
(10)把當前珠子屬性設定為該珠子的屬性。
(11)將該珠子設定為Null屬性。
(12)設定完屬性就代表該珠子掉落完成,結束往上搜尋的迴圈。
以上就是珠子消除、落下和生成的說明,之後或許會有程式碼修改,但邏輯上應該是不會變的,到這裡初始化盤面就算完成了,接下來是轉珠的部分。
這次就到這裡。


想問如何加入消除的聲音
回覆刪除