KBEngine简单RPG-Demo源码解析(1)

一:环境搭建

1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载    
      下载服务端源码(KBEngine):        
      https://github.com/kbengine/kbengine/releases/latest   

     编译(KBEngine):      
      http://www.kbengine.org/docs/build.html   

      安装(KBEngine):        
      http://www.kbengine.org/docs/installation.html

2. 下载unity3d demo源码(kbengine_unity3d_demo)
     https://github.com/kbengine/kbengine_unity3d_demo/releases/latest

3. 下载kbengine客户端插件与服务端Demo资产库:    
      * 使用git命令行,进入到kbengine_unity3d_demo目录执行:        
                 git submodule update --init --remote                        
                 

      * 或者使用 TortoiseGit(选择菜单): TortoiseGit -> Submodule Update:
                

      * 也可以手动下载kbengine客户端插件与服务端Demo资产库            
                客户端插件下载:                
                       https://github.com/kbengine/kben ... /archive/master.zip                
                       下载后请将其解压缩,插件源码请放置在: Assets/plugins/kbengine/kbengine_unity3d_plugins            

                服务端资产库下载:                
                       https://github.com/kbengine/kbengine_demos_assets/releases/latest                
                       下载后请将其解压缩,并将目录文件放置于服务端引擎根目录"kbengine/"之下,如下图:

4. 拷贝服务端资产库"kbengine_demos_assets"到服务端引擎根目录"kbengine/"之下,如下图:
                


二:配置Demo(可选):
改变登录IP地址与端口(注意:关于服务端端口部分参看http://www.kbengine.org/cn/docs/installation.html):

                 
                kbengine_unity3d_demo\Scripts\kbe_scripts\clientapp.cs -> ip    
                kbengine_unity3d_demo\Scripts\kbe_scripts\clientapp.cs -> port


三:启动服务器:
确保“kbengine_unity3d_demo\kbengine_demos_assets”已经拷贝到KBEngine根目录:    
      参考上方章节:开始使用启动脚本启动服务端:   

Windows:        
      kbengine\kbengine_demos_assets\start_server.bat    
Linux:        
      kbengine\kbengine_demos_assets\start_server.sh
      检查启动状态:        
               如果启动成功将会在日志中找到"Components::process(): Found all the components!"。     
               任何其他情况请在日志中搜索"ERROR"关键字,根据错误描述尝试解决。        
               (更多参考: http://www.kbengine.org/docs/startup_shutdown.html)


四:启动客户端:
直接在Unity3D编辑器启动或者编译后启动
(编译客户端:Unity Editor -> File -> Build Settings -> PC, MAC & Linux Standalone.)

五:生成导航网格(可选):
服务端使用Recastnavigation在3D世界寻路,recastnavigation生成的导航网格(Navmeshs)放置于:    
      kbengine\demo\res\spaces\*

在Unity3D中使用插件生成导航网格(Navmeshs):    
      https://github.com/kbengine/unity3d_nav_critterai


六:演示截图:

 

十六:场景传送
首先看看API接口的要求
  1. def teleport( self, nearbyMBRef, position, direction ): 
  2. 功能说明:
  3. 瞬间移动一个Entity到一个指定的空间。这个函数允许指定实体移动后的位置与朝向。
  4. 如果需要在不同空间跳转( 通常用于不同场景或者房间跳转 ),可以传一个CellMailbox给这个函数( 这个mailbox所对应的实体必须在目的空间中 )。 
  5. 这个函数只能在real的实体上被调用。 
  6. 参数: nearbyMBRef 一个决定Entity跳往哪个Space的CellMailbox( 这个mailbox所对应的实体必须在目的Space中 ),它被认为是传送目的地。这个可以设为None,在这种情形下它会在当前的cell完成瞬移。  
  7. position Entity瞬移后的坐标,是一个有3个float(x, y, z)组成的序列。  
  8. direction Entity瞬移后的朝向,是一个由3个float组成的序列(roll,pitch, yaw)。  
复制代码

demo中可以看见2个传送门实体, 对应服务端的脚本为Gate.py
  1. class Gate(KBEngine.Entity, GameObject):
  2.         def __init__(self):
  3.                 KBEngine.Entity.__init__(self)
  4.                 GameObject.__init__(self) 
  5.                 
  6.                 self.addTimer(1, 0, SCDefine.TIMER_TYPE_HEARDBEAT)                                # 心跳timer, 每1秒一次
  7.         # ----------------------------------------------------------------
  8.         # callback
  9.         # ----------------------------------------------------------------
  10.         def onHeardTimer(self, tid, tno):
  11.                 """
  12.                 entity的心跳
  13.                 """
  14.                 self.addProximity(5.0, 0, 0)
  15.                 
  16.         def onEnterTrap(self, entityEntering, range_xz, range_y, controllerID, userarg):
  17.                 """
  18.                 KBEngine method.
  19.                 有entity进入trap
  20.                 """
  21.                 if entityEntering.isDestroyed or entityEntering.getScriptName() != "Avatar":
  22.                         return
  23.                         
  24.                 DEBUG_MSG("%s::onEnterTrap: %i entityEntering=(%s)%i, range_xz=%s, range_y=%s, controllerID=%i, userarg=%i" % \
  25.                                                (self.getScriptName(), 
  26. self.id, entityEntering.getScriptName(), entityEntering.id, \
  27.                                                 range_xz, range_y, controllerID, userarg))
  28.                 
  29.                 if self.uid == 40001003: # currspace - teleport
  30.                         spaceData = d_spaces.datas.get(entityEntering.spaceUType)
  31.                         entityEntering.teleport(None, spaceData["spawnPos"], tuple(self.direction))                
  32.                 else:                                         # teleport to xxspace
  33.                         if entityEntering.spaceUType == 3:
  34.                                 gotoSpaceUType = 4
  35.                         else:
  36.                                 gotoSpaceUType = 3
  37.                         
  38.                         spaceData = d_spaces.datas.get(gotoSpaceUType)
  39.                         entityEntering.teleportSpace(gotoSpaceUType, spaceData["spawnPos"], tuple(self.direction), {})
  40.         def onLeaveTrap(self, entityLeaving, range_xz, range_y, controllerID, userarg):
  41.                 """
  42.                 KBEngine method.
  43.                 有entity离开trap
  44.                 """
  45.                 if entityLeaving.isDestroyed or entityLeaving.getScriptName() != "Avatar":
  46.                         return
  47.                         
  48.                 INFO_MSG("%s::onLeaveTrap: %i entityLeaving=(%s)%i." % (self.getScriptName(), self.id, \
  49.                                 entityLeaving.getScriptName(), entityLeaving.id))
复制代码

在onHeardTimer中添加了一个范围触发器,当某个实体进入当前实体一定范围内触发器触发回调onEnterTrap, 当在范围内的实体离开了范围则触发回调onLeaveTrap。
其中进入范围回调中调用了场景传送接口, “entityEntering.teleportSpace(gotoSpaceUType, spaceData["spawnPos"], tuple(self.direction), {})”, 这个接口首先会从KBEngine.globalData中获得
世界管理器的baseMailbox, 然后调用他的base方法teleportSpace, scripts/base/Spaces.py中teleportSpace方法找到对应的space, 然后将自己的cellMailbox回调给cell上的玩家实体(Avatar),
  1.         <b><b><b><b>scripts/base/Space.py</b></b></b></b>
  2. def teleportSpace(self, entityMailbox, position, direction, context):
  3.                 """
  4.                 defined method.
  5.                 请求进入某个space中
  6.                 """
  7.                 entityMailbox.cell.onTeleportSpaceCB(self.cell, self.spaceUTypeB, position, direction)
复制代码

玩家获得space的cell之后就可以调用API正式跳转到指定空间中
  1.         def onTeleportSpaceCB(self, spaceCellMailbox, spaceUType, position, direction):
  2.                 """
  3.                 defined.
  4.                 baseapp返回teleportSpace的回调
  5.                 """
  6.                 self.teleport(spaceCellMailbox, position, direction)
复制代码

demo中账号实体存储后对应数据库表(群友提供)http://bbs.kbengine.org/forum.ph ... 1586&extra=page%3D1
posted @ 2017-06-27 16:50  mailsrv  阅读(447)  评论(0编辑  收藏  举报