效果图:

思路:贪吃蛇的玩法核心是玩家控制一个方块 去吃另一个方块,吃掉的方块变成自己的身体跟随上一个方块移动,吃的越多速度越快,游戏结束判断是否撞到墙壁或者撞到自己的身体

一、场景布局

1.相机设置

修改相机参数 :ClearFlags 设置为SolidColor 让我们游戏中的场景纯颜色显示 ,Projection设置为Orthographic 正交相机 , size  设置相机视角的大小

2.场景设置

设置游戏背景图、四面的墙壁、贪吃蛇的蛇头和食物的组件及属性,还有一个游戏失败和显示分数的UI界面

①背景图:新建2D Object-->Sprite 取名GameBG 设置图片精灵 调整scale大小为30*30 作

围墙Wall :设置Tag标签为Wall(用于判断撞到墙死亡)设置碰撞盒, 复制三个围墙调整大小位置

②贪吃蛇的蛇头 SnakePlayer 添加刚体Rigidbody2D和BoxColider2D组件,这里注意将2D刚体组件的Gravity Scale重力规模设置为0 (平面移动不需要重力) ,调整位置xy为0.5(为啥要调整为0.5 下面会有解释说明)

 创建食物 :FoodPool当作食物存放的对象池,创建食物添加BoxColider2D组件 设置Tag为Food(用于碰撞检测),与蛇头一样调整位置xy为0.5

为什么蛇头和食物要设置position位置为0.5?

因为我们创建的蛇和食物都是scale为1*1的矩形 我们移动的位置想要它跟场景方块对其 需要设置其初始位置为0.5(即:scale/2 大小的一半),其实也可以不用设置 小编有点强迫症对其好看就,嘿嘿......

 ④设置UI界面

创建空物体UIManager当作节点容器 存放组件,左上角Text为分数,RefreshPanel游戏失败背景UI 新建一个Text作为游戏失败文字, 一个Button作为重新开始按钮。

二、功能实现

1.首先制作蛇的移动功能,新建脚本PlayerMovement.cs 贪吃蛇的所有功能都放在这个脚本中

贪吃蛇功能:

①蛇的移动是自动的 我们只需要控制蛇的左右或上下移动的方向即可,

②蛇在往左(或往下)移动时 ,我们不能操作蛇往右(或往左)移动。

③蛇头在触发了食物时吃掉食物,触发了墙或自己的身体时游戏结束

了解了移动方式那我们开始编写功能吧。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;//方向类型
public enum DirectionType
{Horizontal, Vertical
}public class PlayerMovement : MonoBehaviour
{public static Vector3 direction = new Vector3(1, 0, 0);//移动方向public float currentTimespeed; //当前移动速度时间(时间越小 速度越快 这里我通过时间来加快速度)public float timerSpeedRatio;//每次吃到食物所减去的时间(即:贪吃蛇加速)float timer;//用于时间计算bool isDie = false;//是否死亡int foodnumber = 0;//吃掉的食物数量//食物 食物对象池 public FoodData foodPrefab;public Transform foodPool;//贪吃蛇容器 用于存储吃掉的食物变成的身体public Transform snakePool;//游戏地图public Transform GameBG;void Start(){//初始化timertimer = currentTimespeed;//初始化位置transform.position = new Vector3(0.5f, 0.5f, 1);}void Update(){//玩家移动float h = Input.GetAxis("Horizontal");float V = Input.GetAxis("Vertical");//判断移动方向if (h != 0){SetDirection(DirectionType.Horizontal, h);}if (V != 0){SetDirection(DirectionType.Vertical, V);}//未死亡 执行移动if (!isDie){Move();}}//修改方向private void SetDirection(DirectionType directionType, float _direction){//判断水平的左右移动 或 垂直的上下移动float value = _direction > 0 ? 1f : -1f;//判断方向类型  设置移动方向 switch (directionType){case DirectionType.Horizontal:if (direction.x==0){direction = new Vector2(value, 0);}break;case DirectionType.Vertical:if (direction.y==0){direction = new Vector2(0, value);}break;default:break;}}//移动private void Move(){timer -= Time.deltaTime;if (timer < 0){//执行移动GetComponent<FoodData>().Move(transform.position + direction);timer = currentTimespeed;}}//检测(需要 FoodData和UIManager脚本)void OnTriggerEnter2D(Collider2D col){//判断是否触发了墙或者是自己if (col.transform.tag.Equals("Wall") || col.transform.tag.Equals("Player")){//死亡isDie = true;UIManager.uiMagr.DieUI();}//食物if (col.transform.tag.Equals("Food")){//判断贪吃蛇有没有身体if (snakePool.childCount > 0){col.transform.GetComponent<FoodData>().SetDataInt(snakePool.GetChild(snakePool.childCount - 1).GetComponent<FoodData>());}if (snakePool.childCount <= 0){col.transform.GetComponent<FoodData>().SetDataInt(GetComponent<FoodData>());}col.transform.SetParent(snakePool);if (col.transform== snakePool.GetChild(0)){col.transform.tag = "Untagged";}else{col.transform.tag = "Player";}//创建食物CreatFood();//加速currentTimespeed -= timerSpeedRatio;if (currentTimespeed<=0.1f){currentTimespeed = 0.1f;}//UIfoodnumber++;UIManager.uiMagr.SetNumber(foodnumber);}}//创建食物public void CreatFood(){//基础值float basePos = 0.5f;int h_value = (int)(GameBG.localScale.x / 2);int v_value = (int)(GameBG.localScale.y / 2);int h = Random.Range(-h_value, h_value + 1);int v = Random.Range(-v_value, v_value + 1);Vector2 pos = new Vector2(h + 0.5f, v + 0.5f);if (pos.x > 15){pos = new Vector2(h_value - 0.5f, pos.y);}if (pos.y > 15){pos = new Vector2(pos.x, v_value - 0.5f);}GetFood(0).position = pos;}//获取食物public Transform GetFood(int index){Transform food;if (index <= foodPool.childCount){food = Instantiate(foodPrefab.transform, foodPool);}else{food = foodPool.GetChild(index);}return food;}}

代码中有详细的解释,直接复制代码会出现问题,原因是需要FoodData.cs和UIManager.cs脚本中的方法.

设置贪吃蛇的初始属性

2.创建食物(和身体)属性脚本FoodData   将脚本拖给给SnakePlayer和food

这个食物脚本,在被蛇吃掉之后变成蛇的身体。

功能介绍:

①基础属性 移动前的位置信息,上一级物体,下一级物体。

②当食物被吃掉时,要获取蛇的最后一个身体,当作自己的上一级,上一级移动后,下一级移动到上一级移动前的位置

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FoodData : MonoBehaviour
{public Vector3 oldPos;//记录上一次移动public FoodData parentObj;//获取身体部位的上一个身体部位属性(用于贪吃蛇移动时,下一个方块移动到上一个方块的位置)public FoodData newObj;//记录下一个身体部位属性(用于当前身体移动后 调用下一个物体的移动方法)void Start(){}// Update is called once per framevoid Update(){}//获取上一个物体(食物被吃掉时调用)public void SetDataInt(FoodData obj) {parentObj = obj;//设置上一个物体的newobj为自己parentObj.newObj = this;//食物被吃掉变成白色transform.GetComponent<SpriteRenderer>().color = Color.white;//位置初始化transform.position = parentObj.oldPos;}//移动 (用于当前物体移动完后执行下一个物体的移动)public void Move() {//记录上一次移动位置(这个值 下一个物体移动时所需)oldPos=transform.position;//修改位置transform.position = parentObj.oldPos;//执行下一个物体的移动命令if (newObj!=null){newObj.Move();}}//移动(蛇的头部移动 需要传参)public void Move(Vector3 pos) {oldPos = transform.position;//修改位置transform.position = pos;if (newObj != null){newObj.Move();}}
}

3.脚本UIManager.cs 拖给空物体UIManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using UnityEngine.SceneManagement;//加载场景时需引用public class UIManager : MonoBehaviour
{public static UIManager uiMagr;public Text number_txt;//分数public Button refreshBtn;//重新开始按钮public Transform dieUI;//游戏失败面板void Start(){//初始化uiMagr = this;dieUI.gameObject.SetActive(false);refreshBtn.onClick.AddListener(Refresh);}// Update is called once per framevoid Update(){//按下esc 退出程序if (Input.GetKeyDown(KeyCode.Escape)){Application.Quit();}}//修改分数值public void SetNumber(int value) {number_txt.text = value.ToString();}//显示死亡UIpublic void DieUI() {dieUI.gameObject.SetActive(true);}//刷新void Refresh() {//重新加载场景SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}
}

链接:https://pan.baidu.com/s/1bGXUal8RIJBSb6oFq4zHPA 
提取码:syq1

Unity制作贪吃蛇相关推荐

  1. Unity制作贪吃蛇小游戏

        从开始学习到现在也做了不少小游戏,但是很多都堆积再同一个项目中,并且还有许多不完善之处,所以最近会逐渐发上来一些之前做的小游戏,希望对大家有所帮助. 今天发上来的是最开始做的一个,也是挺经典的 ...

  2. Love2D游戏引擎制作贪吃蛇游戏

    预览游戏 love2d游戏引擎重要函数 详情: love.load:当游戏开始时被调用且仅调用一次 love.draw:回调函数,每帧更新一次游戏画面 love.update:回调函数,每帧更新一次游 ...

  3. C# 制作贪吃蛇小游戏,最简单的实现

    C# 制作贪吃蛇小游戏 目录 画蛇 实现蛇的上下左右移动 随机生成目标物 开始游戏 计分 重新开始 增加难度 死亡判定 1.1 画蛇的一节 Class Element()Graphics g;publ ...

  4. 如何用html做一个贪吃蛇,如何用HTML5制作贪吃蛇游戏

    如何用HTML5制作贪吃蛇游戏 发布时间:2020-07-09 15:09:59 来源:亿速云 阅读:122 作者:Leah 如何用HTML5制作贪吃蛇游戏?很多新手对此不是很清楚,为了帮助大家解决这 ...

  5. 使用unity无脑制作贪吃蛇

    导入资源包 1.制作一个如下图所示的UI和层级关系. ①首先在UI里创建一个image改名为Bg(属性面板附上背景表格),在Bg下面设置子物体(image)也就是所有食物. ②在Canvas下创建一个 ...

  6. 手把手教你使用 Python 制作贪吃蛇游戏

    贪吃蛇游戏是有史以来最受欢迎的街机游戏之一.在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果.在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战.这是每个 ...

  7. lua进入压缩包_使用lua语言制作贪吃蛇游戏(love2d)(一)开发环境的搭建

    本教程教大家使用lua制作一个贪吃蛇,游戏引擎使用love2d,因为它开源轻巧而且跨平台. 1.开发环境搭建: windows系统: 在windows系统下,首先我们进入官网www.love2d.or ...

  8. 单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

    为了让大家更深入地了解底层的原理,在讲解时特意选择了51单片机(而非STM系列),另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片),摇杆也利用ADC功能判断方向. 那如何让单片机驱 ...

  9. 用unity开发贪吃蛇,勾起我童年乐趣的小游戏

    首先理一下贪吃蛇游戏思路: 1.首先建立好两个场景中的各种按键,图标. 2.设置蛇头:蛇头的移动,蛇头移动过程中的旋转问题.蛇头与其他物体发生碰撞时的触发. 3.食物的制作:因为食物是随机在场景中生成 ...

最新文章

  1. putty或xshell上用vi/vim小键盘无法使用的解决方法
  2. OpenCV中CvArr* 的含义~
  3. MIT、哈佛合作,这个研究让神经网络认清自己“几斤几两”!
  4. 说不尽的嘎达梅林:读郭雪波的长篇小说《青旗•嘎达梅林》
  5. C和指针之字符串总结
  6. eclipse 开发 scala
  7. 前端学习(1810):前端调试之css装饰cursor
  8. 让TFS忽略packages文件夹的更改
  9. 【Java进阶营】Java多线程基础学习(一)
  10. Gradient-Based Learning Applied to Document Recognition
  11. python工资一般多少p-5万的工资,用Python算一算少交多少税?
  12. matlab中svm testacc参数,使用Matlab进行交叉验证的多类SVM的完整示例
  13. 自动化测试基础篇--Selenium多窗口、句柄问题
  14. 云计算相关的一些概念Baas、Saas、Iaas、Paas
  15. Get和Post请求区别和使用场景
  16. 排查oracle数据库服务是否启动
  17. 【英语:基础高阶_全场景覆盖表达】K6.口语主题陈述——人物类
  18. MFC 句柄Hwnd 与 窗口Wnd的联系
  19. 20个2013年最值得关注的网页设计趋势
  20. Contrast Preserving Decolorization

热门文章

  1. 网络文件共享服务(三):NFS
  2. 如何对用户输入进行校验
  3. 制作大白菜U盘后,想要恢复成普通U盘的方法
  4. 后端服务常见问题解决方案
  5. 网页中多个图标在一张图片上,使用css将各图标显示
  6. 合并与拆分数据模型(MSDM:Merging Spliting Data Modeling)
  7. spyder python 使用_如何在spyder中使用vpython?
  8. ACdreM-1061 郭式树 没文化真可怕
  9. 作为面试官被放鸽子的50个理由,论如何放面试官的鸽子
  10. 设置win10桌面、锁屏、密码输入界面背景色、图片