Unity2D学习笔记 | 《勇士传说》教程 | (五)

发布时间:2024年01月07日

? ? ? ?

目录

(一)持久化场景设置与玩家可互动物体

(二)传送门的制作和场景加载

(三)制作场景渐入渐出效果

(四)制作主菜单

(五)实现开始新游戏


???????? 在进行后面的工作之前,需要绘制一个新的场景,但在绘制时不需要为场景添加Manager等功能性的物体,这些物体可以通过非销毁的标注来保留到其他场景。要注意新场景各个物体的组件设置,Layer和Tag的选择等。注意Bounds对象的碰撞体一定要设置为trigger,不然会出现角色被挤到边框外的情况。

(一)持久化场景设置与玩家可互动物体

? ? ? ? 场景中的部分物体应当在各个场景之间都可以保持,可以将这些物体单独设置在一个专门的场景中,而在原本的场景中只保留地图等要素。在编辑时同时加载两个场景来还原整个游戏。

? ? ? ? 游戏常常会设置一个互动键来与物体互动,相对应的就需要有能够互动的物体。制作可互动对象。当希望根据输入设备切换图标提示时,可以为两种图标分别制作动画切片,并应用到同一个animator中。标识通过碰撞体检测OnTriggerStay2D来进行生成和销毁,识别可互动物体则通过tag进行。

? ? ? ? 对于识别输入设备,unity提供了标准的事件InputSystem.onActionChange来在设备切换时激活事件,在调用的方法中通过InputActionChange提供的枚举来选择合适的情况获得设备信息。注意在脚本中调用Keyboard以外的输入设备需要引用其命名空间。

? ? ? ? 实现可互动物体的互动逻辑,采用接口的方式。接口的写法与抽象类类似,可以只写声明不做实现,实现接口的类需要完成其中所有函数方法,便于提高泛用性。

? ? ? ? 图片在脚本中为Sprite类型,通过SpriteRenderer来进行更改,音效制作则与攻击音效相同。

(二)传送门的制作和场景加载

? ? ? ? 当玩家与传送门互动时,需要实现场景的卸载和加载,并重置玩家位置。

? ? ? ? 场景的加载可以看作是资源加载的一种,因此可以采用Addressable来实现。Addressable是Unity提供的一种资源加载方式,能够优化加载速度和资源大小,通过其中基本的功能可以实现场景加载的效果。

? ? ? ? 创建一个基本的Addressable Setting,为场景和资源选择Addressable并放到指定group中。场景加载需要获得目标的参数,可以通过ScriptableObject的事件来传递参数。通过创建指向资源引用的SO类,并在场景加载Manager中调用,通过直接设定第一个场景并在Awake中加载。而对于跨场景传送,则在互动时触发事件,传送参数并加载场景(注意事件订阅之外要注销)。

? ? ? ? 场景传送需要分别执行卸载和加载场景。转换场景采用协程的形式,在等待转换特效结束后对当前场景执行UnLoadScene方法并加载新场景,利用协程的yield return就可以方便的对渐变和场景卸载进行等待。

? ? ? ? 完成场景加载后才可以进行下一步逻辑操作,因此需要通过事件了解场景何时加载完成,将后续的逻辑方法挂载到加载完成的事件上。

? ? ? ? (注:拖拽式的赋值对于同场景的物体一般不会丢失)

? ? ? ? 后续的工作包括玩家位置设置和相机边界获取。通过创建一个通知场景加载完成的事件,可以让相机脚本订阅此事件并去获取边界,由于初始场景不会执行传送门的转换流程所以触发不了此事件,需要将第一个场景的加载方式与传送门的加载相统一。

(三)制作场景渐入渐出效果

? ? ? ? 通过设置canvas上的image,控制其透明度来实现加载效果。图片需设置为不会阻挡射线,防止影响后续ui制作。

? ? ? ? 使用DoTween插件,一个面向对象的动画插件来制作加载效果。DOBlendableColor以颜色和时间为参数,可将目标对象的颜色逐渐转变为目标颜色。与先前“外部调用函数-函数调用事件-事件注册方法-方法执行功能”的SO代码类似,在新创建的SO代码中编写渐入渐出的方法,由SceneLoadManager控制调用,并由其执行后续事件。

(四)制作主菜单

? ? ? ? 主菜单单独作为一个场景制作,注意需要有一个相机来渲染场景,按住v启动定点吸附可以帮助绘图。

? ? ? ? 主菜单的文本如果需要更多的特效,可以创建TextMeshPro文本对象。TMP的字体是渲染成资产文件来使用的,在导入自己的字体时也要如此制作。当支持中文的字体的中文文本也出现乱码时,可考虑调大Atlas大小来增加渲染容量。在按钮的父对象上挂在Vertical Layout Group组件可以帮助子对象进行排版对齐。

? ? ? ? 目前在主菜单和场景切换时人物可以被操控移动,通过监听事件来阻止人物控制,在人物控制脚本中监听场景加载流程并对输入进行disable和enable,并在场景加载脚本中判断场景是否为Menu,若是则不恢复控制。玩家UI在主菜单界面的隐藏同理

(五)实现开始新游戏

? ? ? ? 在设置开始游戏之前需要先将游戏启动加载主菜单和第一个场景分开,在Start中加载主菜单(awake中太早会加载失败)。

? ? ? ? 在项目中创建一个无参数的ScriptableObject事件资源,并将其广播方法挂载到开始游戏按钮的事件上。然后在场景切换脚本中监听此事件并执行跳转到第一个场景的行为。

? ? ? ? 开始游戏时玩家属性也应回满,监听开始游戏的事件并调用对应方法。(关于敌人和玩家共用Character脚本的问题,大部分不同的功能的值是0,所以不会发生冲突。

? ? ? ? 当希望从键盘选择主菜单选项时,需要在EventSystem中设置初始选择对象,由于两者处于不同场景,而运行时只能由一个EventSystem启用,因此可以在主菜单的脚本中获取EventSystem并将初始的按钮传给它。

? ? ? ? 退出游戏则用Application.Quit();语句即可。

文章来源:https://blog.csdn.net/qq_52507260/article/details/135230693
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。