- 官方ECS进阶案例解析之场景切换器
- 开始之前的准备工作:
- ECS进阶:SceneSwitcher
- 小结
- 更新计划
- 作者的话
- ECS系列目录
- ECS官方示例1:ForEach
- ECS官方案例2:IJobForEach
- ECS官方案例3:IJobChunk
- ECS官方案例4:SubScene
- ECS官方案例5:SpawnFromMonoBehaviour
- ECS官方案例6:SpawnFromEntity
- ECS官方案例7:SpawnAndRemove
- ECS进阶:FixedTimestepWorkaround
- ECS进阶:Boids
- ECS进阶:场景切换器
- ECS进阶:MegaCity0
- ECS进阶:MegaCity1
- UnityMMO资源整合&服务器部署
- UnityMMO选人流程
- UnityMMO主世界
0下载Unity编辑器(2019.1.0f1 or 更新的版本),if(已经下载了)continue; 1下载官方案例,打开Git Shell输入: git clone https://github.com/Unity-Technologies/EntityComponentSystemSamples.git --recurse
or 点击Unity官方ECS示例下载代码 if(已经下载了)continue; 2用Unity Hub打开官方的项目:ECSSamples 3在Assets目录下找到Tests/SceneSwitcher,并打开其下的SceneSwitcher场景
场景切换器,顾名思义是用来切换场景的,这种功能很早就学会了。可是官方既然在这里做了案例,是想表达ECS的场景切换和之前的有什么不同吗?一起来看看吧: 场景中仅有一个SceneSwitcher空对象,上面挂了一个SceneSwitcher脚本,看来只有打开脚本看看了:
///
/// 场景切换器
///
public class SceneSwitcher : MonoBehaviour
{
///
/// 场景配置
///
[Serializable]
public class SceneConfig
{
public string SceneName;//场景名称
public int CustomDuration;//自定义持续时间
}
///
/// 场景切换间隔
///
public int SceneSwitchInterval = 5;
///
/// 下次切换时间
///
public float TimeUntilNextSwitch = 0.0f;
///
/// 当前场景索引
///
public int CurrentSceneIndex = 0;
///
/// 是否已摧毁实体
///
public bool EntitiesDestroyed = false;
///
/// 场景配置
///
public SceneConfig[] SceneConfigs;
// Use this for initialization
void Start ()
{
DontDestroyOnLoad(this);
LoadNextScene();
}
///
/// 摧毁场景中的所有实体
///
private void DestroyAllEntitiesInScene()
{
//1.获取实体管理器
var entityManager = World.Active.EntityManager;
//2.获取所有实体
var entities = entityManager.GetAllEntities();
//3.摧毁之
entityManager.DestroyEntity(entities);
//4.释放实体管理器
entities.Dispose();
//5.已摧毁
EntitiesDestroyed = true;
}
///
/// 加载下一个场景
///
private void LoadNextScene()
{
//获取在构建设置里的场景数量
var sceneCount = SceneManager.sceneCountInBuildSettings;
var nextIndex = CurrentSceneIndex + 1;
if (nextIndex >= sceneCount)
{
Quit();
return;
}
var nextScene = SceneUtility.GetScenePathByBuildIndex(nextIndex);
TimeUntilNextSwitch = GetSceneDuration(nextScene);
CurrentSceneIndex = nextIndex;
SceneManager.LoadScene(nextIndex);
EntitiesDestroyed = false;
}
private int GetSceneDuration(string scenePath)
{
foreach (var scene in SceneConfigs)
{
if (!scenePath.EndsWith(scene.SceneName +".unity"))
continue;
if (scene.CustomDuration 0.0f)
return;
if (!EntitiesDestroyed)
{
DestroyAllEntitiesInScene();
}
else
{
DestroyAllEntitiesInScene();
LoadNextScene();
}
}
}
这个脚本逻辑非常简单,加载实体场景的方式和咱们原来的用法一样,都是使用SceneManager。 唯一值得注意的是要把上一个场景的实体全部摧毁,这个过场官方还没有封装到SceneManager里面去,所有需要手动调用一下。我猜想Unity也许会重写SceneManager来管理实体场景,毕竟改变要做得彻底才行,目前由于ECS的不完善,开发的时候是混合式的,也就是说实体和对象同时存在。所以这个阶段比较尴尬,正处于新老两代引擎过渡的时候,但也是思维模式转换的最佳时期,我们可以很好的理解ECS,跟着Unity一起进化。
小结场景切换流程大体如下:
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录