赞
踩
废话不多说直接上图上代码!
第一步 先搞一个背景 创建一个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();//添加食物 } } }
第四部 创建食物
首先 创建一个食物的预设体(注意 预设体要放在Resources 文件夹下)
然后再创建一个空对象 用来创建食物 并且创建一个脚本挂载到 这个空对象上 命名为 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 } }
这样就简单的实现了贪吃蛇 我们来看一下效果!
如果对您有小小的帮助的话 就帮我点一个赞 鼓励一下新人吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。