一:环境搭建

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. self.addTimer(1, 0, SCDefine.TIMER_TYPE_HEARDBEAT)                                # 心跳timer, 每1秒一次
  6. # ----------------------------------------------------------------
  7. # callback
  8. # ----------------------------------------------------------------
  9. def onHeardTimer(self, tid, tno):
  10. """
  11. entity的心跳
  12. """
  13. self.addProximity(5.0, 0, 0)
  14. def onEnterTrap(self, entityEntering, range_xz, range_y, controllerID, userarg):
  15. """
  16. KBEngine method.
  17. 有entity进入trap
  18. """
  19. if entityEntering.isDestroyed or entityEntering.getScriptName() != "Avatar":
  20. return
  21. DEBUG_MSG("%s::onEnterTrap: %i entityEntering=(%s)%i, range_xz=%s, range_y=%s, controllerID=%i, userarg=%i" % \
  22. (self.getScriptName(),
  23. self.id, entityEntering.getScriptName(), entityEntering.id, \
  24. range_xz, range_y, controllerID, userarg))
  25. if self.uid == 40001003: # currspace - teleport
  26. spaceData = d_spaces.datas.get(entityEntering.spaceUType)
  27. entityEntering.teleport(None, spaceData["spawnPos"], tuple(self.direction))
  28. else:                                         # teleport to xxspace
  29. if entityEntering.spaceUType == 3:
  30. gotoSpaceUType = 4
  31. else:
  32. gotoSpaceUType = 3
  33. spaceData = d_spaces.datas.get(gotoSpaceUType)
  34. entityEntering.teleportSpace(gotoSpaceUType, spaceData["spawnPos"], tuple(self.direction), {})
  35. def onLeaveTrap(self, entityLeaving, range_xz, range_y, controllerID, userarg):
  36. """
  37. KBEngine method.
  38. 有entity离开trap
  39. """
  40. if entityLeaving.isDestroyed or entityLeaving.getScriptName() != "Avatar":
  41. return
  42. INFO_MSG("%s::onLeaveTrap: %i entityLeaving=(%s)%i." % (self.getScriptName(), self.id, \
  43. 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

KBEngine简单RPG-Demo源码解析(1)的更多相关文章

  1. 使用.Net Core + Vue + IdentityServer4 + Ocelot 实现一个简单的DEMO +源码

    运行环境 Vue 使用的是D2admin: https://doc.d2admin.fairyever.com/zh/ Github地址:https://github.com/Fengddd/Perm ...

  2. springmvc运行流程简单解释(源码解析,文末附自己画的流程图)

    首先看一下DispatcherServlet结构: 观察HandlerExecutionChain对象的创建与赋值,这个方法用来表示执行这个方法的整条链. 进入getHandler方法: 此时的变量h ...

  3. 动画 ---Animejs 简单使用与源码解析

    Anime是什么 Anime有什么用 Anime是作何做的 requireAnimationFrame() engine(){ // 处理让多个帧运动起来 ​ play() ​ step()} ani ...

  4. Android 开源项目源码解析(第二期)

    Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...

  5. Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别

    XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...

  6. Caffe2源码解析

    写在前面 上一篇文章对Caffe2中的core模块进行了简单拆解Caffe2源码解析之core,本篇给出其它模块的拆解,目的是大致了解每个模块的内容和目标,进一步理解Caffe2的整体框架.内容不多, ...

  7. 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析

    简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...

  8. 使用CEF(三)— 从CEF官方Demo源码入手解析CEF架构与CefApp、CefClient对象

    在上文<使用CEF(2)- 基于VS2019编写一个简单CEF样例>中,我们介绍了如何编写一个CEF的样例,在文章中提供了一些代码清单,在这些代码清单中提到了一些CEF的定义的类,例如Ce ...

  9. 实现简单的手写涂鸦板(demo源码)

    在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...

随机推荐

  1. New Adventure----GUI Design Studio

    新建项目工程    File->New Project 新建设计文件    Project->New Design 单个设计文件的页面,F9运当前设计页面   页面控件中有绿色包围的控件为 ...

  2. Editplus配置java运行环境以及其他需求的简单设置

    java配置 首先,打开"工具"(tools)选项,选择"配置自定义工具组"(英文版 是倒数第二个)然后按照上面第二幅图片来配置javac环境,其中命令一栏是j ...

  3. Struts2 控制文件上传下载

    之前介绍servlet3.0新特性的时候有提到过servlet API提供了一个part类来实现对文件的上传和保存,Struts其实是在其基础上做了进一步的封装,更加简单易用.至于文件下载,Strut ...

  4. 在eclipse-jee-juno中配置Aptana对jQuery代码自动提示

    主要问题 在Aptana的Web Project中打开js文件有JavaScript的自动提示,但是在JavaEE项目中却没有. 版本 eclipse-jee-juno,即Eclipse 4.2的Ja ...

  5. 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  6. JVM-7.Java内存模型与高效并发

    更多内容参见<并发与同步>系列 一.引子 二.JMM 三.Java中的线程 四.线程安全 五.锁优化       一.引子 运算能力 摩尔定律:晶体管数量,代表的CPU的频率 Amdahl ...

  7. iOS 手势

    一.看这里 二.抽象类  UIGestureRecognizer 继承于该类的有7类:轻点,捏合,拖拽,滑动,长按,旋转,边缘滑动; 一个手势可以绑定多个事件  - (void)addTarget:( ...

  8. python+requests+unittest API接口测试

    黑熊再网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,见用例维护在文本或表格中,而没有说明怎么样去生成想要的用例, 问题: 测试接口时,比如参数a,b,c,我要先测a参数,有(不传,为空, ...

  9. 音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)

    前言: 前面我用了很多章实现了javaCV的基本操作,包括:音视频捕捉(摄像头视频捕捉和话筒音频捕捉),推流(本地音视频或者摄像头话筒混合推流到服务器),转流(rtsp->rtmp),收流(录制 ...

  10. js脚本都可以放在哪些地方

    js脚本应该放在页面的什么地方 1.head部分 包含函数的脚本位于文档的 head 部分.这样我们就可以确保在调用函数前,脚本已经载入了. 2.body部分 执行位于 body 部分的脚本. 3.外 ...