内容纲要

一. 登录流程

注册

Unity3d:CreateAccount
Loginapp:reqCreateAccount 
-> dbmgr:reqCreateAccount 
-> Loginapp:onReqCreateAccountResult 
-> Client:onReqCreateAccountResult

登录 Step1

Unity3d:login
Loginapp:login 
-> dbmgr:onAccountLogin     //检查登录 将登录结果返回给Loginapp
-> Loginapp:onLoginAccountQueryResultFromDbmgr //转发给BaseappMgr分配Baseapp
-> BaseappMgr:registerPendingAccountToBaseapp //将客户端分配到当前负载最低的Baseapp上 并返回该Baseapp的Ip Port
-> onLoginAccountQueryBaseappAddrFromBaseappmgr //将Baseapp的Ip Port转发给客户端
-> Client:onLoginSuccessfully

登录 Step2

Unity3d:loginGateway      //尝试在指定Baseapp上登录
Baseapp:loginGateway    //检查登录 处理重复登录 向数据库查询账号详细信息
dbmgr:queryAccount        //查询账号详细信息 返回给Baseapp
Baseapp:onQueryAccountCBFromDbmgr    //创建账号的Proxy并传入客户端的mailbox(用于和客户端交互),Demo中的Account.py即继承于KBEngine.Proxy。

获角 选角 创角

Unity3d 的reqAvatarList selectAvatarGame reqCreateAvatar 都将直接转到 Account.py 中对应的相应函数上,KBEngine.Proxy 已经封装了和客户端通讯的方法 (通过 Mailbox)。

二. 地图创建

  1. Baseapp 启动,会回调到 Python 脚本层的 onBaseAppReady(base/kbengine.py)
  2. 第一个 Baseapp 启动时,在本 Baseapp 上创建世界管理器 spaces Entity(Baseapp:createBaseLocally) 定义于 spaces.py
  3. spaces 读取配置文件 data/d_spaces.py,为每一个 Space Entity 创建一个 SpaceAlloc,通过定时器分批次调用 SpaceAlloc.init 创建 Space Entity(一秒回调创建一个)
  4. SpaceAlloc.init 通过 KBEngine.CreateSpaceAnyWhere() 完成
  5. Baseapp:CreateSpaceAnyWhere() 会转发给 BaseappMgr,最终落在当前负载最轻的 Baseapp 上,通过 CreateEntity 完成 Space Entity 创建
  6. 创建完成后,回调到发起方 Baseapp:CreateSpaceAnywhereCallback() 最终回调到 Python 层 SpaceAlloc.py:onSpaceCreatedCB()
    注意,上面提到的 Space Entity 并不是真正的 Space,而是 Baseapp 用于操作 Space 的一个句柄,真正的 Sapce 需要挂在 Cellapp 上,在 srcipts/base/Space.py 中完成真正的 Space 创建:
  7. Space.py:_init_() 中,通过 Baseapp:CreateInNewSpace() 创建真正的 Space,之后读取该 Space 上需创建的所有 Entity(配置在 scripts/data/d_spaces_spawns 中),等待其上面的 Entity 被创建
  8. Baseapp:CreateInNewSpace() 将请求转发给 CellappMgr,后者会将请求分发到当前负载最轻的 Cellapp 上,Cellapp:onCreateInNewSpaceFromBaseapp() 完成 Space 创建,回调 Baseapp:OnEntityGetCell()
  9. 注意,此时 cell/Space.py:_init_() 被调用,开始加载真正的几何数据和寻路相关,回调到 Baseapp:OnEntityGetCell()
  10. Baseapp:OnEntityGetCell() 判断该 Entity 是否是客户端,如果是则需要通知客户端 (Baseapp::onClientEntityEnterWorld),之后回调脚本 Space.py:OnGetCell()

至此,地图创建完成。

三. 生成 NPC/Monster

对于 NPC/Monster,是先创建其出生点,再由出生点创建真正的 NPC/Monster

  1. 接上面 Space 的 Cell 和 Base 部分均创建完成后,base/Space.py:OnGetCell() 中,注册一个定时器,开始创建该 Space 上面的所有 NPC/Monster 的 SpawnPoint,每 0.1 秒创建一个
  2. base/SpawnPoint.py 中,创建其 Cell 部分
  3. cell/SpawnPoint.py 中,通过 createEntity 创建其对应的真正的 NPC/Monster

四. Entity (实体)

Entity 是服务器与客户端交互的一切实体的总称,包括:账号,角色,NCP,Monster,公会,等等。Entity 通过 .def 来定义自己的属性和方法,指定属性和方法的作用域,即 (Base, Cell, Client) 的访问权限。因此 C/S 之间的消息协议实际上只是针对于 Entity 的远程调用。所以 KBEngine 本身没有消息协议一说,所有业务逻辑都围绕着 Entity 展开,通过.def 来维护。

参见:

http://kbengine.org/cn/docs/programming/entitydef.html
http://kbengine.org/cn/docs/configuration/entities.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注