unity實(shí)現(xiàn)貪吃蛇游戲
unity貪吃蛇基本原理實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
原理:
1、每個(gè)身體跟著前面的身體移動(dòng);
2、蛇頭自動(dòng)一直向前走,可以向左或者向右轉(zhuǎn)彎。
思想:
貪吃蛇的身體有若干個(gè),每個(gè)身體有共同的特性,就是跟著前面的身體移動(dòng),這里把蛇的身體抽象出出來(lái),用一個(gè)SnackBody類來(lái)表達(dá),每一節(jié)身體都new出一個(gè)SnackBody對(duì)象,然后操作這個(gè)對(duì)象實(shí)現(xiàn)功能;蛇頭可以看做特殊的蛇身體。應(yīng)該有一個(gè)管理器來(lái)管理所有的蛇身體,所以有個(gè)SnackController類來(lái)管理。每段蛇身都有Front,self,oldPos三個(gè)屬性。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SnackBody
{
public SnackBody front; //表示 前一段蛇身
public Transform self; //表示 當(dāng)前蛇身
Vector3 oldPos; //當(dāng)前蛇身的前一個(gè)位置
public SnackBody(SnackBody tmpFront, Transform tmpSelf)
{
front = tmpFront;
self = tmpSelf;
oldPos = tmpSelf.position;
}
//這一節(jié)蛇身已經(jīng)向前移動(dòng)了,更新oldPos
public void Reflash()
{
oldPos = this.self.position;
}
//跟著前面的蛇身
public void FollowFront()
{
self.position = front.oldPos; //更新蛇身的位置
front.Reflash();
}
public virtual void MoveForward(){}
}
public class SnackHead : SnackBody
{
//繼承基類
public SnackHead(SnackBody tmpFront,Transform tmpSelf):base(tmpFront,tmpSelf)
{
}
public override void MoveForward()
{
self.Translate(-self.forward, Space.World);
}
/// <summary>
/// 向右移動(dòng)
/// </summary>
public void TurnRight()
{
Vector3 tmpAngle = self.localEulerAngles;
tmpAngle.y += 90;
self.localEulerAngles = tmpAngle;
}
/// <summary>
/// 向左移動(dòng)
/// </summary>
public void TurnLeft()
{
Vector3 tmpAngle = self.localEulerAngles;
tmpAngle.y -= 90;
self.localEulerAngles = tmpAngle;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SnackController : MonoBehaviour {
List<SnackBody> allBodys; //存儲(chǔ)所有的蛇身
public Transform snackHead;
public Transform bodyOne;
public Transform bodyTwo;
// Use this for initialization
void Start () {
allBodys = new List<SnackBody>();
SnackHead tmpHead = new SnackHead(null, snackHead);
allBodys.Add(tmpHead);
SnackBody tmpOneBody = new SnackBody(tmpHead, bodyOne);
allBodys.Add(tmpOneBody);
SnackBody tmpTwoBody = new SnackBody(tmpOneBody, bodyTwo);
allBodys.Add(tmpTwoBody);
StartCoroutine(MoveFront());
}
IEnumerator MoveFront()
{
while(true) //用一個(gè)死循環(huán)來(lái)讓蛇一直移動(dòng)
{
allBodys[0].MoveForward();
yield return new WaitForSeconds(0.5f);
for(int i=1;i<allBodys.Count; i++)
{
allBodys[i].FollowFront();
yield return new WaitForSeconds(0.2f);
}
}
}
// Update is called once per frame
void Update () {
if(Input.GetKeyDown(KeyCode.A))
{
((SnackHead)allBodys[0]).TurnLeft();
}
if (Input.GetKeyDown(KeyCode.D))
{
((SnackHead)allBodys[0]).TurnRight();
}
}
}

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Jquery+Ajax+Json+存儲(chǔ)過(guò)程實(shí)現(xiàn)高效分頁(yè)
這篇文章主要介紹Jquery+Ajax+Json+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè),需要的朋友可以參考下2015-08-08
C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法
這篇文章主要介紹了C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法,較為詳細(xì)的分析了DeflateStream方法對(duì)文件進(jìn)行壓縮及解壓縮的步驟與技巧,需要的朋友可以參考下2015-04-04
C#判斷字符串中內(nèi)容是否為純數(shù)字的詳細(xì)教程
在進(jìn)行C#編程時(shí)候,有的時(shí)候我們需要判斷一個(gè)字符串是否是數(shù)字字符串,下面這篇文章主要給大家介紹了關(guān)于C#判斷字符串中內(nèi)容是否為純數(shù)字的詳細(xì)教程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
C#實(shí)現(xiàn)的調(diào)用DOS命令操作類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的調(diào)用DOS命令操作類,實(shí)例分析了C#調(diào)用系統(tǒng)常用DOS命令的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(PagedList.Mvc)
這篇文章主要介紹了ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(原名為PagedList.Mvc),需要的朋友可以參考下2014-10-10
C#使用log4net結(jié)合sqlite數(shù)據(jù)庫(kù)實(shí)現(xiàn)記錄日志
因?yàn)榻Y(jié)構(gòu)化的數(shù)據(jù)庫(kù)存儲(chǔ)的日志信息,可以寫專門的軟件讀取歷史日志信息,通過(guò)各種條件篩選,可操作性極大增強(qiáng),有這方面需求的開(kāi)發(fā)人員可以考慮,本文給大家介紹了C#使用log4net結(jié)合sqlite數(shù)據(jù)庫(kù)記錄日志,需要的朋友可以參考下2024-10-10
c#調(diào)用存儲(chǔ)過(guò)程實(shí)現(xiàn)登錄界面詳解
2013-03-03

