从零开始的Unity学习_扩展阅读_4. 贪吃蛇

本文介绍如何使用Unity 2019.4.31f1版本开发贪吃蛇游戏,通过UGUI实现界面,并利用二维数组构建游戏地图。文章详细讲解了游戏的核心逻辑,包括蛇的移动、食物生成及碰撞检测等。

#前言

不知道是不是天气原因,这两天总觉得困困的呢。(o-ωq)).oO 困
这是本系列的第一个游戏,恭喜!!!啪唧啪唧啪唧(掌声)!
(抬手)安静~~~
咳咳咳,随着系列的更新,未来会有更多游戏出来,大家敬请期待。
哦哦哦!!!(欢呼!)
本篇文章我们来讲讲贪吃蛇的制作,我使用的版本是 Unity 2019.4.31f1。因为没写多少东西,转成其他版本应该也不会出问题吧(大概?)。下面是度盘地址:
这是整个项目,要解压后用Unity打开。

#正文

#效果图

#Unity内设置

比较简单啦,全都使用UGUI实现,场景就一个,代码两个,GameController实现UI界面切换的功能,SnakeXenzia实现贪吃蛇游戏的玩法。

#思路讲解

首先我们需要一个地图,🐍需要在上面爬行。
玩过 正常 贪吃蛇的人都知道,蛇蛇是可以上下左右移动的,每次移动的单位为一个方格。
所以我们以固定大小的方格为最小的元素,拼出地图。 x行方格和y列方格拼成地图 ,这像什么,哦,我的老天鹅,这不是和二维数组一样吗(锯齿数组也是一样的,只是我用的二维数组。)。
我选出800*800的大方格为大地图(我使用的是1920*1080的分辨率大小),其中每个小格大小就是800/行*800/列的大小。每格的位置可以用 (行 * 小格行的大小, 列 * 小格列的大小) + 左上角边缘的位置 来计算(我将锚点设置在UI左上角,新手可能看不懂锚点,但咱们主要学思路,看代码嘛,问题不大。)
地图出来了,咱就要想想贪吃蛇咋个玩的了,首先有一条蛇,有边界(墙),还有吃了可以变长的食物。
边界我们很好定,就是数组的边界嘛。
蛇我使用红色的方块做头,使用白色的方块作为身体。
食物我使用黄色的方块。
在地图的数组上,我将为1的值用于表示蛇的身体和头,为2的值用于表示食物,为0表示该位置上为空。
使用Update写计时器来移动。
总的思路就咋样了,看着挺简单的,但写起来还是有很多小细节的。

#方法讲解

我只讲SnakeXenzia里面的代码,GameController里面只有一些对界面的控制(这个系列之后会讲解关于Unity内部API和操作的内容(应该会吧?))。
因为有基础的人直接看代码就懂,完全没有使用过Unity的又缺了些基础,就需要讲的很细。我把握不住,所以我直接按自己节奏讲了,看不懂也没关系,是我讲的不好,讲的不够细。
  • public变量和private变量
这些是使用的变量,需要注意的是SnakePart是我建立的类,里面存放一个RectTransform(其实就是方块物体,只是我觉得用RectTransform可能方便点),还有方块选择的位置 行和列。
  • GameStart
写在SnakeXenzia最后的函数,但其实是进入代码最先执行的函数(本来是打算把它移到最开始的,结果忘了,欸嘿。)
一步步看,gameSate(。。。我是不是少敲了个t)是用于Update中判断物体是否开始运动的。
接下来是初始化地图。再后来是判断尾巴,因为我的尾巴是生成的,生成后会放入tail集合里面,第一次倒是不用管,但后面进行游戏的时候需要先把生成的尾巴消除。
然后是根据自己设置的mapSize来设置🐍头和蛇尾的大小,并重置分数。
然后是生成蛇蛇,生成食物,这两个的顺序不能调换(因为食物不能生成在蛇身上)。
生成食物和生成蛇的代码我不打算讲(懒),大部分都是随机数生成位置,设置位置的工作。(大家有兴趣自己去看看吧。)
  • 移动
移动主要是分为两块,一部分是Update中的计时器和指令控制,还有一部分是真正的蛇蛇移动的代码。
计时器累计时间,当达到时间的时候就移动SnakeMove()一次。在时间累计的过程里,值允许进行一次方向的改变,并且改变的方向不能是原方向和原方向的反面。空格键可以加快移动的速度。
在SnakeMove的方法中,采用蛇头现在的位置和方向来分辨是否又碰撞到边界(墙)。
因为我将所有尾巴有顺序的放到了集合tails里面,所以移动尾巴时,我只需要将集合开头的元素放到蛇头位置(改变h和v的值),之后的元素依次放到集合中前一位元素的位置,判断是否吃到了食物,如果吃到了就增加一个尾巴方块的到集合最后一个元素的位置,如果没有则将地图上最后那个元素原来的位置设置为0。

#结束语

  • 建议
我并没有把全部的代码放进来,讲的也很随便啦,但大家拿到代码的话看懂应该没啥问题的。也就两三百行代码,很快就看得完的。
游戏我怎么测,如果玩出任何bug,恭喜你,拿其实是我给你留的作业(我故意的( ̄︶ ̄)↗),把bug改掉吧。
  • 杂谈
就,有点困,或许不是困吧,就是有些提不起精神。(_ _)。゜zzZ
明明秋天都已经来了,但天气还是很热,不,是巨热,要下周五才开始降温。老天爷怕我糊地上了,偶尔下点雷阵雨,下雨的时候温度还不降,又闷又热,前几天回家还被雨淋了(我到家它就停了,太过分了,为什么不是下的更大了(╬▔皿▔)╯。)。
之前都是知识的分享,为什么这次选择制作一款小游戏呢?
有些枯燥,一直以来分享C#基础知识多少有些枯燥。我想着在扩展阅读里给大家展示些轻松的东西,比如制作小游戏什么的。缺点就是,这样讲完C#知识需要的时间就更长了。这周我看到了一个很好的回答,里面大致是说,练习的意义的问题,如果我们不将使用与练习结合起来,我们无法真正的去练习到核心,甚至无法知道自己的练习是否有错误(实际上这段是说的画画里方块的练习,但我觉得放在代码上也说得通吧。)。
为什么选择制作贪吃蛇呢?
当我出现制作小游戏的念头的时候,我就在想做什么小游戏呢,贪吃蛇的选项很快就出现在我脑海里面,贪吃蛇的实现很多依赖数组,和上一篇文章讲的内容有很大关联,还有一点就是,挺有纪念价值的。我想我玩的第一款游戏很可能是贪吃蛇吧,在那种长得很像洛基亚老年机的手机上,我想不起啥时候玩的了,却还依稀记得游戏画面,想到这里我立刻决定做贪吃蛇了。
那算是从小就开始玩贪吃蛇了吧,那请问你对自己演示gif里这么快就凉了有什么想说的?
信不信我撕烂你的嘴。
这篇文章就到这里吧,下一篇我们整点集合的知识。各位,下次见。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值