在开发VR游戏的时候,经常用到的就是场景之间跳转的过渡了,之前未了解到SteamVR中有这个功能的时候,都是自己通过一个空的过渡场景配合协程实现。附上我自己框架里面的关卡管理器脚本:
/****************************************************
文件:LevelManag.cs
作者:Paul 邮箱: 794451358@qq.com
日期:2019/9/18 12:20:26
功能:关卡管理器
*****************************************************/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using System;
namespace PFarmeWork
{
/// <summary>
/// 关卡(场景)管理器,2021/3/5更改为单例模式
/// </summary>
public class LevelManager : MonoSingleton<LevelManager>
{
/// <summary>
/// 存储场景的列表,当使用顺序加载时需要赋值
/// </summary>
private List<string> mLevelNames;
private AsyncOperation m_AsyncOperation = null;
private bool m_IsLoad = false;
private Coroutine m_LoadCoroutine = null;
/// <summary>
/// 顺序加载时的标号
/// </summary>
public static int Index { get; set; }
/// <summary>
/// 顺序加载的场景存储列表初始化
/// </summary>
/// <param name="levelNames">场景存储列表</param>
public void AddSceneToList(List<string> levelNames)
{
mLevelNames = levelNames;
Index = 0;
}
/// <summary>
/// 重新加载当前关卡
/// </summary>
public void LoadCurrent()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
/// <summary>
/// 顺序加载下一个场景
/// </summary>
public void LoadNext()
{
Index++;
//容错处理
if (Index >= mLevelNames.Count)
{
Index = 0;
}
SceneManager.LoadScene(mLevelNames[Index]);
}
/// <summary>
/// 同步加载场景(用于加载中转场景)
/// </summary>
/// <param name="name">场景名字</param>
public void LoadSceneByName(string name)
{
if (!string.IsNullOrEmpty(name))
{
SceneManager.LoadScene(name);
}
else
{
Debug.LogError("场景名字不能为空!");
}
}
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="name">用于加载普通场景</param>
/// <param name="showLoadProcess">显示场景加载进度的回调</param>
public void LoadSceneByNameAsync(string name, Action<string> showLoadProcess = null)
{
if (!string.IsNullOrEmpty(name))
{
m_LoadCoroutine = StartCoroutine(LoadAsync(name, showLoadProcess));
}
else
{
Debug.LogError("场景名字不能为空!");
}
}
IEnumerator LoadAsync(string name, Action<string> cb)
{
int startProcess = -1;
int endProcess = 100;
while (startProcess < endProcess)
{
startProcess++;
cb?.Invoke(startProcess.ToString());
if (!m_IsLoad)
{
m_AsyncOperation = SceneManager.LoadSceneAsync(name);
m_AsyncOperation.allowSceneActivation = false;
m_IsLoad = true;
}
yield return new WaitForEndOfFrame();
if (startProcess == 100)
{
m_AsyncOperation.allowSceneActivation = true;
StopCoroutine(m_LoadCoroutine);
}
}
}
}
}
后来在学习unity 中国官方的学习网站里面的课程SteamVR2.X的交互开发指南中,知道了SteamVR中有一个脚本可以实现这个功能,并且封装得十分好用。
场景过渡
使用SteamVR_LoadLevel
这个组件是用给定的天空盒六面图替换掉SteamVR的默认环境
在使用这个脚本进行宣传图片呈现时,如果是PNG格式的,要勾选Alpha Is Transparency。Compression要选为None
拖入进度条的背景和填充图片
Loading Screen Width In Meter:3
Progress Bar Width In Meter :1
Loading Screen Distance : 0(无限远)
Loading Screen Transform 和Progress Bar Transform可以在场景中灵活设置后,赋值
Post Load Settle Time :5 (场景等待时间)
给有相同需求的同学参考一下~