void Start()
{
if (isServer)
{
gm = GameObject.Find("GM").GetComponent<GM>();
gm.Login(this);
}
if (isLocalPlayer)
{
txtSysMsg = GameObject.Find("txtSysMsg").GetComponent<Text>();★
txtMunber = GameObject.Find("txtMunber").GetComponent<Text>();
btnAddOne = GameObject.Find("btn1").GetComponent<Button>();
btnAddTwo = GameObject.Find("btn2").GetComponent<Button>();
btnAddOne.onClick.AddListener(() => CmdAddMunbers(1));
btnAddTwo.onClick.AddListener(() => CmdAddMunbers(2));
}
}
void Update()
{
if (isServer)
Munber = gm.Mumber;
if (isLocalPlayer)
{
txtSysMsg.text = SysMsg;★
txtMunber.text = Munber.ToString();
}
}
public Round round = Round.non;
public Process process = Process.start;
int roundCount = 0;
void Start()
{
process = Process.waitLogin;
}
void Update()
{
switch (process)
{
case Process.waitLogin:
foreach (Player pl in allPlayer)
pl.SysMsg = "等待玩家連線...";
break;
case Process.decidePlayer:
roundCount++;
if (roundCount % 2 == 1)
{
round = Round.player1;
process = Process.p1Action;
}
else
{
round = Round.player2;
process = Process.p2Action;
}
break;
case Process.p1Action:
allPlayer[0].SysMsg = "輪到你了!";
allPlayer[0].SetProcess(Player.Process.action);
allPlayer[1].SysMsg = "等待對方...";
allPlayer[1].SetProcess(Player.Process.wait);
break;
case Process.p2Action:
allPlayer[1].SysMsg = "輪到你了!";
allPlayer[1].SetProcess(Player.Process.action);
allPlayer[0].SysMsg = "等待對方...";
allPlayer[0].SetProcess(Player.Process.wait);
break;
case Process.checkWin:
switch (round)
{
case Round.player1:
allPlayer[0].SysMsg = "Winner";
allPlayer[1].SysMsg = "Loser";
break;
case Round.player2:
allPlayer[1].SysMsg = "Winner";
allPlayer[0].SysMsg = "Loser";
break;
}
allPlayer[0].SetProcess(Player.Process.end);
allPlayer[1].SetProcess(Player.Process.end);
process = Process.end;
break;
}
}
這裡可以發現每個流程都有相對應的case區塊去做處理
首先在遊戲啟動時Start()會先把流程狀態切換成waitLogin,用foreach的方式來告訴已經登入的玩家,目前正等待第2個玩家
那流程狀態如何從 waitLogin 切換到正式開始遊戲呢
要在GM.cs裡的 AddPlayer()增加判斷
public void AddPlayer(ClientLogic cl)
{
if (process == Process.waitPlayer)
{
Players.Add(cl);
if (Players.Count == 2)
process = Process.decidePlayer;
}
}
這樣只要登入玩家有兩個的時候,流程狀態就會變成decidePlayer,就是遊戲正式開始囉
接著在decidePlayer中,主要的任務是決定現在是誰的回合
1.roundCount從0開始每回合+1,用%2來取除以2的餘數
2.如果餘數是1就是玩家1的回合,餘數是0就是玩家2的回合
3.決定是誰的回合後,流程狀態就會切換p1Action或是p2Action
在p1Action主要任務是讓玩家1的Player.cs的流程狀態切換為Action,玩家2則是wait
並發"送輪到你了~"或是"等待對方的訊息",反過來也是一樣
而且玩家只有在自己的回合才能喊數字,為了達成這樣的效果,我們要在Player.cs的CmdAddMunbers()裡增加一行判斷
[Command]
public void CmdAddMunbers(int addMun)
{
if (process == Process.action)★
gm.AddMunber(addMun);
}
玩家的流程狀態要在action時按下按鈕才能喊數字,其他的流程狀態喊是沒有用的喔。
玩家喊完數字(+1或+2)的時候,就要換另外一位玩家的回合,流程狀態也就接著改變,所以要在GM.cs裡的AddMunber()裡增加一行
public void AddMunber(int addMun)
{
Mumber += addMun;
process = Process.decidePlayer;★
}
這樣的話每當玩家喊了數字以後在GM.cs這裡的流程狀態就會變成decidePlayer,經過roundCount的計算與判斷後,就換下一個玩家的回合。
直到數字是20! 那喊到20的那位玩家就贏了,那繼續在AddMunber()裡增加幾行