简单实现 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();//添加食物
}
}
}
第四部 创建食物
首先 创建一个食物的预设体(注意 预设体要放在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
}
}
这样就简单的实现了贪吃蛇 我们来看一下效果!
如果对您有小小的帮助的话 就帮我点一个赞 鼓励一下新人吧