版权申明:

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

概要:

  • ET4示例程序中的登录流程大致为:实例化UILogin进行登录->实例化UILobby进行匹配→加载Map场景进行游戏
  • 由于其流程对于新手有点复杂,这里介绍一种简单的学习方式:
    • 直接创建一个StartUI
    • 点击“游客登录”按钮执行登录功能

创建一个StartUI:

  • 将启动UI做成一个预制体,并命名为StartUI,UI界面如下:



  • 由于ET4采用ab包的方式加载资源,所以要:
    • 预制体设置Asset Label为:startui.unity3d
    • 用ET4的编辑器扩展:Tools→打包工具→选择PC平台进行打包
    • 打包后的资源放在???
    • 不需要启动服务端或文件服务器,ET4框架可以找到打包后的ab包
    • 编辑器状态下会查找预制体而不从ab包加载
  • 用代码加载该预制体:
namespace ETHotfix
{
public static class MyStartUIFactory
{
public static UI Create()
{
try
{
ResourcesComponent rc = ETModel.Game.Scene.GetComponent<ResourcesComponent>();
rc.LoadBundle(MyUIType.MyStartUI.StringToAB());
GameObject goPrefab = rc.GetAsset(MyUIType.MyStartUI.StringToAB(), MyUIType.MyStartUI.ToString()) as GameObject;
GameObject go = UnityEngine.Object.Instantiate(goPrefab); UI ui = ComponentFactory.Create<UI,string,GameObject>(MyUIType.MyStartUI.ToString(), go, false); ui.AddComponent<MyStartUIComponent>(); return ui;
}
catch (Exception e)
{
Log.Error(e);
return null;
}
}
}
}

点击“游客登录”按钮执行登录功能

namespace ETHotfix
{
[ObjectSystem]
public class MyStartUIAwakeSystem : AwakeSystem<MyStartUIComponent>
{
public override void Awake(MyStartUIComponent self)
{
self.OnAwake();
}
} public class MyStartUIComponent : Component
{
GameObject goStartButton; public void OnAwake()
{
var rc = this.Parent.GameObject.GetComponent<ReferenceCollector>();
goStartButton = rc.Get<GameObject>("StartButton");
goStartButton.GetComponent<Button>().onClick.AddListener(OnStartClick);
} private void OnStartClick()
{
// Coroutine()方法模拟将OnStartClickAsync()作为协程执行的效果(确保在单线程中执行)
OnStartClickAsync().Coroutine();
} private async ETVoid OnStartClickAsync()
{
// 处理游客登录点击
try
{
// 1: 创建一个realmSession,并利用此session去call一个rpc消息(模型层session表示具体网络参数和连接,热更层负责通信逻辑,它调用模型层)
ETModel.Session realmModelsession = ETModel.Game.Scene.GetComponent<NetOuterComponent>().Create(GlobalConfigComponent.Instance.GlobalProto.Address);
Session realmHotfixSession = ComponentFactory.Create<Session, ETModel.Session>(realmModelsession); // 2:若登录失败,会收到异常;若成功,则会得到认证信息(模型层没有C2R_Login的类定义,所以必须配套由热更层的session去call)
var r2cLogin = await realmHotfixSession.Call(new C2R_Login()
{
Account = Guid.NewGuid().ToString(),
Password = "111111",
}) as R2C_Login; // 3:再利用此认证信息中的网关服务器地址,去创建gateSession
ETModel.Session gateModelsession = ETModel.Game.Scene.GetComponent<NetOuterComponent>().Create(r2cLogin.Address);
Session gateHotfixSession = ComponentFactory.Create<Session, ETModel.Session>(gateModelsession); // 4:用gateSession去登录gate服(传入登录key)
var g2cLoginGate = await gateHotfixSession.Call(new C2G_LoginGate()
{
Key = r2cLogin.Key
}) as G2C_LoginGate; // 5:登录成功后,用返回的playerId,创建Player对象
var p = ETModel.ComponentFactory.CreateWithId<Player>(g2cLoginGate.PlayerId);
ETModel.Game.Scene.GetComponent<PlayerComponent>().MyPlayer = p; // 6:发送登录完成事件
Game.EventSystem.Run(MyEventType.MyLoginFinish); // 7: 保存热更和模型层Session,以便将来直接通过SessionComponent.Instance单件访问
Game.Scene.AddComponent<SessionComponent>().Session = gateHotfixSession;
ETModel.Game.Scene.AddComponent<ETModel.SessionComponent>().Session = gateModelsession;
}
catch (Exception e)
{
Log.Error(e);
}
}
}
}
  • EventSystem.Run引发本地事件,Session.Call|Send引发网络消息

处理登录成功消息:

namespace ETHotfix
{
[Event(MyEventType.MyLoginFinish)]
class MyLoginFinish : AEvent
{
public override void Run()
{
// 移除登录UI
UI uiLogin = Game.Scene.GetComponent<UIComponent>().Get(MyUIType.MyStartUI.ToString());
uiLogin.GameObject.SetActive(false); // 加载游戏场景(也可以从ab包加载)
SceneManager.LoadScene(1);
}
}
}

Unity进阶之ET网络游戏开发框架 06-游客登录的更多相关文章

  1. Unity进阶之ET网络游戏开发框架 08-深入登录成功消息

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Unity进阶技巧 - 动态创建UGUI

    前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...

  9. Unity进阶----Lua语言知识点(2018/11/08)

    国内开发: 敏捷开发: 集中精力加班堆出来第一个版本 基本没啥大的bug 国外开发: 1).需求分析: 2).讨论 3).分模块 4).框架 5).画UML图(类图class function)(e- ...

随机推荐

  1. shell的用处到底大不大

    我曾在智联招聘等网站上搜寻有关shell脚本员的职位,与C++.JAVA等热门语言相比,冷清很多.看上去似乎招shell程序员的公司比较少.是不是公司不重视或者是很少用到shell这个东东呢?     ...

  2. MMM 数位dp学习记

    数位dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...

  3. Spring中@value以及属性注入的学习

    1.简单的Java配置 配置文件(jdbc.properties) jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://1 ...

  4. HttpClient多文件上传代码及普通参数中文乱码问题解决

    该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...

  5. 你可能不知道的github的秘密

    github也可以使用快捷键 先举例子,如何快速查找项目中的文件? 只需要进入项目,并按下T键 在浏览代码时,如何快速跳到指定行? 只需要进入项目,并按下L键 下面是一些常用的快捷键 聚焦搜索栏 按下 ...

  6. 深入了解数据校验:Bean Validation 2.0(JSR380)

    每篇一句 > 吾皇一日不退役,尔等都是臣子 对Spring感兴趣可扫码加入wx群:`Java高工.架构师3群`(文末有二维码) 前言 前几篇文章在讲Spring的数据绑定的时候,多次提到过数据校 ...

  7. 利用gcc编译链接时出现 ‘undefined reference to `std::ios_base::Init::Init()’ 解决

    一般编译链接c++程序最好使用g++,若有如上的报错信息,需要在gcc后加上 -lstdc++ eg: gcc test.c -lstdc++ gcc和g++都是GNU的一个编译器. g++:后缀.c ...

  8. [leetcode]python 448. Find All Numbers Disappeared in an Array

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  9. Atom实用插件

    下载atom狠戳本链接 中文简体插件(工具栏,右键菜单,设置菜单) simplified-chinese-menu 代码格式化插件(支持多种语言) atom-beautify 智能补全资源路径插件 a ...

  10. CentOS7 升级 Python2.x 到 Python3.x

    CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对旧版本进行升级.由于很多基本的命令.软件包都依赖旧版本,比如:yum.所以,在更新 Python 时 ...