Unity进阶之ET网络游戏开发框架 08-深入登录成功消息
版权申明:
- 本文原创首发于以下网站:
- 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
- 优梦创客的官方博客:https://91make.top
- 优梦创客的游戏讲堂:https://91make.ke.qq.com
- 『优梦创客』的微信公众号: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-深入登录成功消息的更多相关文章
- Unity进阶之ET网络游戏开发框架 06-游客登录
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 01-下载、运行
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 04-资源打包
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 05-搭建自己的第一个Scene
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 03-Hotfix层启动
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 07-修正游客登录的异步BUG
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?
我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...
- Easyui入门视频教程 第08集---登录实现 ajax button的使用
目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义 Easyui入门视频教程 第08集---登录实现 ajax button的使用 ...
随机推荐
- 学习4:总结# 1.列表 # 2.元祖 # 3.range
列表 -- list 有序,可变的,索引, 作用:存储数据的,支持很多种数据类型 定义方式: lst = [1,"alex","黑哥"] 增: append 追 ...
- Java编程思想:内部类其他知识点
public class Test { public static void main(String[] args) { // InheritInner.test(); // EggTest.test ...
- Unable to start services through AMBARI UI
ambari开启nodemanager卡住,后台日志: Mar ::, WARN [ambari-action-scheduler] ActionScheduler: - Exception rece ...
- 【动态规划法(DP)】-C++
360百科定义: 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bell ...
- 开源框架Autofac使用入门
目录导航 1.Autofac是什么 1.1什么是DI和IOC 1.2DI和IOC在项目中起到什么作用 2.Autofac如何使用 2.1下载 2.2代码Demo 2.3Demo分析 3总结 1.Aut ...
- java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能
这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...
- Java EE.JavaBean
JavaBean是一组可移植.可重用.并可以组装到应用程序中的Java类.一个Model类(属性+构造函数).
- 恢复在iterm2中当滚动光标时候触发滚动历史记录的问题
在Iterm2中,如果你上下滚动光标(上下滑动触摸板.或者滚动鼠标滚轮),通常情况下是触发了屏幕内容上下滚动. 但是在某些异常情况下,却触发了命令行历史记录的上下滚动,效果和你连续按了多次键盘的上下键 ...
- LeetCode 解题目录
0001. 两数之和(Java) 0003. 无重复字符的最长子串(Java) 0172. 阶乘后的零 (Java) 0287. 寻找重复数(Java)
- VS Code 安装 LeetCode 插件
练习算法绕不开的一个网站就是力扣,很多小伙伴为了拿到大厂 offer,刷题都刷到吐了. 然而如果直接在 LeetCode 上写代码,那是很痛苦的一件事,那就相当于用 txt 写代码一样,没有 IDE ...