先來看上次完成與沒完成的部分:
2.
4.左上角是角色生命值,生命值歸零後遊戲結束。
5.角色被禁止離開畫面中,分為三類:左右兩側禁止穿越,畫面最上方會令生命值減少並下掉一層,畫面最下方則是會令角色生命值歸零。
6.最後右上角為計數器或計時器,是回饋給玩家的結果,玩家目的是在生命值歸零之前另計數器的數字越高越好。
第二篇會將4、5、6點完成,角色如何切換左右方向的圖及平台速度種類就另外再寫一篇吧。
1.首先從第5點開始,將上下左右的"牆"建立出來,可以直接從上次建立floor複製過來就好,另外上下兩面牆要將Box Collider 2D底下的Is Trigger打勾,作為之後的條件觸發。
2.將控制角色新增tag,命名為player,再將每一個平台floor新增tag命名為floor,再為每一個floor新增Rigidbody 2D同時將Is Kinematic打勾。
3.建立用來控制角色生命值以及遊戲結束判斷的腳本(RestartController.cs),並宣告角色生命值的變數:
using UnityEngine; using System.Collections; public class RestartController: MonoBehaviour { static public int lifepoint = 3; . . .為上下兩面牆新增以下的腳本:
wallupTrigger.cs為上方牆壁,有物件觸發後將tag為floor的物件移除掉,如果物件tag為player時,將RestartController.cs下的lifepoint減少,在這裡就可以把GameObjectCloneGameObjectClone.cs下平台的移除條件拿掉
。
using UnityEngine; using System.Collections; public class wallupTrigger : MonoBehaviour { void OnTriggerEnter2D(Collider2D collider) { if (collider.tag == "floor") Destroy (collider.gameObject); if (collider.tag == "player") RestartController.lifepoint--; } }walldownTrigger.cs為下方牆壁,物件tag為player將lifepoint變為0。
using UnityEngine; using System.Collections; public class walldownTrigger : MonoBehaviour { void OnTriggerEnter2D(Collider2D collider) { if (collider.tag == "player") RestartController.lifepoint = 0; } }
4.接著是第六點生命值與計數器,新增兩個3D Text作為生命值與計數器的顯示,新增後調整到適合的位置,在這裡擺在左上和右上,將腳本(RestartController.cs)新增至Main Camera下,最後新增下面程式碼到腳本(RestartController.cs)後將3D Text拉到腳本變數下。
using UnityEngine; using System.Collections; public class RestartController : MonoBehaviour { static public int lifepoint = 3; public TextMesh lifeText;////(1) public TextMesh timerText; private float timer = 0; void Update () { timer += Time.deltaTime;/////(2) lifeText.text = "life:"+lifepoint.ToString();////(3) timerText.text = "timer:"+((int)timer).ToString(); . . . } }(1)新增兩個TextMesh分別做為生命值與計數器的變數,另外新增timer做計數器的存取。
(2)在這裡最累計時間的動作。
(3)修改TextMesh底下的text,將lifepoint做為生命值顯示,timer作為計數器顯示。
5.最後來到生命值歸零後遊戲結束的判斷,新增顯示遊戲結束字樣的3D text,將3D text調整到適合的位置後,在腳本(RestartController.cs)內新增下面的程式碼後,將控制角色及遊戲結束的字樣新增至腳本變數下。
using UnityEngine; using System.Collections; public class RestartController : MonoBehaviour { static public int lifepoint = 3; public TextMesh lifeText; public TextMesh timerText; private float timer = 0; public GameObject player;////(1) public TextMesh GameOverText; void Update () { timer += Time.deltaTime; lifeText.text = "life:"+lifepoint.ToString(); timerText.text = "timer:"+((int)timer).ToString(); GameOverText.text = "";////(2) if (lifepoint <= 0)////(3) { player.SetActive(false); GameOverText.text = "遊戲結束 按R重新開始"; if (Input.GetKey (KeyCode.R))////(4) { player.SetActive(true); player.transform.position = new Vector3 (0, 2, -5); RestartController.lifepoint = 3; timer = 0; } } } }
(1)新增GameObject和TextMesh變數分別存放 控制角色及遊戲結束的字樣。
(2)在遊戲進行中時,不顯示任何字樣。
(3)當生命值歸0時,將控制角色的SetActive設為false,也就是將控制角色底下的腳本、貼圖等等一切關掉,會無法控制並且不顯示,接著將顯示"遊戲結束 按R重新開始"的文字提醒玩家可以透過R鍵重新開始遊戲。
(4)當玩家依照畫面顯示按下R後,將角色SetActive設為true,打開角色後,重新設定角色初始位置、生命值和計時器。
看來要多寫一篇了,但扣除一些小細節現階段已經算是一個玩得起來的小遊戲,雖然很陽春就是了,同樣的再次感謝角色素材提供:
王國興亡記-少年冒險者 by そーいち
http://makapri.web.fc2.com/top.html
另外其他素材是靠google圖片搜尋來的,來源不可考但同樣的謝謝你們。
The object of type 'GameObject' has been destroyed but you are still trying to access it.
回覆刪除你好我會出現這個 是甚麼原因我都找不到...
The object of type 'GameObject' has been destroyed but you are still trying to access it.
回覆刪除你好我會出現這個 是甚麼原因我都找不到...