分手厨房_Unity

先创建一个URP的Unity3D工程 

然后点击Edit->project setting->Quality 然后把其他的删除只留下 

相对应的下面只需要留高版本的

然后我们点开SampleScene

这里面的Global Volume就是处理后处理的文件 放的就是下图的配置文件 我们可以删了 后面可以自己写配置文件

接下来就是需要导入素材 建立地面 之后就建立Plane

然后把素材材质球设置为Floor

后处理设置

点击右边Profile的new 就会创建出来 但是可能接下来的操作 有些人没有效果 我们需要去Camera里把Post processing勾选上  然后Volume中的Priority设置为大于0的数

添加软阴影 使其阴影更加柔和

添加Tonemapping 使其变得更加真实

Color Adjustment 可以调整对比度等

Bloom Threshold超过这个光照度的会泛光 Inteisy就是发光的强度

Vignette 就是晕影 摄像机周围是否会有黑色的光圈 小小围绕 Inteisy是范围 Smoothness就是转化的强度

调整抗锯齿率

顺便提一嘴摄像机里也有 但是Urp是外置的所以得在上图这里调

控制主角的移动

创建一个空游戏物体 作为主角外观的父物体 有利于将外观与逻辑分开 接下来需要注意的是 父物体和子物体的朝向是需要一样的

接下来我们来解决一下假如向左上方等斜方向移动速度会发生改变的问题 以及朝向问题和转向过于僵硬。

代码规范:

    如果想在外界修改 但是仍然要用Unity里修改就添加这个字段[SerializeField]
    想在外界访问这个Speed 就定义一个speed方法

主角移动的动画

首先创建一个动画管理器

之后点击PlayerVisual 上方的Window->Animation

接下来就是自己点击Create创建一个动画Player_Idle 我们要让其在静止状态下头脑上下移动 点击红点开始录制 然后修改头的位置 添加以下关键帧 如果觉得太快了 可以调整Samples的大小 越小越慢。或者就是直接把事件拉长。也就是30那个点拖后 后面那个点更拖后。

接下来就是行走动画的制作 首先将Idle动画复制  记得要拖到动画管理器里 要不然没办法切换

然后添加一下身体的晃动 可以按住Shift全选 然后来修改播放速率  下图

然后在动画管理器添加一个Bool变量 IsWalking 然后

就是如此设置 Has Exit Time是为了随时可以转化到行走动画 Transition Duration 设置为0为了转化时间为0 然后 另外一个箭头也是类似

接下来我们创建一个脚本来作为物体移动动画控制的类 下图

然后在按下键盘时 将变量设置为true 但是因为设置的是私有的 所以我们需要 写一个方法来get这个bool变量IsWalking

对输入控制代码的重构

因为我们在后期需要可以自己修改游戏输入的键盘 所以我们最好先弄一个类 GameInput

然后把获取输入放在这个类里 之后我们就可以回到Player修改一下

只要这么些就可以实现输入和移动的再次分离。

提供修改按键的功能
创建InputActions事件

Edit->prosetting->Player->Other Setting->Active Input Handing

会让你重启一下 并且需要导入一个包 之后点击一下云端

新建一个InputAction并改名为Gamecontrol

点击打开之后 建立事件地图 一套事件地图对应一个角色 我们这里只需要一个Player就可以了

Actions是建立事件 我们需要建立一个Move事件

使用Value 会返回一个值 是下面那个类型的

然后点击Move旁白有下标的加号

选择Add Up\Down\Left\Right Composite

接下来点进去 点击path 然后点击左边的灰色按键(因为有bug被挡住了) 它可以监听你的输入 这个时候点击输入就好了

使用新版输入系统实现移动

点击勾选Generate c# Class 然后Apply一下

之后会发现 生成了一个GameControl的脚本

接下来我们就可以到GameInput里使用一下 因为GameControl只是脚本 不可以通过拖拽的方式 所以我们需要创建实例化对象 然后启用事件地图 最后用一个返回值进行接收。

如果我们需要让右边也可以移动 在Move里再添加一份就好了。 记得要把名字重命名为不一样名字

角色的碰撞控制

添加刚体和胶囊体组件 记得地板也得要有刚体组件

因为我们只在x和z移动所以Freeze Position需要把Y轴勾选上 然后因为 然后我们转向只要X Z转向 所以 把Freeze RotationZ轴X轴勾选起来。

创建空柜台ClearCounter的prefab

创建一个父游戏物体 为其添加碰撞体组件 数值如下 记得把它的Transform重置一下 然后把柜台作为它的子物体拖入 记得他们的坐标都要重置一遍 之后将这个父子组合体 和 父游戏物体都作为预制体制作一下。

开发主角与柜台的交互

首先我们需要在GameControl写一个新的事件Interact

它只要是一个Button便可

然后创建一个事件

再创立一个委托 当按下E键时自动触发 后面的函数

也就是下图这个

然后因为我们设置的是一个公共的事件 所以在Player赋值了这个事件 就会执行GameInput_OnInteracAction这个方法。

然后接下来就是对这个方法解释

之所以要使Info的高度变为1.2 是因为要不然被遮挡了 射线都射不出去 之后就是射线射出的位置 方向 得到被触碰的物体 射线的距离 射线可以触碰的层级。

如果尝试得到ClearCounter这个组件为true 就会触发里面的方法。

选择状态和取消选择状态的更新

点击预制件 复制一个子物体 把它更换材质球为Counter

然后点击下面那个括号(1)修改Scale为1.01可以包裹住 并且Rename SelectCounter

之后将其禁用掉 因为平常的时候是不显示的 然后添加以下方法 然后在外面把 SelectCounter奥托如selectCounter的变量中。

之后在Player的脚本里 添加如下方法 用处是更新选择和取消选择状态 如果不是同一个的话 进行更新。所以导致我们的HandleInteraction()要放在Update里执行

并且改为是由它来判断是否还在同一个物体手上。

而在事件里 按下E就会直接调用触发事件

按E使Counter桌面上生成食物

建立一个空的游戏物体 改名为Bread 然后把Bread作为它的子物体拖入给他。制作成预制件。

接下来 为Couter添加一个空的游戏物体 作为Bread生成位置的定位

然后进入代码界面 表示一下出现位置就好了。

食材数据类的创建

我们可以创建一个数据类 来专门存放食材

然后创建一个新的文件夹ScriptObjects

里面点击右键创建数据 如下图

最后将交互方法的代码修改一下

柜台与柜台之间的传递

我们首先创建一个脚本 挂在水果上面  然后在这脚本里面写一下 获得水果数据类

然后对交互方法进行修改、

然后再写一个方法 获取KitchenObject

后面就是再写一个方法用于转移 首先得判断原柜台存在食材 并且目标柜台不能存在食材  

然后再分别写两个函数 一个用于添加 一个用于删除 因为你已经让kitchObject等于出现的那个

所以直接null就好了

为传递创建一个公共父类

我们发现其实物体的传输 是柜台和主角都要完成的功能,所以我们可以把传输功能作为一个公共父类进行编写。

相比较之前多了获取位置 和对食品进行赋值的方法。 然后让其Player和ClearCounter进行继承 这样子变量也都还是存在的。

然后修改一下

玩家与柜台的传递

如果为空的话 就是为柜台放置物体 但是如果不为空的话 就是拿到玩家手上

但是怎么传给Player呢 所以我们就要给玩家创建一个单例模式

为柜台创建一个公共父类

因为柜台也有不同的功能 但是也有相同的功能

所以我们需要创建一个公共的父类

首先我们就应该得先考虑把SelectCounter放过去

顺便 改进一下 因为一般不推荐使用单例模式 所以在交互方法那里传递一个参数

之后将ClearCounter的代码缩减为下图

然后我们需要跑到Player里

修改一下代码 首先以后选择的可能就不止是ClearCounter了

所以改为BaseCounter类型的

然后记得把this传递过去

类型都需要修改为BaseCounter

冷藏柜台的创建

因为我们刚开始做的方法 其实就是冷藏柜台的功能 所以只需要把代码拿来就好了

然后把Counter中的删除掉

然后开始创建一个预制体 像之前一样的操作 建立被选中的状态 以及出现Food的位置

但是其实不是很合理 因为现在会直接生成一个在柜台上

所以并不需要这样 只要按下e键就可以得到就好 所以我们只要判断Player手上没有食物就好。

冷藏柜台的动画创建

在创建一个类 进行动画创建

然后这个拖到Contairs的子类

然后在下图创建一个变量 拖入

食材的来回转移

为空柜台的脚本添加如下代码

制作所有食材的数据对象

建立数据类和一一对应的预制体

然后一一拖入

接下来我们还需要制作储物柜台的Prefab

更爱图标 拖拽对应的数据类

创建切菜柜台的Prefab

首先利用BaseCounter建立一个新的Counter

之后创建一个CuttingCounter的脚本

现在只实现和空柜台一样的功能 所以

然后建立 选择状态和菜品在柜台的出现位置

我们就要开发一些切菜柜台的切割功能

首先再在新版输入系统里 增加一个按键

然后如法炮制的在里面写检测按键的事件

然后再在BaseCounter写一个按下F键的交互虚方法

然后在Cutting里重写一下这个虚方法

然后我们会发现 其实创造菜品在柜台上是冷藏柜台和切菜柜台共有的功能 所以可以写在父类里

那么接下来就要修改一下冷藏柜台的书写

开发切菜食谱

我们首先再去创建一个脚本 用于存放切割与切割后的关系

就是为了遍历那个集合 看集合里面有没有切完之后的对象 如果有的话就返回

然后再Unity里创建一下


接下来就可以把写死的代码换掉

下图的意思是如果柜台上有菜的话 去遍历那个存储菜谱的集合 如果里面存在切完之后的对象 就创造出来。

接下来我们需要完成控切菜的切割刀数

所以我们在CuttingRecipeSO里加一个整数变量

Cuttringcounter也创建一个变量

当这两个相等的时候才可以 切割掉

但是我们这个时候会发现CuttingCountMax是没办法获取的 所以我们又得写一个方法获得CuttingRecipe 意思和上面那个获得Out的其实是差不多的 但是它是使用Out参数 

当切割刀数达到后 就可以切割出来 并且在把切割刀数设置为0

开发进度条UI

创建Image 记得把画布换位世界坐标 然后把位置什么的归零

参数如下

之后导入素材 切记位置的移动 是利用画布 移动 不要移动Image 记住看一下Progress的Image Type 修改成进度条了

然后我们就需要去代码里编写 所以我们需要再创造一个进度条脚本  Invoke是为了在0.5s后才会消失。

然后在CuttingCounter的脚本里添加这个脚本变量到时候拖拽进去

之后加一下这个方法的调用就好了

但是现在我们会发现 如果是背对摄像机的话 我们的进度条会被挡住 类似如此

所以我们需要再创建一个跟随摄像机的脚本

LookAt是利用 这个蓝色 箭头对准 摄像机 所以有时候会造成翻转 

所以我们需要利用第二种模式 

先得到 方向在得到一个点

第三种模式不是跟随摄像机 而是只是会和摄像机的朝向一致 比如摄像机在他前面 他就只会在摄像机的前面。 除非现在摄像机变成了左边 要不然他就不会动

第四种是和摄像头朝向相反。

切菜的动画

因为已经有播放的动画了 所以我们只需要写一个脚本调用就好了 挂载在下图1

之后在CuttingCounter的脚本上 设置一个变量 拖拽过去

然后在下面调用就好了

开发垃圾桶柜台的Prefab

创造一下基于BaseCounter的预制体 也是一样弄一个Select的状态

脚本如下

开发灶台的Prefab

先写一个脚本 继承一下我们的BaseCounter

然后老规矩 创建HoldPoint和Select选择状态

但是要注意的是这个选择状态可以把粒子系统和火取消掉 就留下手下三个 然后扩大到1.01倍


制作煎肉食谱的集合

切菜食谱的制作 差不多 也是遍历看一下是否有煎完的对象

然后创建一下

制作肉饼煎的功能

首先我们创建一个枚举 包括了灶台的每个状态 以及一个Float的类型变量 作为时间计时

那么我们现在需要 判断一下食谱里是否包含了Player手上的东西 如果没有的话 我们就放不上去 如果有的话

如果有的话就调用下面这个函数

之后在Update里放一下Switch 随着状态而改变我们要执行的语句

但是我们现在会发现一个Bug 如果我们煎到一半 就拿起来 然后再放下去 

但是他这个时候就会提示 空指针

因为我们中途拿走之后 可是它仍然是Buring 状态 所以我们需要在拿走时 设置状态为Idle

第二个Bug就是 我们如果是直接放下去一个熟的肉饼 因为他只剩下一个状态 就是变成烧焦的 然后我们也没加 什么判断他就会直接传送给StartBuring 但是其实这个时候Out出来的就是空的

所以我们需要把煎的食谱和烧的食谱分开

之后创建一下新的List变量 作为烧的食谱接收

修改一下代码 如果放上去的是一个已经煎好的 并且可以再少的就走else if的代码

最后下图这里位置也得再改一下 因为现在食谱分开了

煎肉特效的显示和隐藏

写一个新脚本 挂载在StoveCounterVisual上 然后把那两个特效拖拽过去

然后在StoveCounter的脚本里 调用一下 并且再创建一个方法当回到空置状态时使用

进度条的显示

利用Cutting的进度条 复制过来 然后设置为 方便移动到灶台上方

添加一个新的变量 然后拖拽过来

然后更新一下

闲置状态不显示

开发洗碗台的Prefab

老规矩 建立脚本

创造选择状态和物品生成位置

盘子的自动生成和堆叠

我们需要创建一下Plate的预制体 我们就可以利用那个BaseKitchObject

然后我们还要创建一下Plate的数据对象

脚本如下

盘子拿在手上

往盘子添加食材

首先创建一个脚本继承KitchObject

Clear需要改进一下 如果 手里面有东西 还得分为 是不是盘子 如果是盘子 还得看柜台上有没有东西。

然后添加 两个集合 一个用于存储盘子里装了什么 一个用于规定盘子里能添加什么

多增加一个函数 因为每次都调用写两句话太麻烦了。

把食材添加到柜台上的盘子 

尝试得到桌子上物体是否包含组件 如果包含的话就是盘子 可以进入下一层 循环往盘子里的集合添加可添加的蔬菜。

食材在盘子上的可视化显示

首先将完整的汉堡拖入

然后将肉饼复制一下 因为生肉饼我们也可以做汉堡

将其全部禁用掉 并且再创建一个脚本 用来完成可视化的操作

然后对其赋值

在往盘子添加食材的代码中放入

设计盘子上食材列表的UI

先添加一个图片 需要注意是画布仍然要改为World Space

然后一些重置坐标等操作

之后添加一下这个脚本

cell size是调整子物体的大小 Middle Center是调整 在的位置 下图错了 应该是30*30

之后差不多达到这种效果

然后换上图片 为画布添加我们的Look at camera的脚本

添加一个脚本KitchObjectGridUI到画布身上

添加一个脚本KicthenObjectIconUI到Icon Template上

调用

创建传送带柜台

既然需要判断菜是否正确 所以我们需要创建一下 我们有哪些菜肴

所以新建一个脚本 里面放置信息

创建出一些菜品

再写一个脚本 里面存放全部的菜品 作为菜单

利用随机数函数 随机出菜单的一个菜肴 然后发送到我们需要做的菜谱 orderRecipeSOList里

判断上菜是否成功

因为我们知道盘子的脚本上有一个集合 记录盘子上的Food是什么

所以我们需要新添加一个方法 返回这个集合

因为顾客点单也是一个集合 里面也有很多的菜 所以我们要先写出一个方法 是用来判断盘子里的集合是否等于菜单里某道菜的集合 因为找全部对应的太浪费时间 所以我们找集合里面不对应的 如果有不对应的直接返回false 

然后遍历顾客点单的集合 里面只要有一个是和盘子上的菜是一样的就说明上菜成功

接下来我们就要去传送带柜台调用 所以我们最好做成一个单例模式(在Awake里面赋值一下)

最后在Start的时候调用

随后在传送带柜台调用

创建下单列表的UI

创建一个画布 在它之下创建一个游戏物体 把游戏物体置于右上角 

然后在这游戏物体下方 新建一个TextMeshPro 和一个游戏物体 给这个游戏物体命名为RecipeList 然后Vertical Layout Group 然后按照如此设置 是自己设置间隙

然后在这个RepiceList的游戏物体下 创建一个Image叫做RecipeTemplate 然后设置为这样 也就是把它的颜色设置为黑色 透明度调一点 因为我们已经设置了组件 它会自动排好序的。

在它的下方 我们在创建一个TextMeshPro 和 一个游戏物体 为这个游戏物体命名为KitchenObjectList 然后添加一个Horizontal Layout Group的组件 然后往里面添加图片 

根据下单事件更新UI

首先我们得知道UI的更新分为几步

1.列表的更新 也就是我们的第一步得先实现 黑框的出现 所以我们先写一个脚本

OrderRecipeListUI 挂载在

之后我们开始 如下图解释 所以我们需要给模板挂载一个脚本RecipeUI

定义一个事件出来 当每次有人下单 就触发

每次上菜成功也要触发 进行删除 所以我们需要再定义一个事件

但是我们现在有一点要注意为什么这里要使用SetParent 而 我们之前在盘子上的时候不用使用 

解答: 因为我们需要注意他们脚本挂载在那个游戏物体上 盘子是直接挂在了它应该出现的游戏物体上 但是现在的脚本不是挂在它应该出现的游戏物体上。

如下图 它挂载的位置

它应该出现的位置

但是盘子 它挂载的位置和他应该出现的位置是一样的

现在我们就可以实现列表的更新 也就是每多一份菜肴 我们就会多出一个黑框 但是接下来我们就要实现 黑框里 食材的更新。

也就是RecipeUI里写方法

最后调用

音乐的播放

背景音乐

创建一个游戏物体 然后挂载Audio Source脚本

创建一个数据类管理所有音乐

写一个新的脚本


开发音效管理器

创建一个脚本 用于播放音乐

上菜成功和失败的音效

接下来 我们需要在在OrderManger里再写一个事件 用于播放上菜失败的声音

因此我们也可以知道这个相对于action 可以一下子调用多个方法

切菜的音效

也是一样 写一个事件 

Food捡起和放下的音效

首先我们先点击到KitchenObjectHodler 修改一下这个方法的函数 因为其实是重复了 然后我们就在SetKitchenObject里使用方法

添加播放事件

食物丢弃的声音

在垃圾桶这里添加事件

然后一样的赋值

煎肉的音效

煎肉和其他的不一样 其他的只是一瞬间的音效 但是煎肉 是需要一直播放 所以我没找到灶台 在灶台开发煎肉有效的功能。

添加一个空物体 在上面添加Audio source的组件 然后拖入煎的音效 然后把Play On Awake取消 因为我们只需要在煎的时候调用 不过Loop需要打开。

之后我们就需要来控制声音的播放 先写一个变量 记得等一下要拖进去

然后就是煎和烧的时候调用play 停止的时候调用Pause

Player的脚步声

我们需要再创建一个脚本 专门用于播放Player的脚步声的管理

然后我们需要把SoundManger设置为单例模式

方便调用里边的方法

开发游戏管理器GameManger

首先我们可以把游戏物体和C#脚本的Manger创建文件夹放在一起

然后创建一个新的游戏空物体和脚本GameManger

在这个管理器中 我们需要设置四种状态 来表示游戏的状态 

然后利用方法来实现每个状态之间的转换 因为可能转化的时候 有些UI呀什么什么的也需要变化。

等待开始状态 主角静止状态

获取主角的组件

写两个方法 对主角组件是否启用做管理 然后在等待开始和加载都禁用 游戏状态允许

倒计时UI的显示和更新

在Canvas下建立一个空的游戏物体 改名为CounterDownUi 顺便在这个空的游戏物体之下 建立一个同名脚本 等一下用于控制更新显示和隐藏 之后在这之下创建一个TextMeshPro改名为Number

然后自己调整大小等 。

然后我们可以在GameManger里设置一个事件 当游戏状态改变时都触发一下这个事件(设置为单例模式记得)以及我们需要一个判断是否是倒计时状态的方法

接下来我们就需要编写一下这个事件具体是触发什么 当状态是倒计时的时候就会把字显示出来


更新

写一个得到倒计时的方法

游戏开始后才有下单

首先我们需要去找到OrderManger 因为我们现在是设置start() 开始时就让它允许下单 所以我们修改一下

添加一个获取是否处于游戏进行状态的方法

删除

修改如下

给倒计时添加动画和音效

先创建一个动画

然后点击录制 在第一帧点击后随便修改一下再修改回来 是为了让它有帧保存

在这一帧修改它的Rocation和Scale 然后最后一帧只是把第一帧复制过来。

然后进入动画状态机里

创建一个空的 作为初始状态。

添加一个变量 Isstack 判断是否要进入抖动状态 回去的话就不用管 让它自动回去就好了

修改一下代码

在SoundManger里创建一个方法 播放声音

调用

游戏结束UI

在Canvea下创建一个Gameover的空游戏物体 然后在这个GameOver下面创建一个Parent的游戏物体

把他们的大小都设置为画布一样大

差不多如下图效果

在GameOverUI添加一个同名脚本

用来控制隐藏 更新 显示

首先为状态改变时的事件 继续添加一个方法 也就是隐藏

所以我们需要 多一个判断方法 是否到达了游戏结束

同时我们也需要多一个统计完成菜肴的数字 int

然后写一个方法得到它

最后便可以完成更新。

开发界面

开发开始界面

创建一个新场景

之后创建一个新画布 然后创建一个按钮 选择在右下角 记得是创建旧版按钮

然后设置为

然后点击Automatic会自动生成动画 然后我们改那个H开头的 他的意思是当我们点击到按钮上会出现什么动画。然后设置自己觉得可以的按钮动画

然后给GameMenuUI设置一个脚本 先完成End 这个的意思是在编译模式下也可以完成退出

之后拖到End的点击事件里去。

开发加载页面

创建一个新的场景

创建一个覆盖整个画布的Image

然后继续创建TextMeshPro 把它放在右下角 并且发在下方

再创建一个TextmeshPro 用来存放省略号

可以调整一下他的间隙

为它们创建一个父物体 这个父物体也得覆盖整个画布 之后字体的位置应该会发生改变

所以我们就需要 在调整一下字体的位置

之后创建一个脚本挂载在父物体上

场景加载的管理

创建一个静态类的脚本 因为这个不需要创建对象 并且开始 加载 游戏场景都需要调用它

但是我们需要注意在Load的方法里它都是调用加载场景的页面

即使拖入

然后在第一个场景的菜单脚本书写一个Begin方法

接下来我们要在第二个场景再创建一个游戏空物体 以及一个同名脚本 用于调用真正加载目标场景的方法。

完善开始界面

创建一个Plane 参数如下

创建一个Player然后复制黏贴出四个

GameObject ->Algin with View 作用是让相机和视野保持一致

记得点击Camera 这样子才会激活这个选项

在画布下再创建一个Image 放置Logo

如下图

添加Esc按键 控制游戏的暂停和继续运行

新添加一个按钮事件 Escape

也是一样找到GamaeInput 然后让它+=一个方法 然后我们再自定义一个事件 当按下时自动触发事件委托的方法。

为了方便我们的GameManger调用 所以我们把GameInput也做成一个单例模式

然后在GameManger定义一个Bool变量 判断是否为暂停还是开始

在Start里为事件赋值

这个的意思是每次按下都会变成相反的bool值

接下来我们就要去开发一下游戏暂停的UI场景

在画布中创建游戏物体GamePauseUI 再创建它的子物体UIParent 记住让他们铺满整个画布

再创建一个Image 也让它铺满整个画布

然后差不多就是如下图 你可以去场景1中把开始的按钮复制过来

接下来我们就要控制它的显示和隐藏

创建一个GamePauseUI 

首先我们应该在GameManger再注册两个事件 分别监听按钮按下时候的触发的方法


接下来我们回到GameParentUI

记得拖入一下

然后我们会发现一个问题当暂停后点击了菜单 再点击开始游戏就会发现 走不动了 那是因为我们的Time.timescale被设置成了暂停。然后也没有恢复

所以我们需要再每次加载时 设置为1

但是我们又发现会有一个空指针的报错

原因是因为 每次场景加载都会new一套新输入系统 那我们按下Esc回到菜单 再点击开始游戏 不就又多了一套输入系统,而就会导致事件被注册了两次。

所以我们需要再创建一个方法 当场景被销毁时调用一下

但是我们还有一个地方要注意 就是我们创建事件的时候创建了很多静态的事件 静态的事件和普通的事件不一样,普通的事件 你切换场景了之后就会自动销毁但是静态事件不会自动销毁,但是你加载时Start又会调用 导致事件被注册了两次。

所以我们必须把带有静态事件的类中添加一个清空静态事件的方法

那我们要在哪里调用呢 当然是游戏开始界面

创建一个新的游戏物体和脚本

开发设置界面

音量

接下来我们需要开发以下设置界面 首先我们需要创建一个游戏物体SettingUI并创建同名脚本 并且在它的下面再创建一个游戏物体 UIParent然后我们的UI都放在UIParent下面 

然后我们就可以设置点击设置按钮触发show 退出按钮设置hide 把UIParent 拖到GameObject中。

接下来我们需要创建一个Soldier 然后把脚本设置为单例模式

然后设置一个Soldier的变量用于拖入

然后我们在SoundManger里面添加一个Float类型的变量 然后让它在PlaySound 因为你会发现上面的控制音量播放都是会调用这个函数。

然后利用MuchSound更改它的值  右下角是要和ChangeMuchSound 调用

环境音量的改变就更简单了 再创建一个Solider和AudioSource的变量

然后创建两个方法调用

然后再创建一个Toggle的控件座位 音乐的开关。

记得刚开始这样设置

按键

我们首先得创建一下按钮和文本 设置成一个游戏物体 如下图

然后多次创建 如下图

然后我们在SeetingUI的脚本里创建变量

之后一个一个拖入 记得拖入的是Button下的Text

我们先来研究一下怎么获得按键的文本 如下图 

注如果是Value是从1开始的索引 button是从0开始就好 第二张图右上角位置

接下来我们就可以开始更新UI

在GameInput里建立一个枚举类型表示是需要上面类型的 然后再写一个方法得到那个按键上面的文本 方便我们在SettingUI里面调用

如何重新绑定呢

下面代码的意思就是按下0后会检测下一次的按下的按键重新绑定到Move的第一个按键。

但是重新绑定之前需要先禁用掉。所以调用了disable 后面的匿名函数就是重新绑定完之后调用的

记得后面写上.Start方法; 然后callback.Dispose 就是会把重新绑定的一些资源释放掉 然后path是现在判定的键是什么 overridepath是之前绑定的键是什么。

如下图 已注释

然后在SettingUI传递一下就好了

接下来我们需要做到更新UI

多加一个传参 Action类型 因为Action类型 相对于也是一个事件 可以装载 函数然后下面触发

然后传过去Setting的更新UI的函数就好

但是我们会发现重新绑定完之后 并不可以做到 下次游戏时还可以使用 所以我们还得做保存功能

初始化之后就可以判断一下有没有这个文件存在

游戏的外部环境

时钟显示倒计时

首先创建一个空的游戏物体 GameClockUI 然后在创建一个子游戏物体UIParent 这两个都选择铺满 之后再创建一个Image的UI 放置一个圆形图片 然后放置Outline组件更清晰 Shadow添加阴影效果。然后复制一下 因为一个座位背景一个作为饼状图来显示。

接下来就需要把作为饼状图的那一个颜色改为别的颜色 并且如下图的方式设置 是为了让它能有倒计时的效果。

然后在这个饼状图的下方创建一个TexhMeshpro 然后上面写上倒计时的数字 如下图


创建一个GameClockUI的游戏脚本

创建一个变量 作为不变的时间

Player走路的游戏特效

因为刚体组件的存在导致特效不可以直接拖入到Player里 所以我们为特效单独创建一个脚本 用于跟随。

新手教程页面

先创建一个Toturial的游戏空物体 再创建一个UIParent 在UIParent下方创建两个Imger 一个是透明背景 一个是放新手教程的那张图片。

之后在这个的下面在建立Image 在Image的下面再建立一个TextMeshPro

接下来我们得控制按键的更新

GameManger多加一个函数  判断是否是在等待开始状态

开发煎太久的警告

首先点击到StoveCounter里的预制体 然后直接复制一下ProgressUI 改名为 WarningUI

然后可以把ProgressBarUi脚本删除掉 替换一下图片 记得留下跟随摄像机的脚本

为WaringUI创建一个动画 中间帧为红色 ProgressBarUI也是如此

ProgressBarUI因为是达到条件才会进入警告 所以我们刚开始在Animator设置一个空状态 在设置一个Bool类型的Isfliker 如果True煎肉进入警告 如果false返回空状态 记得把HasExittime取消勾选 下面的Dur...设置为0

接下来就是脚本的编写

获得一下

接下来就是添加声音播放

上菜成功和上菜失败的UI提示

点击传送柜台

建立一个画布 参数如下 PosX可以自己选择合适的

之后建立一个游戏物体更名为Deliversuccess

创建三个Image和一个TextMeshpro

图片分别作为黑色 绿色 以及打勾的图片

然后点击游戏物体来创建一下游戏动画 

这个动画就是刚开始Scale为0 中间为1 最后又为0 然后Rotation是用Z来旋转

点击Animator

创建一个空状态和触发器类型的Triggrer

一样的当触发的时候直接进入动画播放的状态 然后因为我们在最后设置了让它的Scale为0 那么我们就只需要让它保持在这个状态里就好了 记得把动画的Loop Time取消勾选。 

复制一下做出错误的UI

接下来就要控制一下它的播放

为它们创建一个共同的父物体DeliverResultUI 并添加同名脚本

给传送台添加箭头动画

创建一个新文件夹MatAndShaders 在文件夹下

使其支持透明

A1连接到Alpha(1)

得先有一个材质球才可以拖入

拖入后

会发现放到传送柜台上还会有色差

所以修改一下啊

添加以下结点 意思就是Vector2的x轴根据Time*一个Float类型的让其移动起来 然后用相加让其出现位置移动。

结束

### 回答1: xiugoudisco_unity是什么? xiugoudisco_unity是指修构创意设计公司开发的Unity引擎相关资源的下载链接。Unity引擎是一款适用于2D和3D游戏开发的跨平台游戏引擎,被广泛应用于游戏开发、虚拟现实、增强现实和建筑可视化等领域。修构创意设计公司是一家专注于游戏、VR/AR、电影等领域的创新型企业,旗下包括游戏和动画事业部、VR / AR事业部和数字营销事业部。 如何下载xiugoudisco_unity? 想要下载xiugoudisco_unity相关资源,可以访问修构创意设计公司的官方网站,进入其Unity引擎资源下载页面,按照指示进行下载。在下载前,需要先了解自己所需要的资源种类,如游戏模型、素材、插件、脚本等等,并在下载时选择合适的版本与类型。下载完成后,可能需要进行解压缩,将其应用到自己的Unity项目中。 xiugoudisco_unity的应用场景及优势有哪些? xiugoudisco_unity提供的资源种类繁多,涵盖了游戏开发、VR/AR应用、建筑可视化、电影特效等多个领域,并且这些资源质量高、性能稳定。其所提供的优质资源不仅能够加快开发效率,满足不同开发者的需求,还能够为初学者提供快捷的学习途径。xiugoudisco_unity所开发的游戏、VR / AR应用等项目也备受好评,展现了其在相关领域的丰富经验和领先水平。 ### 回答2: xiugoudisco_unity 是一种基于 Unity 引擎的修建舞厅游戏资源包,主要用于建模和演示使用。该资源包可在多个游戏引擎中使用,其提供了丰富的资源和模型,方便用户进行快速的舞厅建模。同时,xiugoudisco_unity 能够让用户自行定制、设计和编程游戏,让用户有更大的自由度和创造力。 若要下载 xiugoudisco_unity 资源包,用户需要先在网上搜索相关的下载链接,并根据需要进行下载。安装时,用户需要先确认其已经安装好相应的游戏引擎,确保能够顺利地运行游戏。 总之,xiugoudisco_unity 是一种非常实用的游戏资源包,可帮助用户快速地建模和演示舞厅场景。其易用性和灵活性令人叹为观止,为许多游戏设计师和爱好者所钟爱。 ### 回答3: xiugoudisco_unity是一个游戏开发工具集,可以帮助游戏开发者快速创建游戏,实现游戏开发的各种功能。该工具集基于Unity引擎,具有强大的功能和灵活的扩展性,适用于各种类型的游戏开发。想要下载这个工具集,可以在官网或各大游戏开发论坛上进行下载。在下载前,需要确保自己的电脑符合该工具集的系统配置要求,安装前也需要查看相关的安装指南,确保安装顺利进行。使用xiugoudisco_unity,可以更加快速、高效的进行游戏开发,并且可以通过丰富的插件和资源库,快速构建精美的游戏场景和角色模型。总的来说,xiugoudisco_unity是众多游戏开发者的首选工具集之一,是实现各种游戏开发创意的重要基石。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值