利用unity 制作贪吃蛇小游戏

来源:互联网 发布:大数据教师培训方案 编辑:程序博客网 时间:2024/04/30 13:02

首先要做一个贪吃蛇游戏。

需要实现的技术点,分别有:

1.利用键盘控制“蛇头”移动。

2.能对吃到“果子”这一动作进行判断,并且同时生成新“果子”。

3.死亡判断。

4.实现“蛇身”。


我觉得困难的部分在于实现“蛇身”的部分。


先按着点。来罗列一下思路和代码。


1.利用键盘控制“蛇头”移动:

先把“蛇头”对象设置为球形刚体。然而我并没有在脚本中直接对刚体施加速度,而是通过键盘来改变一个二维向量“speed”。

然后在每次刷新的时候,让“蛇头”的位置加上这个向量"speed"。来达到蛇头的移动。

    if (Input.GetKey(key_up) && fangxiang != "down")
            {
                speed = new Vector2(0, speed_canshu);
                fangxiang = "up";
            }
            else if (Input.GetKey(key_down) && fangxiang != "up")
            {
                speed = new Vector2(0, -speed_canshu);
                fangxiang = "down";
            }
            else if (Input.GetKey(key_right) && fangxiang != "left")
            {
                speed = new Vector2(speed_canshu, 0);
                fangxiang = "right";
            }
            else if (Input.GetKey(key_left) && fangxiang != "right")
            {
                speed = new Vector2(-speed_canshu, 0);
                fangxiang = "left";
            }
            else
            {
                //位置移动的预先处理
            }

            weizhi += speed;
            weizhi_3D = new Vector3(0, 0, 0);
            weizhi_3D.x = weizhi.x;
            weizhi_3D.y = weizhi.y;
            rigidbody2D.transform.SetPositionAndRotation(weizhi_3D, new Quaternion(0, 0, 0, 0));

//weizhi 是代表现在蛇头位置的二维向量。weizhi_3D是代表现在蛇头位置的三维向量。speed_canshu是控制速度的参数。



2.3.能对吃到“果子”这一动作进行判断,并且同时生成新“果子”,和死亡判断:
把果子设置为预制体。并把果子的tag设置为ball_new,并添加上球形刚体组件。
OnCollisionEnter2D()函数就可以判断是否接触了。在脚本中使用
 
private void OnCollisionEnter2D(Collision2D col)
    {
            if (col.gameObject.tag == "Ball_body")//判断是否接触到的蛇身,是的话,把判断游戏结束的变量flag_game,设置为flase
            {
                flag_game = false;
            }
            if (col.gameObject.tag == "Ball_new")//判断是否接触到的果子(ball_new)
            {
                col.gameObject.tag = "Ball_body";//把接触到的果子的tag设置为蛇身
                col.gameObject.transform.SetPositionAndRotation(weizhi_jilu[10 * (ball_number + 1)], new Quaternion(0, 0, 0, 0));
                ball.Insert(0, col.gameObject);//ball是一个储存蛇身gameObject的list。把碰到的果子的gameObject插入到list的头部。
                ball_number++;//计数,记录ball里对象的个数
                weizhi_jilu.RemoveRange(ball_number * 11, weizhi_jilu.Count - (ball_number+1) * 11 );
                flag = true;
            }


            if (col.gameObject.tag == "Wall")//判断是否接触到墙体
            {
                flag_game = false;
                //直接GG
            }
    }


4.实现“蛇身”。

我最开始想的是利用,joint 关节链接起各个蛇身和蛇头。但是我发现,由于unity设置的刚体有惯性的原因,导致蛇身在转向的时候,

蛇尾会甩动起来。就很奇怪。。所以我处理蛇身的方式是:把蛇头的位置按时间先后一个个存入list中,然后把位置依次分配给蛇身对象。




具体代码就在附件中上传。

http://download.csdn.net/download/jxf1183727/10042295

工程上传链接