KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
楼主: FirstOne

对warring示例中 U3d技术探讨汇总

[复制链接]

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-20 09:26:19 | 显示全部楼层
  1. //-------------------------------------------------------------------------------------
  2. PyObject* BlobType::parseDefaultStr(std::string defaultVal)
  3. {
  4.         return  PyBytes_FromStringAndSize(defaultVal.data(), defaultVal.size());
  5. }

  6. //-------------------------------------------------------------------------------------
  7. void BlobType::addToStream(MemoryStream* mstream, PyObject* pyValue)
  8. {
  9.         Py_ssize_t datasize = PyBytes_GET_SIZE(pyValue);
  10.         char* datas = PyBytes_AsString(pyValue);
  11.         mstream->appendBlob(datas, datasize);
  12. }

  13. //-------------------------------------------------------------------------------------
  14. PyObject* BlobType::createFromStream(MemoryStream* mstream)
  15. {
  16.         std::string datas;
  17.         mstream->readBlob(datas);
  18.         return PyBytes_FromStringAndSize(datas.data(), datas.size());
  19. }
复制代码


由代码可以看出, blob主要针对python的bytes类型。

  1. python:

  2. >>> b'1111'
  3. b'1111'
  4. >>> type(_)
  5. <class 'bytes'>
复制代码

>>> "范德".encode("utf-8")
b'\xe8\x8c\x83\xe5\xbe\xb7'
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-20 09:27:18 | 显示全部楼层
在脚本中任意类型, 只要你能转成bytes就行。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-20 12:48:24 | 显示全部楼层
kbe 发表于 2015-3-20 09:27
在脚本中任意类型, 只要你能转成bytes就行。

BLOB是在服务端Python脚本之间传递的吗, 在u3d C#端能解析这个2进制为原来类型数据吗
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-20 14:39:31 | 显示全部楼层
应该在任意语言之间都能传递,至于解析就要看你序列化的格式了。
就像脚本中定义的属性也能二进制传输到u3d客户端中同样能解析, 这需要一定规则。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-21 23:43:08 | 显示全部楼层
关于Monitor的使用 ,
在demo中 selavatar_ui.cs中有:
   Monitor.Enter(KBEngineApp.app.entities);
                        Account account = (Account)KBEngineApp.app.player();
                        Monitor.Enter(account.avatars);
                        Dictionary<UInt64, Dictionary<string, object>> avatars = account.avatars;
                        Monitor.Exit(account.avatars);
                        Monitor.Exit(KBEngineApp.app.entities);
也就是在Unity UI线程中用到KBEngine插件中的实体类都需要用Montior来同步, 因为KBEngine插件有可能设置为在另外一个线程中运行。
那么KBEEventProc.cs中用到实体类的代码块也需要用Montior吧(目前好像不是),因为KBEEventProc中的代码是运行在UI线程中的。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-22 00:04:21 | 显示全部楼层
warring写得较早也写的很快(当时只是为了演示一下),当时kbe的u3d插件都没有,里面有一些历史残留导致的问题。
warring是有线程问题的,由于时间的原因一直都没有再去调整,主要是还能够正常演示:lol。
KBEngineApp.app.entities在插件层没有通过Monitor来保护,表现层单方使用Monitor应该也是无效的

按照框架的想法, 如果需要直接访问插件中的数据对象,那么应该使用单线程模式,否则应该建立一份拷贝附带在事件参数中(拷贝代价很大的情况下也可以考虑如上办法,通常不会)。
可以参考kbengine_unity3d_demo的做法。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-22 14:32:55 | 显示全部楼层
kbe 发表于 2015-3-22 00:04
warring写得较早也写的很快(当时只是为了演示一下),当时kbe的u3d插件都没有,里面有一些历史残留导致的 ...

如果需要调用插件层的功能 一般就使用Event消息机制吗, “建立一份拷贝附带在事件参数中” 是指KBEngine.Event.registerOut 和KBEngine.Event.registeIn的参数拷贝一个对象吗, 在kbengine_unity3d_demo中Event.fireOut("set_MP", new object[]{this, v}); 传的是this指针,不是对象拷贝吧,这样是不是还是有线程问题呢。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-22 15:09:23 | 显示全部楼层
对,也是有问题的, 这里是复制warring的。
可以使用实体id来标示, 改天我把kbengine_unity3d_demo修改一下
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-23 20:44:54 | 显示全部楼层
本帖最后由 FirstOne 于 2015-3-23 20:47 编辑

关于实体生命周期内各回调函数的执行次序问题:
  当用户选择英雄进入游戏时,account实体会调用base端的selectAvatarGame,而这个函数会执行KBEngine.createBaseFromDBID从数据库创建一个avator的base实体,那么此时avator会执行哪些函数呢?
account然后又会调用giveClientTo(avatar)将控制权交给avator, 那么此时avator又会执行哪些函数呢, 或者说avator接管后从哪个函数开始执行呢.


当用户点击进入游戏按钮时,调用的是base端的selectAvatarGame,而服务端返回的是addSpaceGeometryMapping(string respath)  在这个过程中服务端经过了哪些处理呢.
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-24 09:28:17 | 显示全部楼层
FirstOne 发表于 2015-3-23 20:44
关于实体生命周期内各回调函数的执行次序问题:
  当用户选择英雄进入游戏时,account实体会调用base端的se ...

Q:当用户选择英雄进入游戏时,account实体会调用base端的selectAvatarGame,而这个函数会执行KBEngine.createBaseFromDBID从数据库创建一个avator的base实体,那么此时avator会执行哪些函数呢?
A:此时Avatar实例被创建, 首先__init__会被调用,然后就没有然后了

Q:account然后又会调用giveClientTo(avatar)将控制权交给avator, 那么此时avator又会执行哪些函数呢, 或者说avator接管后从哪个函数开始执行呢.
A:avatar的onEntitiesEnabled会触发,然后就由这里逻辑造成后续逻辑的产生, 例如cell被创建。

Q:当用户点击进入游戏按钮时,调用的是base端的selectAvatarGame,而服务端返回的是addSpaceGeometryMapping(string respath)  在这个过程中服务端经过了哪些处理呢.
A: 服务端会判断这个地图路径所指向的资源列表中是否有navmesh或者2D tile, 有的话就会加载,提供navigate使用。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-24 11:33:41 | 显示全部楼层
kbe 发表于 2015-3-24 09:28
Q:当用户选择英雄进入游戏时,account实体会调用base端的selectAvatarGame,而这个函数会执行KBEngine.c ...

第二个问题 onEntitiesEnabled看注释说此时client 实体已创建, 那么这个avator client实体是在什么时候创建的呢,这个avator client实体应该是存在所有可见玩家客户端上的吧。
def onEntitiesEnabled(self):
                """
                KBEngine method.
                该entity被正式激活为可使用, 此时entity已经建立了client对应实体, 可以在此创建它的
                cell部分。
                """
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-24 11:46:40 | 显示全部楼层
我在entities.xml中定义实体:<DroppedItem hasCell="true", hasBase="false", hasClient="true"/>
但启动服务器后报错:D:/GitHub/zcg/kbengine/kbengine_demos/scripts/entities.xml, is error!
ERROR root
这个实体没有base端,只有cell和client端
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-24 13:15:59 | 显示全部楼层
FirstOne 发表于 2015-3-24 11:46
我在entities.xml中定义实体:
但启动服务器后报错:D:/GitHub/zcg/kbengine/kbengine_demos/scripts/entit ...

试试这样
<Avatar hasCell="true", hasBase="true", hasClient="true"></Avatar>
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-24 13:17:29 | 显示全部楼层
FirstOne 发表于 2015-3-24 11:33
第二个问题 onEntitiesEnabled看注释说此时client 实体已创建, 那么这个avator client实体是在什么时候 ...

avatar的客户端部分创建是在你giveClientTo之后创建的。
此时avatar还没有创建cell部分, 其他玩家是无法看见的。 要看见一个实体必须基于空间位置根据AOI来得到。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-24 13:58:58 | 显示全部楼层

<DroppedItem hasCell="true", hasBase="false", hasClient="true"></DroppedItem> 这样还是有问题
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-24 14:07:38 | 显示全部楼层

全部格式为
  1. <root>
  2.         <Account/>
  3.         <Avatar hasCell="true", hasBase="true", hasClient="true"></Avatar>
  4.         <Spaces/>
  5.         <Space/>
  6.         <SpaceDuplicate/>
  7.         <SpawnPoint/>
  8.         <Monster/>
  9.         <NPC/>
  10.         <Gate/>
  11. </root>
复制代码
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-24 23:27:37 | 显示全部楼层
<DroppedItem hasClient="true"></DroppedItem>改成这样就好了, 而且u3d客户端的onEnterWorld也有调用了,之前这样写<DroppedItem> 是没有onEnterWorld调用的。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-25 09:10:41 | 显示全部楼层
FirstOne 发表于 2015-3-24 23:27
改成这样就好了, 而且u3d客户端的onEnterWorld也有调用了,之前这样写 是没有onEnterWorld调用的。 ...

在bw中判断一个实体是否可以有客户端除了def中检查是否有客户端属性和方法外,还会检查client中的py文件是否有该entity来确认其有客户端部分, 因为仅仅是def很难断定,def文件能包含interface, 而interface往往为了通用又可能有一些client相关的东西。

kbe为了在某些项目中能够去掉client,增加了entities.xml中hasClient标签来明确指定。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

133

帖子

491

积分

中级会员

Rank: 3Rank: 3

积分
491
 楼主| 发表于 2015-3-29 16:23:20 | 显示全部楼层
在客户端和服务端都有SCObject类的定义, SCObject主要是对position的封装和管理, 这个类的作用是防止实体销毁后其他实体找不到的问题吗。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2015-3-29 18:49:09 | 显示全部楼层
S = Skill,技能
C = Cast object,技能投放对象

要使用技能总会有一个目投放对象, 这个对象可能是一个坐标点(AOE技能比较常见),或者是一个目标实体(ENTITY),还有可能是其他东西(而已继续扩展封装)。
而技能要对一个目标对象投放有一个通用的流程,其中距离检查是一项检查点(对于不需要距离的而已技能配置中设置技能投放距离为0),这个SCObject就是这个封装出来的技能投放对象,这个对象实现了一些流程中需要访问的方法,例如位置与朝向。

demo中技能模块并没有写完,目前使用技能是非常简单的流程,真正完善还需要做很多, 一个技能应该分为施法者、施放对象(投放对象)、作用对象(技能施放对象不代表要对它作用)等等。

这里你可以按照自己的想法重写。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-15 07:57 , Processed in 0.038120 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表