二十七.加载关卡

加载关卡

1.LevelSelectPlayer

添加参数

private bool levelLoading;  //是否正加载场景

Update()中的判断,加入条件,加载场景不能移动

//防止胡乱移动  加载场景时不能移动
if (Vector3.Distance(transform.position, currentPoint.transform.position) < 0.1f && !levelLoading)

判断之后加入跳转关卡信息

//跳转关卡
if (currentPoint.isLevel)
{
    if(Input.GetButtonDown("Jump"))
    {
        levelLoading = true;
        //...
    }
}

2.MapPoint

加入参数,表示待加载的关卡

public string levelToLoad;  //待加载的关卡

在关卡节点,分别设置levelToLoad的值,指定对应的加载的场景名

请添加图片描述

3.新建空节点LSManager

节点用来管理关卡选择

再新建c#脚本LSManager.cs,绑定至节点上

引入头文件

using UnityEngine.SceneManagement;

添加参数,获取当前Player

public LevelSelectPlayer thePlayer;

添加跳转场景代码

public void LoadLevel()
{
    StartCoroutine(LoadLevelCo());
}

public IEnumerator LoadLevelCo()
{
    yield return new WaitForSeconds(1f);

    SceneManager.LoadScene(thePlayer.currentPoint.levelToLoad);
}

将Player拖到对应的thePlayer

请添加图片描述

4.完善LevelSelectPlayer跳转场景

添加参数,指向LSManager

public LSManager theManager;    //关卡选择管理

将LSManager节点拖到对应的theManager上

请添加图片描述

完善加载场景代码

//跳转关卡
if (currentPoint.isLevel && currentPoint.levelToLoad != "")
{
    if(Input.GetButtonDown("Jump"))
    {
        levelLoading = true;
        //加载场景
        theManager.LoadLevel();
    }
}

5.加入淡入淡出效果

添加UI->Canvas组件到场景

在Canvas下,新建Panel,设置属性

请添加图片描述

新建关卡选择UI管理脚本LSUIController,添加组件到Canvas下绑定

添加头文件UI的引用

using UnityEngine.UI;

添加淡入淡出代码(与UIController相似)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LSUIController : MonoBehaviour
{
    public static LSUIController sInstance;

    //淡入淡出
    public Image fadeScreen;
    public float fadeSpeed;
    private bool shouldFadeToBlack;
    private bool shouldFadeFromBlack;

    private void Awake()
    {
        sInstance = this;
    }
    // Start is called before the first frame update
    void Start()
    {
        //开始时添加淡入效果
        FadeFromBlack();
    }

    // Update is called once per frame
    void Update()
    {
        if (shouldFadeToBlack)
        {
            fadeScreen.color = new Color(fadeScreen.color.r, fadeScreen.color.g, fadeScreen.color.b, Mathf.MoveTowards(fadeScreen.color.a, 1f, fadeSpeed * Time.deltaTime));
            if (fadeScreen.color.a == 1f)
            {
                shouldFadeToBlack = false;
            }
        }
        if (shouldFadeFromBlack)
        {
            fadeScreen.color = new Color(fadeScreen.color.r, fadeScreen.color.g, fadeScreen.color.b, Mathf.MoveTowards(fadeScreen.color.a, 0f, fadeSpeed * Time.deltaTime));
            if (fadeScreen.color.a == 0f)
            {
                shouldFadeFromBlack = false;
            }
        }
    }

    public void FadeToBlack()
    {
        shouldFadeToBlack = true;
        shouldFadeFromBlack = false;
    }
    public void FadeFromBlack()
    {
        shouldFadeFromBlack = true;
        shouldFadeToBlack = false;
    }
}

修改Panel为FadeScreen,拖入到对应的FadeScreen,并设置FadeSpeed值

请添加图片描述

最后,修改LSManager中加载场景,加入淡入

public IEnumerator LoadLevelCo()
{
    LSUIController.sInstance.FadeToBlack();

    yield return new WaitForSeconds(1f / LSUIController.sInstance.fadeSpeed + 0.25f);

    SceneManager.LoadScene(thePlayer.currentPoint.levelToLoad);
}
在 Unreal Engine 中实现关卡的动态加载是优化游戏性能和提升用户体验的重要技术,尤其适用于大型开放世界或需要按需加载资源的项目。Unreal Engine 提供了多种机制来实现动态加载关卡,主要包括使用 **World Composition**、**Level Streaming(关卡流)** 以及 **Blueprint 和 C++ API** 来控制加载和卸载。 ### 使用 Level Streaming 实现动态加载 Level Streaming 是 Unreal Engine 中最常用的动态加载关卡方式。它允许开发者在运行时根据玩家的位置或其他条件,动态加载和卸载子关卡(Sub-Level)。 在编辑器中,可以通过以下步骤配置: 1. 打开主关卡(Persistent Level)。 2. 在“World Outliner”中选择“Levels”选项卡。 3. 右键点击并选择“Add Existing Level to Streaming”或“Add New Level to Streaming”。 4. 设置关卡加载方式为 **Blueprint** 或 **Visibility Based**。 在 C++ 中,可以使用 `ULevelStreaming` 和 `ULevelStreamingDynamic` 来控制加载: ```cpp // 动态加载关卡 void LoadStreamingLevel(UWorld* World, const FName& LevelName) { ULevelStreamingDynamic* StreamingLevel = ULevelStreamingDynamic::LoadLevelInstance(World, LevelName, FVector::ZeroVector, true, true); if (StreamingLevel) { StreamingLevel->SetShouldBeLoaded(true); StreamingLevel->SetShouldBeVisible(true); } } ``` ### 使用 Blueprint 控制关卡加载 在 Blueprint 中,可以通过以下节点实现关卡的动态加载与卸载: - **Load Stream Level**:用于加载指定的关卡。 - **Unload Stream Level**:用于卸载指定的关卡。 - **Get Current Level Name**:获取当前关卡名称。 - **Set Active Actor**:控制加载后 Actor 的激活状态。 这些节点可以在事件图表中结合玩家位置检测、触发区域(Trigger Volume)等逻辑使用,实现基于区域的关卡加载策略。 ### 关卡加载的优化策略 1. **预加载机制**:在进入新区域前预先加载相关关卡,避免加载时的性能卡顿。 2. **异步加载**:利用异步加载机制确保主线程不会被阻塞[^1]。 3. **内存管理**:合理控制关卡卸载时机,避免内存占用过高。 4. **LOD(Level of Detail)策略**:对于远离玩家的关卡,可以选择性卸载或降低细节等级。 ### 多平台适配注意事项 在不同平台上,动态加载关卡的性能表现可能有所不同。例如,在主机平台上,由于内存和硬盘读取速度的限制,需要更精细地控制加载范围和时机。在移动平台上,建议减少同时加载关卡数量以降低内存占用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值