【unity】学习制作2D横板冒险游戏-7-

场景

完善地图,该地图为第一个场景,名为Forest

场景的路径如图所示,改名为Fores

再创建一个场景,后续会完成场景之间的转换,即地图之间的切换

两场景路径如图所示

可以将场景都放到层级窗口,方便展示

搭建第一个场景

搭建第二个场景,


场景层级分配如下

场景的激活

在这两个场景中,一个是加粗字体,一个是普通字体

加粗字体代表该场景是激活状态,所有的操作都是在该场景下完成
比如即使选中cave添加一个game object也是默认添加在forest下因为forest是激活状态

因此在进行场景的布置时,记得先激活该场景避免操作错了场景

可互动标识

在进入矿坑时,我们应该按什么键进入矿坑呢?遇到宝箱应该按什么键呢?
先创建一个宝箱,切割一下宝箱素材并命名

给箱子添加一个game object

给箱子添加一个碰撞器用来检测人物走到宝箱的位置

走到宝箱的位置后,人物的头顶应该显示按钮的图片,提示玩家按下相应的键进行互动
剪切一下按键素材

将按钮放到Player的子级,修改一下位置和大小

图层front确保不会被遮挡

添加一个Animator完成其动画效果

创建一个UI文件夹用来装动画

创建动画控制器

创建Animation

导入素材完成动画

创建一个父级用来放置代码逻辑

添加一个碰撞体改为trigger

修改层级,防止被敌人攻击时触发

创建逻辑脚本

获得组件的代码

anim = GetComponentInChildren();
这行代码的作用是从当前对象(执行这行代码的对象)的所有子对象中查找 Animator 组件。GetComponentInChildren() 方法会递归地在当前对象的所有子对象搜索Animator。一旦找到第一个 Animator 组件,它就会停止搜索并返回该组件的引用。如果没有找到,anim 将被赋值为 null

anim = signSprite.GetComponent();
这行代码的作用是从一个特定的对象 signSprite 中获取 Animator 组件。GetComponent() 方法只会在直接附加到 signSprite 对象上的组件中搜索组件。如果 signSprite 对象上有一个 Animator 组件,那么 anim 将被赋值为这个组件的引用;如果没有,anim 将被赋值为 null。

因为在默认情况下,子物体是关闭的(只有靠近宝箱才会激活并显示),因此用第二种方法获得子物体

创建一个标签,当人物接触到该标签时触发

编写触发代码
检测到标签--》anpress为正--》Active为正,即激活gameobject

测试发现按钮会随着人物反转
思路是反转后人物scale.x为-1,按钮scale.x等于人物的,负负得正为一

经测试会发现像素尺寸问题

原因是原大小为0.1倍即scale(0.1,0.1,1),因解决反转scale被设置为1倍
修改代码

运行后成功且不会反转

但是启动后不会消失,添加触发退出代码

教程中还教学了其他设备时播放不同的按键动画,因没有素材,暂时搁置

场景互动/接口

做好按钮的标识后,如何按下按键就可以互动呢?
我们使用一个接口的方法,一个接口interface的脚本简称I

接口(Interface)是一种非常重要的编程概念,它定义了一组方法,但不实现这些方法。接口允许你定义类的行为,而不必关心具体的实现细节。这在实现多态性、解耦代码以及提高代码的可维护性和可扩展性方面非常有用。

创建一个交互接口脚本

代码如下

创建一个Chest脚本挂载到宝箱上

实现接口

在inputsysytem中添加互动按钮

设置为e键

编写代码
遇到物体--》获得接口--》按下键盘--》通过接口运行触发代码

成功

编写打开宝箱的代码

实例化

成功打开

打开宝箱之后,修改标签--》提示按钮消失

成功消失

添加一个音效

添加音乐控制脚本

获得音乐组件并播放

顺手给跳跃加上音效

跳跃音效

按一下空格就有一个声音,修改一下代码

完成

传送门前的准备

现在有了宝箱互动,我们还需要传送到下一关卡的互动
新建一个gameobject

添加碰撞体

调整大小

修改标签

创建脚本

实现接口

我们需要执行什么呢?卸载一个场景,加载另一个场景并重置人物的坐标位置

先声明一个坐标

手动卸载当前场景

加载另一个场景

看一下人物应该在那个位置

直接复制

然后粘贴

我们需要一个全局的脚本来掌控坐标,防止场景被关闭时坐标丢失
创建一个game object

创建一个场景加载控制脚本并挂载

Addressables

Addressables是Unity提供的一个用于动态加载和管理游戏资源的系统,它基于AssetBundles构建,但提供了一个更为用户友好的界面来管理这些资源包。

远程分发内容:Addressables支持远程资源包的加载,这意味着开发者可以在运行时从远程服务器上下载所需资源。(可以用来热更新)

运行时内容管理:开发者可以在运行时加载、卸载和管理资源,从而优化游戏的性能和内存使用。
自动依赖关系和内存管理:Addressables会自动处理资源之间的依赖关系,并在资源不再被引用时自动卸载它们,从而简化了内存管理。
(比如在地图中会有好几个野猪,正常加载时所有场景的所有野猪会全部加载出来,浪费内存。如果放到Addressables中就只需要加载一个场景的野猪,进入其他场景时会重新加载)

添加Addresables插件

添加窗口

创建基本设置

会自动生成很多文件,包括打包时的一些配置文件

将场景添加到Addressable(省内存)

简化名称

简化效果如图

预制体

预制体允许开发者快速创建和复用游戏对象,显著提升开发效率,减少重复劳动。通过合理利用预制体,开发者可以更加高效地创建和管理游戏对象,从而加速游戏开发进程。

创建一个文件夹用来存放预制体

将野猪拖进来,自动生成野猪的预制体

修改预制体则场景中的都会同步修改

打包进addressable(节省空间,避免重复打包)

创建addressable文件夹分类

场景的管理和切换

创建场景变幻时的转换效果的文件脚本

代码如下

创建So文件

加载场景为forest

再创建一个加载洞穴的场景

创建传递场景加载参数的事件脚本

声明场景

实例化场景

加载第一个场景

Addressables.LoadSceneAsync方法是Addressable Asset System(可寻址资产系统)的一部分,用于异步加载场景,这意味着加载过程是在后台进行的,不会阻塞游戏的主线程,从而允许游戏在加载场景的同时继续运行。

firstLoadScene.sceneReference指向了要加载的场景。

LoadSceneMode.Additive:这是LoadSceneMode枚举的一个值,指定了加载场景的模式。Additive模式意味着新场景将被加载到当前场景中,而不是替换当前场景。这允许开发者在运行时动态地添加额外的场景内容,而不会丢失当前场景中的任何内容。

先卸载全部场景

运行游戏,场景加载成功

在Enum中添加加载场景的类型,一种类型时地图Loaction类型,一种是菜单Menu类型

创建枚举变量

给场景分配类型

传送去哪

森林传送去洞穴

场景加载事件代码

添加传送时加载场景的事件

实例化

编写传送时呼叫代码

场景加载脚本接收并启动事件的代码

启动事件后,需要先卸载当前场景并加载之后的场景,而且是要在渐进渐出效果等待一会后进行卸载与加载(完全黑屏后,避免被戳穿,因此要协程进行(等待渐进渐出后进行加载
卸载和加载的代码

IEnumerator 携程函数

执行卸载和加载的携程

StartCoroutine:这是Unity中用于启动协程的方法。协程是一种可以在多个帧之间分散执行的函数,非常适合用于需要花费多个帧时间来完成的任务,比如加载或卸载场景、等待玩家输入、执行延迟操作等。

运行后有报错空引用

切换场景的赋值不对等,修改代码

场景切换成功,坐标和渐进效果代码待完善

逻辑关系如图

posted @ 2025-03-29 15:39  plusu  阅读(135)  评论(0)    收藏  举报