Unity3d中提供了场景Scene的概念,Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分!
场景中的游戏对象是任意的,可以是HUD的UI组件,场景地图,模型等等
Unity3d提供了一些切换场景的规则和方法(例如在切换场景时不销毁某些GameObject,同步,异步加载场景API),但是并没有提供一个通用的场景管理的模块(想要做到“通用”是很难的)
在实际开发中,有些开发者摒弃了Scene模块,即整个游戏只有一个Scene,然后自己实现一套“窗口”对象以及“窗口”管理模块,以达到场景管理和通信的目的,这样的好处在于更灵活的控制场景对象;同样,坏处也很明显,即工作量会很大!
我在开发中也做了一套简单的场景管理模块,其主要功能包括:
1.使用一个栈来保存玩家在游戏中场景的载入先后关系(方便Back功能实现以及记录当前场景ID)
2.提供切换场景,压栈场景,出栈场景方法
3.提供异步加载场景,并提供加载进度(用以显示Loading条)
Unity3d将组件设计模式发挥的淋漓尽致,很多开发者都可以方便灵活的制作各种插件,如果足够抽象,便可以为其它项目很方便的使用!Scene Manager就是其中一个,官网地址
1.功能
Scene Manager提供了2个场景的概念:Screen和Level
Screen:即相互之间没有关联的场景模块(例如登陆场景,主菜单场景,游戏场景之间的关系),其之间并没有严格的先后关系,更接近于Unity3d中Scene的概念
Level:即游戏场景中的关卡模块,有一定的先后关系,并且逻辑相同,Scene Manager为Level提供了一些关卡关系的方法,包括当前关卡,上一个关卡,关卡状态,参考SMLevelProgress 类
这2个场景的概念在Unity3d看来都是Scene的意义,之所以这样区分是为了将Scene的概念更细化!
其提供了下图的编辑界面,我们只需要创建一个SceneConfiguration来编辑游戏中所有Scene的类别和关系
2.实现
(1)SMSceneManager
一旦Scene Configuration创建完成之后,即可以在第一个“Screen场景”中创建出单例类SMGameEnvironment实例,其
其构造方法中完成对SMSceneManager与SMLevelProgress实例的创建:
(注意一定要在Screen场景中实例化SMGameEnvironment,如果是Level场景,则有可能对各个Level之间的关系有错误)
SMSceneManager提供切换场景的接口(包括加载场景,加载关卡,加载第一个关卡)
SMLevelProgress用以保存Level之间的关系(包括当前Level,上一Level,当前Level状态)
(2)SMTransition
SMTransition及其子类,提供了很多方便的切换场景(包括Screen和Level)动画效果,包括 淡入淡出,闪烁,卡通等等
(这些动画效果都作为Prefab保存在SceneManager/Resources/Transitions/下)
SMTransition作为基类,提供了是否异步加载场景,实际调用Unity3d API切换场景方法,但主要提供了一个动画的模板方法DoTransition(),代码如下:
protected virtual IEnumerator DoTransition() {
// 第一部分:之前场景退出动画
state = SMTransitionState.Out;
Prepare();
float time = 0;
while(Process(time)) {
time += Time.deltaTime;
// wait for the next frame
yield return 0;
}
// wait another frame...
yield return 0;
// 第二部分:保证SMTransition对象不被销毁(完成后续动画)
state = SMTransitionState.Hold;
DontDestroyOnLoad(gameObject);
// wait another frame...
yield return 0;
IEnumerator loadLevel = DoLoadLevel();
while (loadLevel.MoveNext()) {
yield return loadLevel.Current;
}
// wait another frame...
yield return 0;
// 第三部分:新场景载入动画
state = SMTransitionState.In;
Prepare();
time = 0;
while(Process(time)) {
time += Time.deltaTime;
// wait for the next frame
yield return 0;
}
// wait another frame...
yield return 0;
Destroy(gameObject);
}
在SMTransition的子类中,分别实现Prepare()虚方法和Process(float elapsedTime)抽象方法
例如 SMFadeTransition 类中,通过传入参数elapsedTime与配置淡入淡出参数duration计算得到当前进度,正交化进度,得到当前遮盖的alpha值,并在OnGUI绘制,代码如下:
protected override bool Process(float elapsedTime) {
float effectTime = elapsedTime;
// invert direction if necessary
if (state == SMTransitionState.In) {
effectTime = duration - effectTime;
}
progress = SMTransitionUtils.SmoothProgress(0, duration, effectTime);
return elapsedTime < duration;
}
public void OnGUI() {
GUI.depth = 0;
Color c = GUI.color;
GUI.color = new Color(1, 1, 1, progress);
GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), overlayTexture);
GUI.color = c;
}
其它SMTransition子类也通过Process(float elapsedTime)实现切换动画效果!
PS: 在异步加载场景中,Scene Manager中并没有提供一个获取当前加载进度的接口,需要自己实现,在SMTransition类中
protected virtual YieldInstruction LoadLevel() {
if (loadAsync) {
AsyncOperation ao = Application.LoadLevelAsync(screenId);
Debug.Log("Progress: " + ao.progress);
return ao;
//return Application.LoadLevelAsync(screenId);
} else {
Application.LoadLevel(screenId);
return null;
}
}
分享到:
相关推荐
[编辑器扩展] SceneManager方便快捷的场景管理插件;官网35美金
Screen:即相互之间没有关联的场景模块(例如登陆场景,主菜单场景,游戏场景之间的关系),其之间并没有严格的先后关系,更接近于Unity3d中Scene的概念 Level:即游戏场景中的关卡模块,有一定的先后关系,并且...
PoolManager manages instances more efficiently to increase performance, organize the scene hierachy and is simple to implement. When an instance is needed over and over why destroy it? Re-use it! Pool...
资源名称:Unity 3D游戏场景设计实例教程 资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
在这个项目中,我将对15个场景数据库(Bedroom、Coast、Forest、Highway、Industrial、InsideCity、Kitchen、LivingRoom、Mountain、Office、OpenCountry、Store、Street、Suburb、TallBuilding)进行训练和测试,...
Scene Creator 场景创建器Unity开发插件包 支持Unity版本2019.4.28及以上 描述 Scene Creator 是一款方便易用的编辑器工具,旨在简化创建新场景的过程。使用场景创建器,您可以选择模板场景,定义一个目录来存储场景...
unity3d 工具箱拖动预制体(Prefabs)、粒子特效(Particle)到场景
Unity3D教程:布娃娃系统在Hierarchy视窗内将人物(Man)的Bip01所有标签打开,以便观看所有骨架物件,之後在Scene视窗内选中人物 (Man
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。 Unity3D的PC插件安装量达到2 亿...
基于Unity引擎编写的适合在3D场景中内画平滑线的脚本,无需修改可直接使用,仅供学习参考。
RealSky Unity3d实时动态天空球插件 ,unitypackage格式 支持PC端,也支持移动设备 RealSky is a simple, real-time sky solution specifically designed for low end mobile devices. Key Features: * Easy to ...
Unity3d AssetBundle反编译工具,查问题,获取资源辅助
Unity场景查询 一个用于遍历和查询场景以查找特定游戏对象的库。 查询语言用于识别游戏对象,其外观类似于。 有关深入的报道,请阅读有关的文章。 例子 此回购包含一些示例。 场景遍历的更多示例: : 。 场景...
3dMax场景单位转换插件下载、3dmax一键转换场景单位。
unity3d平台上的一个场景集合,有很多科技感的面板和button,摄像机视角可自由变换
unity3d精美的咖啡馆场景资源,还有好多资源包,可以下载后直接导入使用!
unity 3D云彩资源包3D Cloud Models(unity2017.4版本可能无法使用) Features: * 15 low polygon models: Duplicate, move, rotate, and scale the clouds in your scene to create epic skies and artistic ...
Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分! 那么怎么管理游戏场景及游戏关卡是很重要的一个问题。...如下介绍一款插件:Scene Manager
场景推子管理器一个场景推子管理器,可加载场景并执行任务。 带有一个广泛的SceneUtility类,用于处理场景管理。先决条件该程序包使用Singleton和StateMachineCallback程序包。 建议在安装此软件包之前先安装这两个...
Unity3D鼠标拖拽绕任意轴旋转的实现