2021-05-11

使用unity做经典游戏贪吃蛇

1.创建一个蛇头,制作一个红色cube立方体,控制着蛇的运动方向,以及遇到食物吃掉食物的功能。
创建一个c#脚本
在Update()里 WSAD及方向键控制着蛇头的运动方向。且在蛇头向上运动的时候不能向下运动,蛇在向左运动时候不能向右运动。

void Update () {
        if (Input.GetKey(KeyCode.W)||Input.GetKey("up")&&direction!= Vector2.down)
        {
            direction = Vector2.up;
        }
        if (Input.GetKey(KeyCode.S) || Input.GetKey("down") && direction != Vector2.up)
        {
            direction = Vector2.down;
        }
        if (Input.GetKey(KeyCode.A) || Input.GetKey("left") && direction != Vector2.right)
        {
            direction = Vector2.left;
        }
        if (Input.GetKey(KeyCode.D) || Input.GetKey("right") && direction != Vector2.left)
        {
            direction = Vector2.right;
        }
	
	}

蛇在碰撞上食物后,身体会增长一节。遇到食物的时候,会先毁灭掉食物,再增加自己身体的长度。这个时候设置的碰撞位flag就会变为true,身体长度会增加。但是,在碰到自己的时候,以及在遇到墙壁的时候都会死亡,这个时候就会导入进开始时候的场景。

void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Food"))
        {
            //Debug.Log("撞上了!");
            Destroy(other.gameObject);
            flag = true;
 
        }
        else
        {
            //SceneManager.LoadScene(0)
            Application.LoadLevel(1);
        }
    }

2.身体的部分
身体每次增长的算法便是贪吃蛇的难点,网上很多算法是利用list链表来实现的,用链表的节点表示蛇 增加的减少都有很方便 移动的时候只须增加一个头节点,并去掉尾节点就行了, 吃食物是只须增加一个头节点 。
这种算法绝对的巧妙,但是网上太多的缘故,下面由链表来实现另一种贪吃蛇算法。蛇头保持不动,身体的最后一个移到最前,之后在慢慢向后移动。
其中下面的蓝色方块(身体部分的一个设定)一步一步运动,便可以看出来这个效果。
在这里插入图片描述
下面贴出蛇身体部分的代码。如果食物被吃,标志位flag为true,这个是在蛇身体上插入一个预制体的Cube,蛇身体会边长。当没有吃到食物的时候,这个时候就会看身体的数量,当数量大于0的时候,会把最后的一个放到最前面,依次循环,直到最后。

void Move()
    {
        Vector3 VPosition = transform.position;
        transform.Translate(direction);
        if (flag)
        {
            GameObject bodyPrefab = (GameObject)Instantiate(gameObjecgtBody, VPosition, Quaternion.identity);
            Body.Insert(0, bodyPrefab.transform);
            flag = false;
        }
        else if (Body.Count > 0)
        {
            Body.Last().position = VPosition;
            Body.Insert(0, Body.Last());
            Body.RemoveAt(Body.Count - 1);
        }
    }

3.食物
食物的出现是一个随机的过程,在这个时候,在随机的位置出现食物InvokeRepeating(“ShowFood”, 1, 4);表示四秒的时候会调用ShowFood()函数,这个时候在ShowFood里会随机出现食物。
下面是ShowFood()函数的代码

  void ShowFood()
    {
        int x = Random.Range(-30, 30);
        int y = Random.Range(-22, 22);
        Instantiate(SSFood, new Vector2(x,y), Quaternion.identity);
        
    }

特别注意一下就是,在制作蛇头和身体的时候,设置碰撞体的东西如果把碰撞体的体积设为单位1的话,在蛇身体的侧面也会撞到食物,触发碰撞器的。所以设置碰撞体的体积为0.8,略小于1的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值