版权申明:

  • 本文原创首发于以下网站:
  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. opatch卸载weblogic12.1.3.0补丁

    1.首先进入opatch目录 2.查看opatch命令(心急于卸载的朋友直接跳过这步) [weblogic@localhost OPatch]$ ./opatch -help Oracle 中间补丁程 ...

  2. (CVE-2017-10271)weblogic12.1.3.0漏洞测试与打补丁过程

    1.漏洞测试 搭建完成weblogic12.1.3.0后,开始用工具测试 点击connect,右下角显示connected,说明已连接→说明漏洞存在 CMD输入:ls   ,然后点击Execute执行 ...

  3. weblogic安装时检查监视器: 必须配置为至少显示 256 种颜色,实际空间未知→失败

    1.首先如果你出现的结果是[未通过],则设置DISPLAY环境变量. 按网上方法:export DISPLAY=:0.0 然后继续安装你的东西……若成功则恭喜你~ 若[失败],按网上方法让你去看日志 ...

  4. .net持续集成cake篇之使用vs或者vscode来辅助开发cake脚本

    使用Visual Studio来开发工具 前面我们都是通过手写或者复制的方法来编写Cake文件,Cake使用的是C#语言,如果仅使用简单的文本编辑器来编写显然效率是非常低下的,本节我们讲解如何使用ca ...

  5. Excel催化剂开源第40波-Excel插入图片做到极致的效果

    不知道是开发人员的自我要求不高还是用户的使用宽容度足够大,在众多Excel插入图片的版本中,都没有考虑到许多的可大幅度提升用户体验的细节处理. Excel催化剂虽然开发水平有限,但也在有限的能力下,尽 ...

  6. 个人永久性免费-Excel催化剂功能第92波-地理地址与经纬度互转功能

    GPS设备和手机LBS的兴起,在地理信息存储过程中,在程序.应用级别是需要用经纬度去定位,而在数据分析的级别,特别是省市区镇街的分析,用到的是人可识别的文本类型存储,从设备中采集下来的数据和人工维护的 ...

  7. C#3.0新增功能09 LINQ 基础02 LINQ 查询简介

    连载目录    [已更新最新开发文章,点击查看详细] 查询 是一种从数据源检索数据的表达式. 查询通常用专门的查询语言来表示. 随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据 ...

  8. Java学习笔记之---Servlet

    Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...

  9. kubernetes的volume的权限设置(属主和属组)

    apiVersion: v1kind: Podmetadata: name: hello-worldspec:  containers:  # specification of the pod's c ...

  10. 应用性能测试神器 Gatling,你用过吗?

    在应用程序上线之前,有多少人做过性能测试? 估计大部分开发者更多地关注功能测试,并且会提供一些单元测试和集成测试的用例.然而,有时候性能漏洞导致的影响比未发现的业务漏洞更严重,因为性能漏洞影响的是整个 ...