您当前的位置: 首页 > 

CloudHu1989

暂无认证

  • 4浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ECS进阶案:场景切换器

CloudHu1989 发布时间:2019-08-12 14:57:09 ,浏览量:4

基于Unity2019最新ECS架构开发MMO游戏笔记9
  • 官方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主世界

官方ECS进阶案例解析之场景切换器 开始之前的准备工作:

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

场景切换器,顾名思义是用来切换场景的,这种功能很早就学会了。可是官方既然在这里做了案例,是想表达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一起进化。

小结

场景切换流程大体如下:

SceneManager
Start
LoadNextScene
LoadScene
Time.deltaTime
大于0.0f
关注
打赏
1664096582
查看更多评论
立即登录/注册

微信扫码登录

0.1983s