您的位置:首页 > 移动开发 > Unity3D

利用unity 制作贪吃蛇小游戏

2017-10-26 08:12 1056 查看
首先要做一个贪吃蛇游戏。

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

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
工程上传链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: