unity實現簡單貪吃蛇遊戲
阿新 • • 發佈:2020-04-17
本文例項為大家分享了unity實現貪吃蛇遊戲的具體程式碼,供大家參考,具體內容如下
首先建立一個頭部,編寫指令碼利用WASD控制頭部的移動。
Vector3 up=new Vector3(0,1,0); Vector3 down=new Vector3(0,-1,0); Vector3 left=new Vector3(-1,0); Vector3 right=new Vector3(1,0); Vector3 now;//頭部實際前進方向 float timer=0f; float timerGap=0.1f; void Start () { now = up; } void Update () { if (now!=up&&now!=down&&Input.GetKey (KeyCode.W)) { now = up; } if (now!=up&&now!=down&&Input.GetKey (KeyCode.S)) { now = down; } if (now!=left&&now!=right&&Input.GetKey (KeyCode.A)) { now=left; } if (now!=left&&now!=right&&Input.GetKey (KeyCode.D)) { now = right; } timer += Time.deltaTime; if (timer > timerGap) { //每隔0.1s向當前方向移動一個單位(0.5為頭部大小)。 timer = 0; transform.position = 0.5f * now + transform.position; } }
然後就是建立初始身體,實現身體跟隨頭部。採用的方法是將身體放進一個數組,然後下標0的身體移動到頭部之前的位置,然後下標 i 的身體移動到 i-1 的position。
建立初始身體,並放入陣列。
public GameObject body;//身體預設體 List<GameObject> snakeBody = new List<GameObject>(); void Awake() { for (int i = 0; i < 3; ++i) { GameObject newbodynext=Instantiate (body,transform.position-(i+1)*new Vector3(0,0.5f,0),Quaternion.identity)as GameObject; snakeBody.Add (newbodynext); } }
實現跟隨
void Update () { if (now!=up&&now!=down&&Input.GetKey (KeyCode.W)) { now = up; } if (now!=up&&now!=down&&Input.GetKey (KeyCode.S)) { now = down; } if (now!=left&&now!=right&&Input.GetKey (KeyCode.A)) { now=left; } if (now!=left&&now!=right&&Input.GetKey (KeyCode.D)) { now = right; } timer += Time.deltaTime; if (timer > timerGap) { Vector3 tmpPosition = transform.position;//記錄頭部變化前的位置 List<Vector3> tmpList = new List<Vector3> ();//記錄身體變化前的位置 for (int i = 0; i < snakeBody.Count; ++i) { tmpList.Add (snakeBody [i].transform.position); } timer = 0; transform.position = 0.5f * now + transform.position; snakeBody [0].transform.position = tmpPosition;//將0移到頭部之前的位置 //依次前移身體的位置 for (int i = 1; i < snakeBody.Count; ++i) { snakeBody [i].transform.position = tmpList [i - 1]; } } }
初始蛇建立好後,就開始新增食物,和增長蛇的身體。還有檢測遊戲失敗,即撞到身體或者邊界,採用事件觸發檢測完成。
建立食物
public GameObject foodPrefab;//食物預設體 void Start () { now = up; createFood (); } void createFood() { float x = Random.Range(-6.5f,6.5f); float y = Random.Range(-4.5f,4.5f); Instantiate(foodPrefab,new Vector3(x,y,0f),Quaternion.identity); }
觸發檢測
void OnTriggerEnter(Collider other) { //這個other就是被碰撞體 if (other.gameObject.tag.Equals("Food")) { Destroy(other.gameObject); GameObject newbodynext = Instantiate (body,snakeBody[snakeBody.Count-1].transform.position,Quaternion.identity)as GameObject; snakeBody.Add (newbodynext);//增加蛇的身體 createFood(); } else if(other.gameObject.tag.Equals("Body")) { SceneManager.LoadScene("Snake",LoadSceneMode.Single);//重新開始 } } void OnTriggerExit(Collider other) { if (other.gameObject.tag.Equals("Boundary")) SceneManager.LoadScene("Snake",LoadSceneMode.Single); }
完整程式碼
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class HeadMove : MonoBehaviour { public GameObject body; public GameObject foodPrefab; Vector3 up=new Vector3(0,0); Vector3 down=new Vector3(0,0); Vector3 left=new Vector3(-1,0); Vector3 right=new Vector3(1,0); Vector3 now; float timer=0f; float timerGap=0.1f; List<GameObject> snakeBody = new List<GameObject>(); // Use this for initialization void Awake() { for (int i = 0; i < 3; ++i) { GameObject newbodynext=Instantiate (body,Quaternion.identity)as GameObject; snakeBody.Add (newbodynext); } } void Start () { now = up; createFood (); } void createFood() { float x = Random.Range(-6.5f,Quaternion.identity); } // Update is called once per frame void Update () { if (now!=up&&now!=down&&Input.GetKey (KeyCode.W)) { now = up; } if (now!=up&&now!=down&&Input.GetKey (KeyCode.S)) { now = down; } if (now!=left&&now!=right&&Input.GetKey (KeyCode.A)) { now=left; } if (now!=left&&now!=right&&Input.GetKey (KeyCode.D)) { now = right; } timer += Time.deltaTime; if (timer > timerGap) { Vector3 tmpPosition = transform.position; List<Vector3> tmpList = new List<Vector3> (); for (int i = 0; i < snakeBody.Count; ++i) { tmpList.Add (snakeBody [i].transform.position); } timer = 0; transform.position = 0.5f * now + transform.position; snakeBody [0].transform.position = tmpPosition; for (int i = 1; i < snakeBody.Count; ++i) { snakeBody [i].transform.position = tmpList [i - 1]; } } } void OnTriggerEnter(Collider other) { //這個other就是被碰撞體 if (other.gameObject.tag.Equals("Food")) { Destroy(other.gameObject); GameObject newbodynext = Instantiate (body,Quaternion.identity)as GameObject; snakeBody.Add (newbodynext); createFood(); } //由於身體和頭部一開始就接觸,所以將身體的碰撞半徑減小到0.4 else if(other.gameObject.tag.Equals("Body")) { SceneManager.LoadScene("Snake",LoadSceneMode.Single); } } void OnTriggerExit(Collider other) { if (other.gameObject.tag.Equals("Boundary")) SceneManager.LoadScene("Snake",LoadSceneMode.Single); } }
將該指令碼掛載在頭部物件上然後新增身體和食物預設體,再新增邊界即可。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。