开始制作第一个小游戏,充满bug的贪吃蛇,
附上胜哥move
if (Input.GetKeyDown (KeyCode.A)&&positon!=Vector3.left) {
positon = Vector3.right;
}
if (Input.GetKeyDown (KeyCode.D)&&positon!=Vector3.right) {
positon = Vector3.left;
}
if (Input.GetKeyDown (KeyCode.W)&&positon!=Vector3.down) {
positon = Vector3.up;
}
if (Input.GetKeyDown (KeyCode.S)&&positon!=Vector3.up) {
positon = Vector3.down;
}
if (time <= Time.time) {
transform.Translate (positon);
}
自己的
time += Time.deltaTime;
if (bCanChangeDt == false) {
if (Input.GetKeyDown (KeyCode.A) && diration != Diration.右) {
diration = Diration.左;
} else if (Input.GetKeyDown (KeyCode.D) && diration != Diration.左) {
diration = Diration.右;
} else if (Input.GetKeyDown (KeyCode.W) && diration != Diration.下) {
diration = Diration.上;
} else if (Input.GetKeyDown (KeyCode.S) && diration != Diration.上) {
diration = Diration.下;
}
}
if (time>=1) {
bCanChangeDt = true;
time = 0;
}
if (diration==Diration.上&&bCanChangeDt) {
transform.position+=Vector3.up;
bCanChangeDt = false;
}else if(diration==Diration.下&&bCanChangeDt) {
transform.position+=Vector3.down;
bCanChangeDt = false;
}else if (diration==Diration.左&&bCanChangeDt) {
transform.position+=Vector3.right;
bCanChangeDt = false;
}else if (diration==Diration.右&&bCanChangeDt) {
transform.position+=Vector3.left;
bCanChangeDt = false;
}
我记录方向的办法就是写一个enum,从而判断移动方向,而胜哥的代码则是用向量来记录方向(get技能 vector3不能记录位置,还能用来记录方向);
创建食物
胜哥: public void Cretae()
{
System.Random r = new System.Random ();
int a = r.Next (-12,13);
int b = r.Next (-12, 13);
GameObject.Instantiate (g, new Vector3 (a,b,0), Quaternion.identity);
}
my:
rPostion.x = (int)Random.Range (ButtonRight.position.x+5,ButtonLeft.position.x-5);
rPostion.y = (int)Random.Range (ButtonLeft.position.y+0.5f,HighLeft.position.y-0.5f);
if (time <= Time.time) {
Instantiate (Food, rPostion, Quaternion.identity,parent);
time+=3;
}
ButtonRight就是plane底部的右下角的一个空物体,用来记录坐标。
body部分:
胜哥:
if (isEated == true) {
GameObject go = (GameObject)Instantiate (body, transform.position, Quaternion.identity);
isEated = false;
list.Insert (0, go);
}
if (list.Count > 0) {
list.Insert (0,(GameObject)list[list.Count-1]);
list.RemoveAt (list.Count-1);
((GameObject)list [list.Count - 1]).transform.position = transform.position;
}
transform.Translate (positon);
方法是每次移动时将身体部分最后一个元素插入到了列表的第一个位置(也就是蛇头的后一个位置)利用蛇头位移一格的瞬间(移动后蛇头后将留一单位空位) 将新增加的身体添加到蛇头移动前的位置(即是补上蛇头移动后的空位)。使用这种填补的效果达到了“位移”的感觉。然后就要再后面通过RemoveAt方法删除最后一个元素。
my:版本1:
public class snake : MonoBehaviour {
// Use this for initialization
public Transform bodyTransform{get;set;}
public Vector3 lastPosition{get;set;}
public Vector3 curPosion{ get; set;}
static public ArrayList alSnakeBody = new ArrayList ();
private snake s;
void Start()
{
s = GetComponent<snake> ();
s.bodyTransform = transform;
s.curPosion = transform.position;
s.lastPosition = s.curPosion;
alSnakeBody.Add (s);
}
static public void GetSnakeBody(snake body)
{
alSnakeBody.Add (body);
}
static public void move()
{
for (int i = 1; i < alSnakeBody.Count; i++) {
snake curS = (snake)alSnakeBody [i];
snake lastS = (snake)alSnakeBody [i - 1];
curS.lastPosition = curS.curPosion;
curS.curPosion = lastS.lastPosition;
curS.transform.position = curS.curPosion;
}
}
public snake(Transform bodyTransfom,Vector3 curPosition)
{
this.bodyTransform = bodyTransfom;
this.curPosion = curPosion;
}
public snake (){}
}
写了一个蛇身体的类,用来记录蛇身的gameobject,上一次的位移,当前位移,然后用列表存取,因为unity的脚本运行一定要挂在gameobject上,所以通过start方法,在调用sneke方法的时候(即创建身体的时候)自动将“身体”加进alsnakeBody的列表中,然后通过move方法位移,具体就是将上一个元素的位移前的坐标赋值给后一个元素。
方法2:
if (isEated == true) {
GameObject go = (GameObject)Instantiate (body, transform.position, Quaternion.identity);
isEated = false;
list.Add (go);
//list.Insert (0, go); //胜哥 way
}
if(list.Count>0){
for (int i = list.Count; i >0; i--) {
((GameObject)list [i]).transform.position = ((GameObject)list [i-1]).transform.position;
}
((GameObject)list [0]).transform.position = transform.position;
}
通过2句话解决问题的刺激想出来的,具体实现方法与第一一样,更加简化而已,将存取列表里的除第一个元素外的前一个元素的位移赋值给后一个,然后最后将蛇头位移前的位置赋值给列表里的第一个元素