unity使用鏈表實現(xiàn)貪吃蛇游戲
今天介紹一下如何利用鏈表結(jié)構(gòu)來創(chuàng)建一條貪吃蛇。
要實現(xiàn)的功能很簡單,按下空格鍵使蛇加長一節(jié),每次按下空格就在蛇尾加一個cube。按下左方向鍵,控制蛇的移動。如圖所示:
//貪吃蛇的中心是:定義蛇身第一節(jié),即鏈表頭為temp。鏈表的子節(jié)點為next。蛇頭帶著temp(鏈表頭)走,temp帶著next(鏈表子節(jié)點)走。
1. 創(chuàng)建一個cube設(shè)為預(yù)設(shè)體,作為蛇身的節(jié)點。在預(yù)設(shè)體上面添加BodyScript腳本。
using UnityEngine; using System.Collections; using UnityEngine.UI; public class BodyScript : MonoBehaviour { //創(chuàng)建子物體的連接節(jié)點(next節(jié)點從鏈表的第二個元素開始,next是從算上蛇頭的第三節(jié)開始) //用來接收物體的臨時位置 private Vector3 myPos; /// <summary> /// 移動方法 /// </summary> /// <param name="pos">pos</param> public void Move(Vector3 pos) { //將移動之前的位置記錄下來 myPos = transform.position; //更新物體位置--傳進(jìn)來的父物體的位置坐標(biāo) transform.position = pos; //如果當(dāng)前cube還有子節(jié)點,不是蛇尾最后一節(jié) if (next != null) { //將子物體移動到父物體的位置 next.Move(myPos); } } }
2.在Hierarchy面板上,創(chuàng)建一個cube作為蛇頭。添加一個SnakeMove腳本。來控制蛇頭并且創(chuàng)建鏈表。
using UnityEngine; using System.Collections; using UnityEngine.UI; public class SnakeMove : MonoBehaviour { //Cube預(yù)設(shè)體 public GameObject body_prefab; //聲明一個計時器 float timer = 0; //實例化蛇身的第一節(jié)。算上蛇頭的第二節(jié)(即鏈表的第一個節(jié)點) public BodyScript temp; //指向最后生成的節(jié)點(相當(dāng)于指針,始終指向蛇尾) public BodyScript point; void Update () { //計時器 timer += Time.deltaTime; //每隔0.2秒來執(zhí)行移動 if(timer >= 0.2f) { //移動 Move(); //計時器清零 timer = 0; } //如果按下左方向鍵 if(Input.GetKeyDown(KeyCode.LeftArrow)) { //向左旋轉(zhuǎn) transform.Rotate(Vector3.up, -90); } //如果按下空格 if (Input.GetKeyDown(KeyCode.Space)) { //實例化一個cube,作為蛇身的下一節(jié)(先把新生成的cube放置到視野外,現(xiàn)在還沒有把新生成的cube接到蛇身上) GameObject newBody = Instantiate(body_prefab, new Vector3(444, 0, 0), Quaternion.identity) as GameObject; //若子物體的節(jié)點為空(只有蛇頭的情況下,第一次按下空格,滿足這個if條件) if (temp == null) { //temp賦值。這時候,蛇身有了第一節(jié),鏈表的第一個元素產(chǎn)生。 temp = newBody.GetComponent<BodyScript>(); //將指針指向蛇身的第一節(jié)(因為此時只有一節(jié)身體) point = temp; } //第二次,第三次生成時 else { point.next = newBody.GetComponent<BodyScript>(); //指向下一個物體的位置 point = point.next; } } } //創(chuàng)建接收物體的坐標(biāo) Vector3 pos; void Move() { //獲取當(dāng)前物體的坐標(biāo) pos = transform.position; //默認(rèn)向前移動 transform.Translate(Vector3.forward); //若鏈表頭不為空(就是蛇身第一個cube生成了) if (temp != null) { //執(zhí)行子物體移動的方法(鏈表頭開始移動) //貪吃蛇的重點是,蛇頭的移動帶動鏈表頭的移動,鏈表頭再帶動鏈表里的子節(jié)點移動 temp.Move(pos); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實現(xiàn)將HTML轉(zhuǎn)換成純文本的方法
這篇文章主要介紹了C#實現(xiàn)將HTML轉(zhuǎn)換成純文本的方法,基于自定義類實現(xiàn)文本轉(zhuǎn)換功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07C#關(guān)于System.Collections空間詳解
這篇文章主要介紹了C#關(guān)于System.Collections空間,需要的朋友可以參考下2014-07-07C# byte數(shù)組與Image相互轉(zhuǎn)換的方法
這篇文章介紹了C# byte數(shù)組與Image相互轉(zhuǎn)換的方法,有需要的朋友可以參考一下2013-10-10