在使用KB引擎开发中,因工作问题放了一段时间,彻底不记得entity_defs 文件中需要怎么加,他们又是怎么交互的,今天开个文档记录一下。
一般分为Properties(属性)部分、BaseMethods(基础)、CellMethods(空间)、ClientMethods(客户端)这4个部分(如下),Properties这个不是今天的重点,后面有机会单独写一个属性部分文章。
<Properties>
</Properties>
<BaseMethods>
</BaseMethods>
<ClientMethods>
</ClientMethods>
<CellMethods>
</CellMethods>
首先我们讲一下BaseMethods里需要加哪些方法。这个明白了其他的就明白了。
我们知道EntityCall是脚本层与实体远程交互的常规手段。(其他参考:allClients、otherClients、clientEntity)。
EntityCall对象在C++底层实现非常简单,它只包含了实体的ID、目的地的地址、实体类型、EntityCall类型。当用户请求一次远程交互时,底层首先能够通过实体类型找到实体定义的描述,
通过实体定义的描述对用户输入的数据进行检查,如果检查合法那么底层将数据打包并发往目的地,目的地进程根据协议进行解包最终调用到脚本层。
注意: EntityCall只能调用其对应def文件中声明过的方法,不能访问实体的属性以及其他任何信息。
一个实体最多可以包含三个部分:
client: 当实体包括客户端部分时(通常为玩家),在服务端可以访问实体的client(EntityCall)属性。
base:当实体的一部分创建在Baseapp时,在非当前Baseapp中可以访问实体的base(EntityCall)属性。
cell:当实体的一部分创建在Cellapp时,在非当前Cellapp中可以访问实体的cell(EntityCall)属性。
举例说明,假设玩家登录调用了
KBEngine.globalData[“Halls”].enterHalls(self)
表示玩家首先登录了大厅,代码如下:
#进入了大厅
def enterHalls(self, entityCall):
"""
defined method.
请求进入某个Room中
"""
self.entities[entityCall.id] = entityCall
entityCall.SendHallData(self.typeEntitiesNum)
如果我们没有在Halls.def中定义
<BaseMethods>
<enterHalls>
<Arg> ENTITYCALL </Arg>
</enterHalls>
</BaseMethods>
那么这个函数会报错(当然你开一个base进程是不会的),我们只要记得KBEngine.globalData[“Halls”] 存在于唯一的base进程,其他进程的都是entityCall。所以其他的base进程也要调用,这种就需要你在BaseMethods里声明,相当于跨进程了。
那么我们继续思考下,我们上面的代码中有一行代码
entityCall.SendHallData(self.typeEntitiesNum)
这个假设是负责玩家登录后把大厅登录的总人数回传给Acount,那么这个SendHallData需不需要再def中定义?答案是肯定的,玩家的对象可能也是一个entityCall ,是他调用了SendHallData
所以我们需要在Account.def中定义
<SendHallData>
<Arg> ROOM_DATA_NUMBER </Arg>
</SendHallData>
所以只要记住只要是entityCall调用就必须声明。
CellMethods和ClientMethods也是同理的。你如果有多个baseApp,那么你的Acount必然存在多个进程中,那么除了真实的Entity,其他也都是entityCall,所以如果把上面的人数要同步到玩家客户端,那么也需要在def中声明,只不过这个要放到ClientMethods里才行,为了和上面的SendHallData区分我加了一个Int32参数,看起来不混淆。
#进入大厅后刷新到客户端的
def SendHallData(self, hallData):
INFO_MSG("account[%i],大厅数据发给客户端!!![%i]. entityCall:%s" % (self.id,len(hallData), self.client))
self.client.SendHallData(len(hallData), hallData)
<ClientMethods>
<SendHallData>
<Arg> INT32 </Arg>
<Arg> ROOM_DATA_NUMBER </Arg>
</SendHallData>
</<ClientMethods>>
至于CellMethods当然是在CellApp进程上的,我们依此类推。