您好,登錄后才能下訂單哦!
這篇文章主要講解了unity使用鏈表實(shí)現(xiàn)貪吃蛇游戲的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
要實(shí)現(xiàn)的功能很簡(jiǎn)單,按下空格鍵使蛇加長(zhǎng)一節(jié),每次按下空格就在蛇尾加一個(gè)cube。按下左方向鍵,控制蛇的移動(dòng)。如圖所示:
//貪吃蛇的中心是:定義蛇身第一節(jié),即鏈表頭為temp。鏈表的子節(jié)點(diǎn)為next。蛇頭帶著temp(鏈表頭)走,temp帶著next(鏈表子節(jié)點(diǎn))走。
1. 創(chuàng)建一個(gè)cube設(shè)為預(yù)設(shè)體,作為蛇身的節(jié)點(diǎn)。在預(yù)設(shè)體上面添加BodyScript腳本。
using UnityEngine; using System.Collections; using UnityEngine.UI; public class BodyScript : MonoBehaviour { //創(chuàng)建子物體的連接節(jié)點(diǎn)(next節(jié)點(diǎn)從鏈表的第二個(gè)元素開始,next是從算上蛇頭的第三節(jié)開始) //用來(lái)接收物體的臨時(shí)位置 private Vector3 myPos; /// <summary> /// 移動(dòng)方法 /// </summary> /// <param name="pos">pos</param> public void Move(Vector3 pos) { //將移動(dòng)之前的位置記錄下來(lái) myPos = transform.position; //更新物體位置--傳進(jìn)來(lái)的父物體的位置坐標(biāo) transform.position = pos; //如果當(dāng)前cube還有子節(jié)點(diǎn),不是蛇尾最后一節(jié) if (next != null) { //將子物體移動(dòng)到父物體的位置 next.Move(myPos); } } }
2.在Hierarchy面板上,創(chuàng)建一個(gè)cube作為蛇頭。添加一個(gè)SnakeMove腳本。來(lái)控制蛇頭并且創(chuàng)建鏈表。
using UnityEngine; using System.Collections; using UnityEngine.UI; public class SnakeMove : MonoBehaviour { //Cube預(yù)設(shè)體 public GameObject body_prefab; //聲明一個(gè)計(jì)時(shí)器 float timer = 0; //實(shí)例化蛇身的第一節(jié)。算上蛇頭的第二節(jié)(即鏈表的第一個(gè)節(jié)點(diǎn)) public BodyScript temp; //指向最后生成的節(jié)點(diǎn)(相當(dāng)于指針,始終指向蛇尾) public BodyScript point; void Update () { //計(jì)時(shí)器 timer += Time.deltaTime; //每隔0.2秒來(lái)執(zhí)行移動(dòng) if(timer >= 0.2f) { //移動(dòng) Move(); //計(jì)時(shí)器清零 timer = 0; } //如果按下左方向鍵 if(Input.GetKeyDown(KeyCode.LeftArrow)) { //向左旋轉(zhuǎn) transform.Rotate(Vector3.up, -90); } //如果按下空格 if (Input.GetKeyDown(KeyCode.Space)) { //實(shí)例化一個(gè)cube,作為蛇身的下一節(jié)(先把新生成的cube放置到視野外,現(xiàn)在還沒(méi)有把新生成的cube接到蛇身上) GameObject newBody = Instantiate(body_prefab, new Vector3(444, 0, 0), Quaternion.identity) as GameObject; //若子物體的節(jié)點(diǎn)為空(只有蛇頭的情況下,第一次按下空格,滿足這個(gè)if條件) if (temp == null) { //temp賦值。這時(shí)候,蛇身有了第一節(jié),鏈表的第一個(gè)元素產(chǎn)生。 temp = newBody.GetComponent<BodyScript>(); //將指針指向蛇身的第一節(jié)(因?yàn)榇藭r(shí)只有一節(jié)身體) point = temp; } //第二次,第三次生成時(shí) else { point.next = newBody.GetComponent<BodyScript>(); //指向下一個(gè)物體的位置 point = point.next; } } } //創(chuàng)建接收物體的坐標(biāo) Vector3 pos; void Move() { //獲取當(dāng)前物體的坐標(biāo) pos = transform.position; //默認(rèn)向前移動(dòng) transform.Translate(Vector3.forward); //若鏈表頭不為空(就是蛇身第一個(gè)cube生成了) if (temp != null) { //執(zhí)行子物體移動(dòng)的方法(鏈表頭開始移動(dòng)) //貪吃蛇的重點(diǎn)是,蛇頭的移動(dòng)帶動(dòng)鏈表頭的移動(dòng),鏈表頭再帶動(dòng)鏈表里的子節(jié)點(diǎn)移動(dòng) temp.Move(pos); } } }
看完上述內(nèi)容,是不是對(duì)unity使用鏈表實(shí)現(xiàn)貪吃蛇游戲的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。