首页 > 其他分享 >Unity引擎2D游戏开发,场景管理和切换

Unity引擎2D游戏开发,场景管理和切换

时间:2024-02-22 20:36:07浏览次数:34  
标签:场景 void private 2D Unity 引擎 GameSceneSO public 加载

需要用到的工具

资源打包、远程热更新工具

image

Addressables工具基本操作

在Window菜单下方,会有Asset Management,选择Addressables中的Groups

image

会弹出相关菜单,将其拖入底部工具栏

image

会提示没有创建Addressables的相关配置,则点击Create Addressables Settings

image

这时候会在Project中,多出了一个AddressableAssetsData

image

由于目前需要此工具进行场景管理和打包,所以可以命名为Scenes

image

现在可以选中场景,在右侧的Inspector中,能够看到多出了一个可勾选项——Addressable

image

勾选后,就能够看到Addressable Groups中,多出了刚才勾选的场景。现在就已经加载到了Addressable中

image

不过在添加之后,会提示一个警告:一个场景被标记为使用可寻址资源加载程序,它当前已经从构建列表中取消

image

因为通常操作方式,实在Build Setting中进行构建打包,不过使用了Addressable进行构建的话,就替代了常规的构建方式。通常使用常规构建打包很多场景的话,会使包体占用空间很大。使用Addressable进行构建打包,会有更精巧的包体

image

预制体(Prefab)

预制体(Prefab)是用来提供跨场景调用、解决频繁复制、能够快速调用、统一修改实体参数的解决方案

在Assets目录中新建Prefabs文件夹

image

将敌人实体对象拖入到Prefabs文件夹中

image

这时候能看到敌人实体前的图标变成了蓝色,这时候就已经成为了预制体

那么这时候,无论Hierarchy窗口中的敌人对象有多少个,只要操作Prefabs目录内的对象对参数进行修改,所有被创建的同一个敌人的数据都会进行变动

image

加载场景和物体

当传送到下一张某个地图时,Teleport需要告诉SceneLoad Manager要加载什么场景。然后需要创建两个脚本,用于记录加载的场景和Addressable的资源

image

创建SceneLoadEventSO脚本

image

using UnityEngine;

[CreateAssetMenu(menuName = "Event/SceneLoadEventSO")]
public class SceneLoadEventSO : ScriptableObject
{

}

紧接着再创建一个GameSceneSO脚本,用于调用Addressable资源

image

using UnityEngine;
using UnityEngine.AddressableAssets;

[CreateAssetMenu(menuName = "Game Scene/GameSceneSO")]
public class GameSceneSO : ScriptableObject
{
    public AssetReference assetReference;
}

在Assets目录中,Data SO下创建GameSceneSO,命名为Cave

image

选中GameSceneSO,在右侧Inspector中,能够看到Asset Reference的选择框,这里面就是已经加载到Addressable中的资源。选中对应的场景,即可表示这个SO会加载这个场景

image

打开SceneLoader代码,添加GameSceneSO和SceneLoadEventSO对象全局变量

[Header("事件监听")]
public SceneLoadEventSO loadEventSO;
public GameSceneSO firstLoadScene;

然后调用Addressable命名空间,异步加载这个场景

private void Awake()
{
    // 异步加载
    Addressables.LoadSceneAsync(firstLoadScene.assetReference, UnityEngine.SceneManagement.LoadSceneMode.Additive);
}

与此同时,需要选择一个Game Scene SO,来表示需要加载什么场景

image

启动游戏,这时候就可以加载出需要的场景了

image

在枚举类中,添加一个枚举类型,用于标记加载的场景类型。因为第一次加载的不一定是一个场景,可能是主菜单页面

public enum SceneType
{
    Location, Menu
}

在GameSceneSO中,添加这个枚举类型

public class GameSceneSO : ScriptableObject
{
    public SceneType sceneType;

    public AssetReference assetReference;


}

打开TeleportPoint传送点的代码,添加一个全局变量,用于标识传送点去往的场景

public class TeleportPoint : MonoBehaviour, IInteractable
{
    // 去往的场景
    public GameSceneSO sceneToGo;

    // 坐标点
    public Vector3 positionToGo;
    
    public void PlayFXAudio()
    {
        
    }

    public void TriggerAction()
    {
        
    }
}

在Teleport Point中,Scene To Go选择框选择一个传送目的地的场景,接下来就需要把Scene To Go和Position传入到SceneLoadManager中

image

在SceneLoadEventSO中,编写加载目的地场景的相关代码

using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(menuName = "Event/SceneLoadEventSO")]
public class SceneLoadEventSO : ScriptableObject
{
    public UnityAction<GameSceneSO, Vector3, bool> LoadRequestEvent;

    /// <summary>
    /// 场景加载请求
    /// </summary>
    /// <param name="gameSceneSO">要加载的场景</param>
    /// <param name="position">人物目的地坐标</param>
    /// <param name="fadeScreen">是否淡入淡出</param>
    public void RaiseLoadRequestEvent(GameSceneSO gameSceneSO, Vector3 position, bool fadeScreen)
    {
        LoadRequestEvent?.Invoke(gameSceneSO, position, fadeScreen);
    }
}

接下来,在Event目录中新建Scene Load Event SO,并在Teleport中,将该SO添加到Load Event SO中

image

image

在Teleport的TriggerAction()方法中,编写唤起加载场景的事件

public void TriggerAction()
{
    loadEventSO.RaiseLoadRequestEvent(sceneToGo, positionToGo, true);
}

在SceneLoader中,写SceneLoadEventSO的装载和卸载的代码

private void OnEnable()
{
    loadEventSO.LoadRequestEvent += onl oadRequestEvent;
}

private void OnDisable()
{
    loadEventSO.LoadRequestEvent += onl oadRequestEvent;
}

编写当事件唤起时需要执行的操作,创建三个全局变量,用于临时存储Teleport唤起事件时候传入的参数

private GameSceneSO targetSceneToGo;
private Vector3 targetPositionToGo;
private bool fadeScreen;

private void onl oadRequestEvent(GameSceneSO sceneToGo, Vector3 positionToGo, bool fadeScreen)
{
    targetSceneToGo = sceneToGo;
    targetPositionToGo = positionToGo;
    this.fadeScreen = fadeScreen;
    // 卸载当前场景,装载下一个场景
    StartCoroutine(UnloadPreviousScene());
}

private IEnumerator UnloadPreviousScene()
{
    if (fadeScreen)
    {
        // TODO:实现淡入淡出
    }
    // 等待淡入淡出的指定时间
    yield return new WaitForSeconds(fadeTime);
    // 卸载场景
    yield return currentLoadScene.assetReference.UnLoadScene();
    
    LoadNewScene();
}

private void LoadNewScene()
{
    // 加载新场景
    targetSceneToGo.assetReference.LoadSceneAsync(LoadSceneMode.Additive, true);
}

解决转换场景后报空引用的问题

将Awake()方法中的代码进行调整

private void Awake()
{
    // 获取当前场景
    currentLoadScene = firstLoadScene;
    // 异步加载
    currentLoadScene.assetReference.LoadSceneAsync(LoadSceneMode.Additive);
}

标签:场景,void,private,2D,Unity,引擎,GameSceneSO,public,加载
From: https://www.cnblogs.com/xinlindeyu/p/18028090

相关文章

  • cocos2d
    cocos2d是一个功能强大的二维游戏开发框架,最初,它只是一个专为Python设计的小型项目,但它的跨平台能力和功能丰富的API很快就让它崭露头角,成为移动游戏开发的重要工具。开发者社区也针对cocos2d进行了众多拓展,比如cocos2d-x,它提供了对Python3的支持,是参与现代游戏开发项......
  • Docker引擎开启ipv6
    启用IPv6支持在Docker容器中使用IPv6之前,您需要在Docker守护程序中启用IPv6支持。之后,您可以选择使用IPv4或IPv6(或两者都使用)与任何容器或网络。IPv6仅在运行在Linux主机上的Docker守护程序中受支持。注意当使用IPv6时,我们建议您在守护程序配置中启用实验性的ip6tables参数。......
  • Unity引擎2D游戏开发,场景互动的逻辑实现
    创建接口由于所有可互动的物体都会有一个共通的属性,即“互动”的处理。因此,新建一个接口,让所有可互动的物体都实现这个接口内的互动处理方法新建接口创建一个处理互动逻辑的抽象方法publicinterfaceIInteractable{voidTriggerAction();}创建处理宝箱交互逻辑的脚......
  • 2024年十大磁力搜索引擎排名下载教程-JAVA
    磁力技术相对比较顶尖的几大磁力厂商推荐使用磁力导航  www.okeyl.com随着互联网的发展,搜索引擎已经成为人们日常生活中必不可少的工具之一。每当我们想查找信息时,我们都会去使用搜索引擎。然而,在众多的搜索引擎中,哪些才是真正有用的呢?下面我们就来探讨一下搜索引擎前十排名。......
  • Unity中关于刚体和碰撞器遇到的告警
    告警信息:Scripterror:OnCollisionEnter2DThismessageparameterhastobeoftype:Collision2DThemessagewillbeignored.  解决:经查验发现,由于该脚本是粘贴的类似功能脚本,而粘贴前使用的触发器,因此方法为 privatevoidOnTriggerStay2D(Collider2Dcollision),而......
  • [技术选型与调研] 流程引擎/工作流引擎:Activiti、Flowable、Camunda
    1概述:流程与流程引擎低代码平台、办公自动化(OA)、BPM平台、工作流系统均需要流程引擎功能【工作流引擎的三大功能】1)验证当前过程状态:在给定当前状态的情况下,检查是否有效执行任务。2)确定用户权限:检查是否允许当前用户执行任务。3)执行条件脚本:经过前两个步骤后,工作流引擎......
  • Unity引擎2D游戏开发,切换场景与人物可互动标识总结
    切换场景可以通过新建一个持久化地场景,将所有常驻元素放置进此场景里面,然后再将进入的场景加载(Loud)在Hierarchy窗口中。如果切换了其他某一个场景,再将离开的场景停用(Unload),进入的场景加载(Loud),即可实现。创建持久化场景,移入Hierarchy将所有永恒不变,常驻的元素移入此创建的持久......
  • Unity中的SerializeReference使用简介
    Unity默认可以序列化值类型,Serializable属性修饰的类型,派生自UnityEngine.Object的类型,通常这些类型已经足以供日常使用了.但是有时我们希望在编辑器面板上序列化一个接口或者抽象类,则需要用到SerializeReference属性.假定我们有一个接口IEatable,并实现了两个类Brea......
  • 提高办公效率,可以多了解流程引擎表单
    当前,为了提升办公协作效率,很多企业倾向于低代码技术平台带来的高效率和便利性。如果利用流程引擎表单,可以帮助企业做好数据资源的利用率,为企业搭建好沟通桥梁,成功提升办公协作率,创造更高的市场价值。那么,什么服务商拥有流程引擎表单?流辰信息就是一家专业研发低代码技术平台的服务......
  • 百度搜索exgraph图执行引擎设计与实践
    导读百度搜索exgraph图执行引擎设计重点分成三个部分:图描述语言、图执行引擎、对接扩展。图描述语言是一种基于文本可读的图描述语言,用于描述任务中的算子以及算子之间的依赖关系,即让人可以理解,也可以被计算机理解并执行。图执行引擎是exgraph的核心,负责根据图描述语言生成的......