unity贪吃蛇基本原理实现,供大家参考,具体内容如下
原理:
1、每个身体跟着前面的身体移动;
2、蛇头自动一直向前走,可以向左或者向右转弯。
思想:
贪吃蛇的身体有若干个,每个身体有共同的特性,就是跟着前面的身体移动,这里把蛇的身体抽象出出来,用一个snackbody类来表达,每一节身体都new出一个snackbody对象,然后操作这个对象实现功能;蛇头可以看做特殊的蛇身体。应该有一个管理器来管理所有的蛇身体,所以有个snackcontroller类来管理。每段蛇身都有front,self,oldpos三个属性。

using system.collections;
using system.collections.generic;
using unityengine;
public class snackbody
{
public snackbody front; //表示 前一段蛇身
public transform self; //表示 当前蛇身
vector3 oldpos; //当前蛇身的前一个位置
public snackbody(snackbody tmpfront, transform tmpself)
{
front = tmpfront;
self = tmpself;
oldpos = tmpself.position;
}
//这一节蛇身已经向前移动了,更新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>
/// 向右移动
/// </summary>
public void turnright()
{
vector3 tmpangle = self.localeulerangles;
tmpangle.y += 90;
self.localeulerangles = tmpangle;
}
/// <summary>
/// 向左移动
/// </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; //存储所有的蛇身
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) //用一个死循环来让蛇一直移动
{
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();
}
}
}

更多有趣的经典小游戏实现专题,分享给大家:
c++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
javascript经典游戏 玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
王大当家的00