案例1:贪吃蛇

1、游戏界面分辨率和相机调节:

(1) Game界面下,点击Free Aspect,选择16:9

(2) 相机调节:

2、创建墙:

(1)Hierarchy界面,右键-Create-2D Object-Sprites-Square 重命名为Wall,重置位置(Position),Y坐标改为10。Scale中X改为45

(2)选中Wall,Ctrl+D,Position中Y改为-10;

(3)选中Wall(1),Ctrl+D,Position中Y改为0,Rotation中,Z改为90,Scale中,X改为20,Position中X改为-22;

(4)选中Wall(2),Ctrl+D,Position中X改为22,用同样的方法做最后一道Wall

(5)Create Empty,将四面墙放入其中

拖放被吃物体,放在适当位置

3、创建背景:

(1)Create-2D Object-Sprites-Square,重命名为bp;Scale中X=44,Y=20,选适当颜色

(2)选中bp,找到Additional Settings,使Order in Layer的值=-1(设定当前图片需要显示的位置——类似于置于底层)

(3) 观察另外两个物体的层级,按需要进行设定

4、移动游戏对象(蛇)之前的测试:

(1)重置游戏对象的Transform

(2)测试代码绑定情况:新建脚本Snake

输入图片说明

(3)测试得到游戏对象的transform组件中的Position:

输入图片说明

(4)测试移动位置功能:

输入图片说明

(5)用按键移动游戏对象:

W:向上(移Y轴);S:向下(移Y轴);D:向右(X轴);A:向左(X轴)

输入图片说明

5、移动游戏对象

(1)声明一个类型为Vector3(包含3个数据),名字为direction的变量(名字可以自定),

输入图片说明

(2)给direction赋值:up(向上);down(向下);left、Right

输入图片说明

(3)获得当前游戏对象的位置并注释位置信息——游戏对象持续移动

输入图片说明

(4)阻止游戏对象(蛇)直接反向移动(不转弯的回头)

同样更改其他方向的运动

(5)更改游戏对象的移动速度:(游戏通常用到的方法):

输入图片说明

注 1 :Time.DeltaTime :一帧所经历的时间

注 2:本游戏用(6)的方法

(6)使贪吃蛇一格一格地移动(使用慢动作的方法)

A. 在Void Update()方法之后 新建另一个方法

输入图片说明

B. 进一步降低游戏速度(本游戏使用步骤C.的方法):

输入图片说明

注意:使用小数时,在数字的后面加f

TimeScale:在Unity中游戏执行的速度;正常的运行速度是1,

0.1f:游戏运行速度放慢,是正常速度的1/10

C. 进一步降低游戏运行速度的另一种方法(本游戏使用的方法):

把变量放在Unity编辑器的Inspector面板的Script面板中,在面板中修改数据

声明一个公共类型(在面板中显示)的变量,变量类型为Float(小数类型),变量名字为Speed:

输入图片说明

把Speed赋值给游戏运行速度后,Unity中显示Speed选择框,可直接设定游戏运行速度

输入图片说明

6、让游戏对象与其他物体产生碰撞(蛇碰到苹果)

(1)给游戏对象(蛇)添加Circle Collider 2D组件(2D模板下的碰撞体):Add Component-Circle Collider 2D

(2)编辑Collider 的大小:点击Edit Collider右侧图标,在Scene界面出现绿色方点,拉动即可调整Collider的大小

也可通过下方Offset和Radius中的数字进行调整:X=0,Y=0

(3)给被吃物体添加Collider 2D组件,修改它的大小

(4)给游戏对象(蛇)添加刚体(Rigidbody)组件,并在Body Type 右侧框中选择Kinematic(无视物理效果但仍有刚体特性)

(5)把两个物体的碰撞体转变为触发器:在两个物体的Collider 组件中勾选Is Trigger(无视物理效果,只有检测到接触的功能)

(6)检测触发器功能:

A.给被吃物品新建一个C#,命名为Food(被吃物品Add Component-New Script;或者直接新建C#,拖放到被吃物品的Inspector空白处)

B.打开Food,

collision:触发对象(蛇)

7、确定墙的位置范围(给墙一个碰撞效果)

(1)创建一个名为foodarea(食物出现的区域)的空物体:Create Empty,重置这个物体的位置

(2)选中该物体,添加Box Collider 2D组件,Offset中x=0,y=0;Size中,x=42,y=18

(3)在food脚本声明一个名字为foodArea,类型为Collider 2D的变量

(4)Unity中出现Food Area变量框(承载碰撞体的物体),将Hierarchy面板中的Foodarea拉进右侧变量框(或按右侧图标选择)

(5)调整FoodArea碰撞体的范围(用Edit Collider右侧图标,或者Size调整)

将苹果拖放到墙的边缘,取苹果的一半位置为碰撞体的大小(如下图)

8、使被吃物体出现在墙内的任一位置(发生在蛇与苹果接触后):

(1)测试墙的边界数据:

打开Food.cs,在触发器后写入脚本Debug.Log(foodArea.bounds.min.x);分别获取墙的边缘的x、Y轴的最小、大值

(2)获取墙内的任一位置:

在X/Y轴上的最小值和最大值之间随机产生一个数值:Random.Range(foodArea.bounds.min.x,foodArea.bounds.max.x);

(3)将(2)中产生的位置赋予被吃的食物

9、游戏开始运行时苹果位置随机:

(1) 方法1:将步骤7(3)中的35~39行代码复制到Start事件中

(2) 方法2——把重复使用的代码打包:创建一个方法:void RandomPosition(){}

在需要调用的方法中输入:方法的名字();

10、创建身体并使身体在物体接触事件(蛇吃掉苹果)时出现

(1) 创建身体图片:Create-2D Object-Sprite-Circle,命名body,重置位置,更改颜色

(2) 把图片变为预制体:

把图片拖放到Project面板中的Asset文件夹中(也可以放入新创建的Prefabs文件夹中)

(3) 删除Hierarchy面板中的预制体

(4) 通过脚本使body出现(在吃到苹果后)

A. 打开Snake脚本,声明一个名为bodyPrefab的变量,保存脚本

B. 打开Unity,在Snake的脚本面板上出现该变量,把body这个预制体拖放到右侧可选框中

C. 在Snake脚本中,当蛇吃到苹果时,body被加载到游戏场景中(Instantiate:生成物体)

注意:运行游戏时,系统默认Snake与foodArea(冲突碰撞体)产生接触一次,因此,在游戏开始蛇未与苹果碰撞前,body自动加载一次

D.判断冲突碰撞体的方法

运行游戏可见冲突碰撞体为foodArea

E.给苹果添加一个新的标签,并选择这个新增标签

F.打开Snake脚本

11、创建一个List用来装载陆续增长的身体

(1) 在Snake脚本中,声明一个变量,名字自取(如bodies),类型为Transform

public:在unity中的Snake脚本中会出现一个Bodies图标,用来显示加载的物体

             目前Bodies右侧的数据为0,说明没有加载物体

List:创建一系列格子,每个格子都可以保存一个物体,如下表

0

1234

注:0 的位置放置蛇的头部,1、2、3、4……放置陆续出现的蛇的身体

(2)使蛇的头部在游戏运行开始时就出现

注:当前角色是指脚本挂载的物体,在这里是指Snake

运行游戏,可见加载1个物体,加载的物体名称为Snake:

(3) 接触到标签为food的碰撞体时(蛇吃掉苹果时),生成bodyPrefab,并将之储存在List中:

12、使游戏对象(蛇及生成的身体)移动:

(1) 打开Snake脚本,找到移动事件

(2) 使用for循环使生成的物体移动:

bodies.Count:bodies的长度(Count:系统自带)

int i = bodies.Count - 1;    // 初始值等于bodies这个List的长度-1

(3) 改变生成物体的初始位置和角度:

13、角色撞到墙,游戏结束

(1) 给四道墙增加box Collider 2D,勾选Is Trigger(无物理碰撞效果,只是一个触发器)

(2) 添加一个专属标签:自主命名,如:obstacle(障碍物)

(3) 在Snake脚本,找到OnTriggerEnter2D事件,写入代码并测试

(4) 当游戏对象接触到墙,游戏对象回到初始位置(0,0,0),且游戏停止

(5) 游戏结束时,删除加载到游戏中的bodyPrefab物体(bodies数组中的物体)

14、游戏对象撞到bodyPrefab,游戏结束

(1) 改变游戏对象(蛇)、被吃物体(苹果)的碰撞体大小(调节Edit Collider或Size都可以)

(2) 给预制体body添加Collider 2D,并修改预制体的标签为obstacle

15、使每次运行游戏时,游戏对象(蛇)都在界面的中心点

16、调整代码,使程序更安全和有效率

(1) 在最后一行大括号之前,创建一个方法以重置场景

(2) 打包步骤14(5)中游戏结束的代码,使挂载本脚本的物体回到场景的中心点,并停止移动,删除后生成的预制体,把本脚本的物体放入bodies这个数组中

具体操作:剪切上述代码,把它们粘贴到重置场景的这个方法中

(3) 重新编写游戏结束代码:ResetStage();如下图

(4) 回到脚本Start位置

(5) 删除22~24行

(6) 输入打包好的方法:ResetStage();

17、增加得分记录

(1) 新建UI文本(UI——游戏用户可见的界面)

在Hierarchy界面右击空白处,UI-Text-TextMeshPro,加载字体等资源、重命名文本为Score(记录得分)

(2) 将文本拖到Canvas内的合适位置

(3) 设定字号为 50 ,在Text InPut中填写 0,文字颜色为白色;若默认文字不换行,选择Wrapping中的disabled,文字左对齐,上下居中

(4) 创建新脚本,重命名(如:GameUI)

(5) 打开脚本

(6) Create Empty,重命名为UI,关联GameUI脚本,管理游戏中所有的UI

(7) 在Uinty中把得分文本拖放到Inspector面板中Game UI的Score Text右侧可选框中

(8) 声明一个变量score,并使这个变量在游戏运行时显现在用户面板的得分上

(9) 创建分数重置为0的方法(注意:方法的名字第一个字母一定要大写!!)

(10)创建统计得分的方法

18、在Snake脚本中调用打包好的得分记录

(1) 打开Snake.cs,添加调用程序(获取打包程序所在的脚本信息) 

(2) 回到GameUI脚本,公开打包程序的信息,方便Snake脚本调用(在void前面加public)

(3) 回到Snake.cs脚本,添加打包程序:

(4)在Unity中给Snake脚本中的GameUI脚本赋值:回到Unity,选中Snake,在GameUI右侧选择UI物体

19、制作游戏的开始界面

(1) 在Canvas上右击,UI-Image,名字自取,如:bgImage

(2) 选择bgImage,在Image面板添加准备好的图片

(3) 改变图像信息——Rect Transform组件

A.Rect Transform组件:设定UI物体(游戏用户看到的界面中的物体)在Canvas中的位置

B.使图片完美覆盖整个场景:点击stretch,弹出如下图对话框,按住Alt键,选择右下角图标

(4) 创建开始界面上的文字:Hierarchy界面右击,UI-Text TextMeshPro,名字自取,如titleText

(5) 安装中文字体,添加需要显示的文字(游戏名称titleText、玩法infoText等)

(6) 创建开始按钮:UI-Button TextMeshPro,适当位置,在Image组件改变颜色

(7) 选择按钮下的文本,输入"开始游戏"

(8) 选中开始界面所有元素,右击,Create Empty Parent,重命名这个空物体如StartMune

(9) 设定按钮,使按钮按下时,StartMenu不显示,效果如图(实现取消勾选startMenu的效果)

(10) 选择Hierarchy上的按钮,找到On Click()面板,按下面的加号

出现下图

(11) 将StartMenu拖放到None(Object)的位置

(12) 打开No Function,选择GameObject-setActive

说明:取消勾选表示按钮按下时,StartMenu不显示

20、添加音效:

(1) 把素材音乐拖入文件夹

(2) Create Empty,名字自取,如:Audio、  Add component(添加组件)-Audio Source

(3) 选中Audio,在AudioClip中选择导入的背景音乐

21、Audio Source组件的一些常用功能:

Play On Awake :勾选时,游戏开始时直接播放

Loop:决定音乐重复播放。勾选时重复

Volume:决定音乐声音大小

22、设置背景音乐在点击开始游戏按钮时才播放

(1) 在Hierarchy面板,选择开始游戏按钮,右侧Inspector面板找到Button,On Click(),添加事件(点击加号)

(2) 将Hierarchy面板中的Audio拖放到None……上,使按钮事件与音乐关联

(3) 打开No Function,选择AudioSource-play()

23、游戏结束时,背景音乐重复播放

(1) Create-C#Script,名字自取,如:GameAudio

(2) 在GameAudio.cs中,引用AudioSource组件:

(3) 给Audio添加刚刚创建的脚本(GameAudio.cs)

(4) 将Inspector面板中的Audio Source拖放到AudioPlayer上

(5) 打开GameAudio.cs,创建一个新的方法,用于其他方法调用

(6) 打开Snake.cs,声明一个变量,以便调用GameAudio.cs脚本中的内容

(7) 找到游戏结束的方法,调用GameAudio中的方法

(8) 打开Unity,给新建的Game Audio赋值:选择Audio

24、角色吃掉苹果的声音特效

(1) 导入音乐素材

(2) 打开GameAudio.cs,声明一个名字自取的变量,如:eatClip

(3) 回到Unity,选中Audio物体,

在Eat Clip中选择音乐素材

25、在播放背景音乐的同时,播放吃苹果的声音

(1) 打开GameAudio.cs,新建一个方法

(2) 写入代码

(3) 打开Snake.cs,找到吃苹果事件

(4) 添加播放声音事件

26、稳定的输入2个音乐的方法:分别创建Audio Source组件,分别写入程序
27、发布游戏

(1) File-Build Settings

(2) 选择需要发布的场景和添加需要发布的场景

(3) 选择发布平台

(4) 点击Player Settings

(5) 打开Resolution and Presentation

(6) 点击Fullscreen,选择Windowed

(7) 默认分辨率,关闭窗口

(8) 在Building Setting窗口点击Switch Platform

(10) 点击Building,新建一个文件夹装载这个游戏

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值