版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明!

由来

  • 上篇文章中,我们修改了登录页面的异步处理,下面我们修改登录成功后进入主游戏场景的代码:
namespace ETHotfix
{
[Event(MyEventType.MyLoginFinish)]
class MyLoginFinish : AEvent
{
public override void Run()
{
RunAsync().Coroutine();
} private async ETVoid RunAsync()
{
Log.Debug("移除登录UI");
UI uiLogin = Game.Scene.GetComponent<UIComponent>().Get(MyUIType.MyStartUI.ToString());
uiLogin.GameObject.SetActive(false); Log.Debug("加载游戏场景"); // 方法1:同步加载
//SceneManager.LoadScene(1); // 方法2:从ab包异步加载
var rc = ETModel.Game.Scene.GetComponent<ResourcesComponent>(); await rc.LoadBundleAsync(MySceneType.MyGame.StringToAB()); // 异步加载游戏场景
using (var scc = ETModel.Game.Scene.AddComponent<SceneChangeComponent>())
{
await scc.ChangeSceneAsync(MySceneType.MyGame); // => SceneManager.LoadSceneAsync(MySceneType.MyGame)
} // SceneChangeComponent.Dispose()会从该组件所在的Entity上移除其自身 // 发出场景加载完毕消息
Game.EventSystem.Run(MyEventType.MyGameSceneLoaded);
}
}
}

场景切换

  • 这里的场景切换组件就有点意思了!先上代码再分析:
[ObjectSystem]
public class SceneChangeComponentUpdateSystem: UpdateSystem<SceneChangeComponent>
{
public override void Update(SceneChangeComponent self)
{
if (self.loadMapOperation.isDone)
{
self.tcs.SetResult();
}
}
} public class SceneChangeComponent: Component
{
public AsyncOperation loadMapOperation;
public ETTaskCompletionSource tcs;
public float deltaTime;
public int lastProgress = 0; public ETTask ChangeSceneAsync(string sceneName)
{
this.tcs = new ETTaskCompletionSource();
// 加载map
this.loadMapOperation = SceneManager.LoadSceneAsync(sceneName);
return this.tcs.Task;
} public int Process
{
get
{
if (this.loadMapOperation == null)
{
return 0;
}
return (int)(this.loadMapOperation.progress * 100);
}
} public void Finish()
{
this.tcs.SetResult();
} public override void Dispose()
{
if (this.IsDisposed)
{
return;
} if (this.Entity.IsDisposed)
{
this.Entity.RemoveComponent<SceneChangeComponent>();
} base.Dispose();
}
}
  • ETTaskCompletionSource和ETTask的关系就好比Unity中Animator和AnimationClip的关系——前者是任务管理者,后者是被管理者
  • 首先,外部调用ChangeSceneAsync()方法时,该方法会创建一个ETTask对象tcs和一个异步加载场景的AsyncOperation对象loadMapOperation
  • 但是,细心的同学会发现,这两者( tcs和loadMapOperation对象)并无关联!
  • 唯一一点联系,大概就是代码最上端的组件更新系统SceneChangeComponentUpdateSystem中Update函数一直不停检测loadMapOperation.isDone标志,并据此调用tcs.SetResult()方法
  • 但即使如此,也未发现SceneChangeComponent类中Process属性和Finish被调用的痕迹(没有直接调用,也不是被override的virtual方法),经打印测试,这两个成员都没有被调用,也许是留作手动获取场景加载进度(Process)和手动结束场景加载(Finish())的吧!

计划:

  • 下一步就要进入到游戏场景的玩法实现了,做了这么多铺垫,就要进入真正和游戏玩法相关的部分了!

Unity进阶之ET网络游戏开发框架 08-深入登录成功消息的更多相关文章

  1. Unity进阶之ET网络游戏开发框架 06-游客登录

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  2. Unity进阶之ET网络游戏开发框架 01-下载、运行

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  3. Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  4. Unity进阶之ET网络游戏开发框架 04-资源打包

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  5. Unity进阶之ET网络游戏开发框架 05-搭建自己的第一个Scene

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  6. Unity进阶之ET网络游戏开发框架 03-Hotfix层启动

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  7. Unity进阶之ET网络游戏开发框架 07-修正游客登录的异步BUG

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  8. Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?

    我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...

  9. Easyui入门视频教程 第08集---登录实现 ajax button的使用

    目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义   Easyui入门视频教程 第08集---登录实现 ajax button的使用  ...

随机推荐

  1. [记录]Linux下大批量添加用户的方法

    Linux系统提供了创建大量用户的工具,可以让您立即创建大量用户,方法如下: (1)先编辑一个文本用户文件. 每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名.UID.宿主目 ...

  2. iPhone调试移动端webview

    一.模拟器调试 1.启动Xcode 2.选择菜单Xcode - Open Developer Tool - Simulator 3.启动Simulator后,选择Simulator菜单Hardware ...

  3. 个人永久性免费-Excel催化剂功能第26波-正确的Excel密码管理之道

    Excel等文档肩负着我们日常大量的信息存储和传递工作,难免出现数据安全的问题,OFFICE自带的密码设置,在什么样的场景下才有必要使用?网上所宣称的OFFICE文档密码保护不安全,随时可被破解,究竟 ...

  4. python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法

    今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下: from selenium import webdriver driver = webdr ...

  5. [leetcode] 80. Remove Duplicates from Sorted Array II (Medium)

    排序数组去重题,保留重复两个次数以内的元素,不申请新的空间. 解法一: 因为已经排好序,所以出现重复的话只能是连续着,所以利用个变量存储出现次数,借此判断. Runtime: 20 ms, faste ...

  6. 2019暑假集训 BLO

    题目描述 Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. 输入 输入n<=100000 ...

  7. Spring:IOC本质分析探究

    IOC本质分析 分析实现 我们先用我们原来的方式写一段代码 . 先写一个UserDao接口 public interface UserDao { public void getUser(); } 再去 ...

  8. linux初学者-磁盘加密篇

    linux初学者-磁盘加密篇 因为保密需要,一般系统中会在文件和磁盘中进行加密,但是文件的加密比较容易破解,不安全.所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏, ...

  9. linux初学者-正则表达式

      在windows中,是没有办法批量处理文件的,但是在linux系统中,可以通过命令直接处理一系列文件,这些文件的处理就需要用到正则表达式.这同样可以应用与目录. 1.处理多个文件 正则表达式中批量 ...

  10. Docker volume speed up npm install

    上一节决定在Jenkins中采用Docker作为构建环境,于是就可以为所欲为的使用各种node版本编译我们的项目.解决了版本切换问题.然而,Docker设计的目的就是纯净的执行环境,因此每次运行doc ...