当前位置:   article > 正文

Unity——简单实现“贪吃蛇”_unityhub怎么弄小蛇

unityhub怎么弄小蛇

简单实现 2D 贪吃蛇

废话不多说直接上图上代码!

第一步 先搞一个背景 创建一个Canvas 再Canvas 下在创建一个Image 命名为bg

这样

第二步 创建一个蛇头 在Canvas 下创建一个Image 命名为SnakeHead(SnakeHead要在bg后面 这样才可以显示在背景的上方

第三步 实现蛇头的移动
创建一个脚本 命名为SnakeHeadController将脚本挂载到SnakeHead上

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SnakeHeadController : MonoBehaviour
{

    public float Timer;                //游戏速度
    public int step;//蛇头的移动距离
    private int X;//移动的增量值
    private int Y;//移动的增量值
    private Vector3 HeadPos;//蛇头的坐标
    public GameObject bodyPrefab;    //蛇尾的预设
    //蛇身列表
    public List<Transform> bodyList = new List<Transform>();
    public Sprite[] bodySprites = new Sprite[2];//图片

    private void Start()
    {
        InvokeRepeating("OnMove", 0, Timer);
        SetSnakeHeadMoveOffset(step, 0); //设置初始移动的方向
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.W) && Y != -step)
        {
            SetSnakeHeadMoveOffset(0, step);
        }
        if (Input.GetKeyDown(KeyCode.S) && Y != step)
        {
            SetSnakeHeadMoveOffset(0, -step);
        }
        if (Input.GetKeyDown(KeyCode.A) && X != step)
        {
            SetSnakeHeadMoveOffset(-step, 0);
        }
        if (Input.GetKeyDown(KeyCode.D) && X != -step)
        {
            SetSnakeHeadMoveOffset(step, 0);
        }

        if (Input.GetKeyDown(KeyCode.Space))//加速
        {
            CancelInvoke();
            InvokeRepeating("OnMove", 0, Timer - 0.2f);
        }
        if (Input.GetKeyUp(KeyCode.Space))
        {
            CancelInvoke();
            InvokeRepeating("OnMove", 0, Timer);
        }
    }
    //监听移动
    public void OnMove()
    {
        HeadPos = gameObject.transform.localPosition;//获取头的位置
        gameObject.transform.localPosition = new Vector3(HeadPos.x + X, HeadPos.y + Y, HeadPos.z);//移动
        if (bodyList.Count > 0)
        { 
            for (int i = bodyList.Count - 2; i >= 0; i--)                                           //从后往前开始移动蛇身
            {
                bodyList[i + 1].localPosition = bodyList[i].localPosition;                          //每一个蛇身都移动到它前面一个节点的位置
            }
            bodyList[0].localPosition = HeadPos;                                                    //第一个蛇身移动到蛇头移动前的位置
        }
    }
    //设置偏移量
    public void SetSnakeHeadMoveOffset(int x, int y)
    {
        X = x;
        Y = y;
    }
    //生长尾巴
    public void Grow()
    {
        int index = (bodyList.Count % 2 == 0) ? 0 : 1;
        GameObject body = Instantiate(bodyPrefab, new Vector3(2000, 2000, 0), Quaternion.identity);
        body.GetComponent<Image>().sprite = bodySprites[index];
        body.transform.SetParent(GameObject.Find("Canvas").transform, false);
        bodyList.Add(body.transform);
    }
   //碰撞
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Food"))
        {
            Destroy(other.gameObject);//销毁食物
            this.Grow();//生长尾巴
            RangeFood.instance.AddFood();//添加食物
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

第四部 创建食物

首先 创建一个食物的预设体(注意 预设体要放在Resources 文件夹下)
Food是食物的预设 body 是蛇尾的预设
然后再创建一个空对象 用来创建食物 并且创建一个脚本挂载到 这个空对象上 命名为 RangeFood在这里插入图片描述
创建的食物代码如下:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RangeFood : MonoBehaviour
{
    public static RangeFood _instance;
    //单例
    public static RangeFood instance { get { return _instance; } }

    [Header ("食物的所有图片链表")]
    public List<Sprite> FoodSpriteList;
    [Header("食物预设")]
    public GameObject FoodPrefab;

    private void Awake()
    {
        _instance = this;
    }
    void Start()
    {
        instance.AddFood();//开始时添加一个食物

    }
    //获取单例
    public static RangeFood getInstance()
    {
        return instance;
    }
    //添加一个食物
    public void AddFood()
    {
        GameObject food = GameObject.Instantiate(FoodPrefab); //克隆一个食物的预制体
        food.GetComponent<Image>().sprite = FoodSpriteList[Random.Range(0, FoodSpriteList.Count - 1)];//随机一个食物的图片
        food.transform.parent = this.transform.parent;
        food.transform.localPosition = new Vector3(Random.Range(Const.WidthminX, Const.WidthmaxX), Random.Range(Const.HeightminY, Const.HeightmaxY), 0);//在这里给食物赋值一个随机的位置
        food.transform.localScale = Vector3.one;//让缩放为1
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

这样就简单的实现了贪吃蛇 我们来看一下效果!在这里插入图片描述

如果对您有小小的帮助的话 就帮我点一个赞 鼓励一下新人吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/146349
推荐阅读
相关标签
  

闽ICP备14008679号