KBEngine |
Entity类
import KBEngine
成员函数
def accelerate( self, accelerateType, acceleration ): |
def addYawRotator( self, targetYaw, velocity, userArg ): |
def addProximity( self, range, userArg ): |
def addTimer( self, start, interval=0.0, userData=0 ): |
def cancelController( self, controllerID ): |
def clientEntity( self, destID ): |
def canNavigate( self ): |
def debugView( self ): |
def delTimer( self, id ): |
def destroy( self ): |
def destroySpace( self ): |
def entitiesInView( self ): |
def entitiesInRange( self, range, entityType=None, position=None ): |
def isReal( self ): |
def moveToEntity( self, destEntityID, velocity, distance, userData, faceMovement, moveVertically ): |
def moveToPoint( self, destination, velocity, distance, userData, faceMovement, moveVertically ): |
def getViewRadius( self ): |
def getViewHystArea( self ): |
def getRandomPoints( self, centerPos, maxRadius, maxPoints, layer ): |
def navigate( self, destination, velocity, distance, maxMoveDistance, maxSearchDistance, faceMovement, layer, userData ): |
def navigatePathPoints( self, destination, maxSearchDistance, layer ): |
def setViewRadius( self, radius, hyst=5 ): |
def teleport( self, nearbyMBRef, position, direction ): |
def writeToDB( self, shouldAutoLoad, dbInterfaceName ): |
回调函数
def onDestroy( self ): |
def onEnterTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ): |
def onEnteredView( self, entity ): |
def onGetWitness( self ): |
def onLeaveTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ): |
def onLoseControlledBy( self, id ): |
def onLoseWitness( self ): |
def onMove( self, controllerID, userData ): |
def onMoveOver( self, controllerID, userData ): |
def onMoveFailure( self, controllerID, userData ): |
def onRestore( self ): |
def onSpaceGone( self ): |
def onTurn( self, controllerID, userData ): |
def onTeleport( self ): |
def onTeleportFailure( self ): |
def onTeleportSuccess( self, nearbyEntity ): |
def onTimer( self, timerHandle, userData ): |
def onUpdateBegin( self ): |
def onUpdateEnd( self ): |
def onWitnessed( self, isWitnessed ): |
def onWriteToDB( self ): |
属性
allClients | 只读 PyClient |
base | 只读 BaseEntityMailBox |
client | 只读 ClientEntityMailbox |
controlledBy | BaseEntityMailBox |
className | 只读 string |
direction | Tuple of 3 floats as (roll, pitch, yaw) |
hasWitness | boolean |
id | 只读 Integer |
isDestroyed | 只读 bool |
isWitnessed | 只读 bool |
layer | int8 |
otherClients | 只读 PyClient |
position | Vector3 |
spaceID | 只读 uint32 |
topSpeed | float |
topSpeedY | float |
volatileInfo | float |
详细描述
类Entity的实例代表着在cell上的游戏对象。一个 Entity可以是"real"或者"ghosted"的,一个"ghost" Entity是一个存活在邻近的cell上 的"real" Entity的拷贝。对于每一个实体来说有一个唯一的"real" Entity实例,和有0个 或者更多的"ghost" Entity实例。一个Entity实例操控着实体的位置数据,包括他的空间和旋转。它还控制着这些数据发给 客户端的频率(如果可以)。位置的数据可以被唯一的客户端所更新,被控制器对象,被teleport成员函数修改。 控制器是非python对象,可以适用在cell实体上随着时间的过去来改变它们的位置数据,它们通过成员函数如"trackEntity"和"turnToYaw"来 添加到Entity,可以通过"cancelController"移除。
感兴趣的范围,或"View"对于所有属于客户端的KBEngine实体来说是一个重要的概念。 一个实体的View是围绕这个实体的客户端(如果它有)所能感知的区域。这用于选择发给客户端的数据量。View的实际 形状由x轴和z轴上的距离范围定义,还有一个类似形状向外延伸的滞后区域。一个Entity进入 另一个Entity的View,但不会离开它直到它离开滞后区域。一个Entity可以 通过"setViewRadius"修改它的View大小。 可以通过"entitiesInRange"找到一个具体距离之内的所有实体,通过"addProximity"设置一个陷阱捕获进入陷阱的所有实体。
cellApp上新的Entity可以使用KBEngine.createEntity 创建。一个实体还可以通过baseApp远程调用KBEngine.createCellEntity函数 来创建。
一个Entity可以通过MAILBOX访问在base和client应用程序上的等价的实体。这需要 一组远程调用的函数(在实体的.def文件里指定)。
成员函数文档
def accelerate( self, accelerateType, acceleration ):
加速实体当前运动。
可影响的运动包括:
Entity.moveToEntity |
Entity.moveToPoint |
Entity.navigate |
Entity.addYawRotator |
参数:
accelerateType | string,影响的运动类型,如:Movement、Turn。 |
velocity |
float,每秒的加速度,如果传入的是负值则表示减速度。 |
返回:
影响后的实体当前速度。 |
def addYawRotator( self, targetYaw, velocity, userArg ):
控制实体绕yaw旋转,旋转完成将会通过Entity.onTurn通知。
使用Entity.cancelController带上控制器ID或者使用Entity.cancelController("Movement")来删除它。
参看:
Entity.cancelController |
参数:
targetYaw | float,给定的目标yaw弧度。 |
velocity |
float,旋转时每秒的弧度。 |
userArg | 是一个可选的整型,所有控制器共有。如果这个值不为0则传给回调函数。建议 在回调原型里设置默认值为0。 |
def addProximity( self, rangeXZ, rangeY, userArg ):
创建一个范围触发器,当有其它实体进入或离开这个触发器区域的时候会通知这个Entity。这个区域是一个方形(为了效率)。如果
其它实体在x轴和z轴上均在给定的距离里面,则实体被视为在这个范围里面。这个Entity通过onEnterTrap和onLeaveTrap函数被
通知,这两个函数可以如下定义:
def onEnterTrap( self, entityEntering, rangeXZ, rangeY, controllerID, userArg = 0 ): def onLeaveTrap( self, entityLeaving, rangeXZ, rangeY, controllerID, userArg = 0 ):
由于这个范围触发器是一个控制器,使用Entity.cancelController带上控制器ID来删除它。
需要注意的是回调有可能会立刻被触发,即使在addProximity()调用返回之前。
参看:
Entity.cancelController |
参数:
rangeXZ | float,给定触发器xz轴区域的大小,必须大于等于0。 |
rangeY |
float,给定触发器y轴高度,必须大于等于0。 需要注意的是,这个参数要生效必须开放kbengine_defaults.xml->cellapp->coordinate_system->rangemgr_y 开放y轴管理会带来一些消耗,因为一些游戏大量的实体都在同一y轴高度或者在差不多水平线高度,此时碰撞变得非常密集。 3D太空类游戏或者小房间类实体较少的游戏比较适合开放此选项。 |
userArg | 是一个可选的整型,所有控制器共有。如果这个值不为0则传给回调函数。建议 在回调原型里设置默认值为0。 |
返回:
返回创建控制器的id。 |
def addTimer( self, start, interval=0.0, userData=0 ):
注册一个定时器,定时器由回调函数onTimer触发,回调函数将在"initialOffset"秒后被执行第1次,而后将每间隔"repeatOffset"秒执行1次,可设定一个用户参数"userArg"(仅限integer类型)。
onTimer 函数必须在entity的cell部分被定义,且带有2个参数,第1个integer类型的是timer的id(可用于移除timer的"delTimer"函数),第2个是用户参数"userArg"。
例子:
# 这里是使用addTimer的一个例子 import KBEngine class MyCellEntity( KBEngine.Entity ): def __init__( self ): KBEngine.Entity.__init__( self ) # 增加一个定时器,5秒后执行第1次,而后每1秒执行1次,用户参数是9 self.addTimer( 5, 1, 9 ) # 增加一个定时器,1秒后执行,用户参数缺省是0 self.addTimer( 1 ) # Entity的定时器回调"onTimer"被调用 def onTimer( self, id, userArg ): print "MyCellEntity.onTimer called: id %i, userArg: %i" % ( id, userArg ) # if 这是不断重复的定时器,当不再需要该定时器的时候,调用下面函数移除: # self.delTimer( id )
参数:
initialOffset | float,指定定时器从注册到第一次回调的时间间隔(秒)。 |
repeatOffset | float,指定第一次回调执行后每次执行的时间间隔(秒)。必须用函数delTimer移除定时器,否则它会一直重复下去。值小于等于0将被忽略。 |
userArg | integer,指定底层回调"onTimer"时的userArg参数值。 |
返回:
integer,该函数返回timer的内部id,这个id可用于delTimer移除定时器。 |
def cancelController( self, controllerID ):
参数:
controllerID | controllerID是要取消的控制器的索引,它是一个整型。一个专用的控制器类型的字符串也可以作为它的类型。 例如,一次只有一个移动/导航控制器可以被激活,这可以用entity.cancelController( "Movement" )取消。 |
def clientEntity( self, destID ):
参数:
destID | 目标实体的ID。 |
def canNavigate( self ):
通过这个方法判断当前实体是否可以使用导航(Entity.navigate)功能。它只能在一个real实体上被调用。
通常当实体所在Space使用Entity.addSpaceGeometryMapping加载过有效的导航用的碰撞数据(Navmesh或者2D的tile数据)并且实体在有效导航区域该功能可用。
返回:
bool, 如果实体可在当前Space中使用导航功能返回True,否则返回False。 |
def debugView( self ):
debugView输出Entity的View的详细信息到cell的调试日志。 一份View系统工作的描述可以在Entity类文档中找到。
一份样品信息如下:
INFO cellapp [0x00001a1c] [2014-11-04 00:28:41,409] - Avatar::debugView: 100 size=4, Seen=4, Pending=0, ViewRadius=50.000, ViewHyst=5.000 INFO cellapp [0x00001a1c] [2014-11-04 00:28:41,409] - Avatar::debugView: 100 Avatar(102), position(771.586.211.002.776.55), dist=0 INFO cellapp [0x00001a1c] [2014-11-04 00:28:41,409] - Avatar::debugView: 100 Monster(1028), position(820.834.211.635.768.749), dist=49.8659 INFO cellapp [0x00001a1c] [2014-11-04 00:28:41,409] - Avatar::debugView: 100 NPC(1025), position(784.024.210.95.782.273), dist=13.6915 INFO cellapp [0x00001a1c] [2014-11-04 00:28:41,409] - Avatar::debugView: 100 Avatar(106), position(771.586.211.002.776.55), dist=0信息的第一行告诉我们:
- 实体#1000的数据
- 有4个实体在它的View区域并且已经同步给客户端。
- 有0个实体在它的View区域,正在等待同步到客户端。
- View的半径是 50.000
- View的滞后区域向外延伸了5.000
def delTimer( self, id ):
函数delTimer用于移除一个注册的定时器,移除后的定时器不再执行。只执行1次的定时器在执行回调后自动移除,不必要使用delTimer移除。 如果delTimer函数使用一个无效的id(例如已经移除),将会产生错误。
参数:
id | integer,它指定要移除的定时器id。 |
def destroy( self ):
这个函数销毁它的本地Entity实例,如果实体在其他进程上存在ghost部分也会同时通知销毁。 这个函数最好由实体自己调用,如果这个实体是一个ghost则会抛出一个异常。如果回调函数onDestroy()被实现则被调用。
def destroySpace( self ):
def entitiesInView( self ):
获得这个实体的View范围内的实体列表。
def entitiesInRange( self, range, entityType=None, position=None ):
在给定的距离内搜索实体。这是一个球形的搜索,3个轴的距离 都要测量。这可以找到在这个实体的View范围之外的实体,但不能找到其他cell的实体。
例子:
self.entitiesInRange( 100, 'Creature', (100, 0, 100) )搜索到‘Creature’类型的实体列表(‘Creature’的子类实例化的实体)。中心点是(100, 0, 100),搜索半径是100米。
[ e for e in self.entitiesInRange( 100, None, (100,0,100) ) if isinstance( e, BaseType ) ]将给出一个来自‘BaseType’或‘BaseType’的子类实例化的实体列表。
参数:
range | 围绕这个实体搜索的距离,float类型 |
entityType |
一个可选的字符串参数,实体的类型名称,用于匹配实体。如果实体类型是一个有效的类名( 有效的实体类型在 则只有这个类型的实体会被返回,否则将这个范围的所有实体都返回。 |
position | 一个可选的Vector3类型参数,作为搜索半径的中心, 默认以实体自身为中心。 |
返回:
在给定范围内的Entity对象列表。 |
def isReal( self ):
返回:
bool, 如果是real实体返回True,否则返回False。 |
def moveToEntity( self, destEntityID, velocity, distance, userData, faceMovement, moveVertically ):
直线移动实体到另一个Entity位置。
任何实体,在任意时刻只能有一个移动控制器,重复调用任何移动函数将终止之前的移动控制器。
调用后函数将返回一个可以用于取消这次移动的控制器ID。
例如,Entity.cancelController( movementID )。 移动取消还可以调用Entity.cancelController( "Movement" )。当移动被取消之后回调通知方法将不被调用。
def onMove( self, controllerID, userData ): def onMoveOver( self, controllerID, userData ): def onMoveFailure( self, controllerID, userData ):
参考:
Entity.cancelController |
参数:
destEntityID | int,目标Entity的ID |
velocity | float,Entity移动的速度,单位m/s |
distance | float,距离目标小于该值停止移动,如果该值为0则移动到目标位置。 |
userData | object,可选参数,回调通知被调用时其中userData参数将为此值。 |
faceMovement | bool,可选参数,如果实体面向移动方向则为true。如果是其它机制则为false。 |
moveVertically | bool,可选参数,设为True指移动为直线移动,设为False指贴着地面直线移动。 |
返回:
int,新创建的控制器ID。 |
def moveToPoint( self, destination, velocity, distance, userData, faceMovement, moveVertically ):
直线移动Entity到给定的坐标点,成功或失败会调用回调函数。
任何实体,在任意时刻只能有一个移动控制器,重复调用任何移动函数将终止之前的移动控制器。
返回一个可以用于取消这次移动的控制器ID。
例如:
Entity.cancelController( movementID )。 移动取消还可以调用Entity.cancelController( "Movement" )。当移动被取消之后通知方法将 不被调用。
回调函数如下定义:
def onMove( self, controllerID, userData ): def onMoveOver( self, controllerID, userData ): def onMoveFailure( self, controllerID, userData ):
参看:
Entity.cancelController |
参数:
destination | Vector3,Entity要移动到的目标位置点 |
velocity | float,Entity的移动速度,单位m/s |
distance | float,距离目标小于该值停止移动,如果该值为0则移动到目标位置。 |
userData | object,传给通知函数的数据 |
faceMovement | bool,如果实体面向移动方向则为true。如果是其它机制则为false。 |
moveVertically | bool,设为true指移动为直线移动,设为false指贴着地面移动。 |
返回:
int,新创建的控制器ID。 |
def getViewRadius( self ):
返回:
float, View半径。 |
def getViewHystArea( self ):
返回:
float, View当前滞后区域值。 |
def getRandomPoints( self, centerPos, maxRadius, maxPoints, layer ):
参数:
centerPos | Vector3,Entity中心坐标点 |
maxRadius | float,最大的搜索半径 |
maxPoints | uint32,最多返回的随机坐标点数量。 |
layer | int8,使用某个层的navmesh来搜索。 |
返回:
tuple,包含一个或者多个坐标的数组。 |
def navigate( self, destination, velocity, distance, maxMoveDistance, maxSearchDistance, faceMovement, layer, userData ):
使用导航系统来使这个Entity向一个目标点移动,成功或失败会调用回调函数。
KBEngine可以有数个预先生成好的导航网格,不同的网格大小(会导致不同的导航路径)。
任何实体,在任意时刻只能有一个移动控制器,重复调用任何移动函数将终止之前的移动控制器。
返回一个可以用于取消这次移动的控制器ID。
例如:
Entity.cancelController( movementID )。 移动取消还可以调用Entity.cancelController( "Movement" )。当移动被取消之后通知方法将 不被调用。
回调函数如下定义:
def onMove( self, controllerID, userData ): def onMoveOver( self, controllerID, userData ): def onMoveFailure( self, controllerID, userData ):
参看:
Entity.cancelController |
参数:
destination | Vector3,Entity移向的目标点。 |
velocity | float,Entity的移动速度,单位m/s |
distance | float,距离目标小于该值停止移动,如果该值为0则移动到目标位置。 |
maxMoveDistance | float,最大的移动距离。 |
maxSearchDistance | float,从导航数据中最大搜索距离。 |
faceMovement | bool,如果实体面向移动方向则为true(默认)。如果是其它机制则为false。 |
layer | int8,使用某个层的navmesh来寻路。 |
userData | object,传给通知函数的数据。 |
返回:
int,新创建的控制器ID。 |
def navigatePathPoints( self, destination, maxSearchDistance, layer ):
参数:
destination | Vector3,Entity移向的目标点 |
maxSearchDistance | float,最大的搜索距离 |
layer | int8,使用某个层的navmesh来查找路径列表。 |
def setViewRadius( self, radius, hyst=5 ):
指定Entity的感兴趣的区域大小。
这个函数只能用于有Witness关联的实体。
注意: 你可以通过设置kbengine.xml配置选项'cellapp/defaultViewRadius'来设置默认的View半径。
数据可以通过 Entity.getViewRadius( )与Entity.getViewHystArea( )获得。
参数:
radius | float,radius指定View区域的半径 |
hyst |
float,指定超过View区域的滞后区域的大小。合理的设定滞后区域将能够降低View碰撞的敏感度从而提高CPU执行效率。 一个实体进入另一个实体的View必须跨越View半径区域,但实体离开View区域则需要移出View半径区域包括滞后区域。 |
返回:
None |
def teleport( self, nearbyMBRef, position, direction ):
瞬间移动一个Entity到一个指定的空间。这个函数允许指定实体移动后的位置与朝向。
如果需要在不同空间跳转( 通常用于不同场景或者房间跳转 ),可以传一个CellMailbox给这个函数( 这个mailbox所对应的实体必须在目的空间中 )。
这个函数只能在real的实体上被调用。
参数:
nearbyMBRef | 一个决定Entity跳往哪个Space的CellMailbox( 这个mailbox所对应的实体必须在目的Space中 ),它被认为是传送目的地。 这个可以设为None,在这种情形下它会在当前的cell完成瞬移。 |
position | Entity瞬移后的坐标,是一个有3个float(x, y, z)组成的序列。 |
direction | Entity瞬移后的朝向,是一个由3个float组成的序列(roll,pitch, yaw)。 |
def writeToDB( self, shouldAutoLoad, dbInterfaceName ):
这个函数保存与这个实体相关的数据到数据库,包括base实体的数据。在数据确认传到数据库之前base实体的onWriteToDB函数会被调用。
cell实体的数据同时备份在base实体,确保遇到灾难恢复数据时数据是最新的。
这个函数只能在real实体且实体必须存在base部分时才允许被调用。
参数:
shouldAutoLoad |
这个可选参数指定这个实体在服务启动的时候是否需要从数据库加载。 注意:服务器启动时自动加载实体,底层默认将会调用createBaseAnywhereFromDBID将实体创建到一个负载最小的baseapp上,整个过程将会在第一个启动的baseapp调用onBaseAppReady之前完成。 脚本层可以在个性化脚本(kbengine_defaults.xml->baseapp->entryScriptFile定义)中重新实现实体的创建方法,例如: def onAutoLoadEntityCreate(entityType, dbid): KBEngine.createBaseFromDBID(entityType, dbid) |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
回调函数文档
def onDestroy( self ):
def onEnterTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ):
参数:
entity | 已经进入了范围的实体。 |
rangeXZ | float,给定触发器xz轴区域的大小,必须大于等于0。 |
rangeY |
float,给定触发器y轴高度,必须大于等于0。 需要注意的是,这个参数要生效必须开放kbengine_defaults.xml->cellapp->coordinate_system->rangemgr_y 开放y轴管理会带来一些消耗,因为一些游戏大量的实体都在同一y轴高度或者在差不多水平线高度,此时碰撞变得非常密集。 3D太空类游戏或者小房间类实体较少的游戏比较适合开放此选项。 |
controllerID | 这个触发器的控制器id。 |
userArg | 这个参数的值由用户调用addProximity时给出,用户可以根据此参数对当前行为做一些判断。 |
def onEnteredView( self, entity ):
参数:
entity | 进入View范围的实体。 |
def onGetWitness( self ):
def onLeaveTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ):
参数:
entity | 已经离开触发器区域的实体。 |
rangeXZ | float,给定触发器xz轴区域的大小,必须大于等于0。 |
rangeY |
float,给定触发器y轴高度,必须大于等于0。 需要注意的是,这个参数要生效必须开放kbengine_defaults.xml->cellapp->coordinate_system->rangemgr_y 开放y轴管理会带来一些消耗,因为一些游戏大量的实体都在同一y轴高度或者在差不多水平线高度,此时碰撞变得非常密集。 3D太空类游戏或者小房间类实体较少的游戏比较适合开放此选项。 |
controllerID | 这个触发器的控制器ID。 |
userArg | 这个参数的值由用户调用addProximity时给出,用户可以根据此参数对当前行为做一些判断。 |
def onLoseControlledBy( self, id ):
参数:
id | controlledBy实体的ID。 |
def onLoseWitness( self ):
def onMove( self, controllerID, userData ):
参数:
controllerID | 与某个移动相关的控制器ID。 |
userData | 这个参数值由用户在请求移动相关接口时给出。 |
def onMoveOver( self, controllerID, userData ):
参数:
controllerID | 与某个移动相关的控制器ID。 |
userData | 这个参数值由用户在请求移动相关接口时给出。 |
def onMoveFailure( self, controllerID, userData ):
参数:
controllerID | 与某个移动相关的控制器ID。 |
userData | 这个参数值由用户在请求移动相关接口时给出。 |
def onRestore( self ):
def onSpaceGone( self ):
def onTurn( self, controllerID, userData ):
参数:
controllerID | Entity.addYawRotator返回的控制器ID。 |
userData | 这个参数值由用户在请求移动相关接口时给出。 |
def onTeleport( self ):
请注意,在cell上调用实体的teleport并不会回调此接口,如果你需要这个功能请在Entity.teleport之后调用此回调。
def onTeleportFailure( self ):
def onTeleportSuccess( self, nearbyEntity ):
参数:
nearbyEntity | 这个参数由用户调用
Entity.teleport时给出。这是一个real实体。
|
def onTimer( self, timerHandle, userData ):
参数:
timerHandle | 定时器的id。 |
userData | 传进Entity.addTimer的integer用户数据。 |
def onUpdateBegin( self ):
def onUpdateEnd( self ):
def onWitnessed( self, isWitnessed ):
可以利用这个函数在实体被观察时激活实体的AI,实体停止被观察时可以停止AI的执行,这样可以降低服务端的计算量从而提升效率。
参数:
isWitnessed | bool,实体被观察时为True,实体被停止观察时是False。 也可以访问实体属性Entity.isWitnessed得到实体当前的状态。 |
def onWriteToDB( self ):
属性文档
allClients
例子:
avatar的View范围内有玩家A和玩家B以及怪物C。
avatar.allClients.attack(monsterID,skillID, damage)
此时,玩家自己和玩家A还有玩家B的客户端都会调用到该实体attack方法,在他们的客户端可以调用指定技能的攻击动作做表现。
其他参考:
Entity.clientEntity Entity.otherClients |
base
其他参考:
Entity.clientEntity Entity.allClients Entity.otherClients |
类型:
只读的,MAILBOX |
className
类型:
只读,string |
client
其他参考:
Entity.clientEntity Entity.allClients Entity.otherClients |
类型:
只读的,MAILBOX |
controlledBy
脚本可以灵活的控制该实体由服务端控制移动或是由客户端(自己的客户端或是其他客户端)控制移动。
其他参考:
Entity.onLoseControlledBy |
类型:
BaseEntityMailBox |
direction
类型:
Vector3, 其中包含(roll, pitch, yaw),以弧度表示。 |
hasWitness
类型:
只读的, bool |
id
类型:
只读的,int32 |
isDestroyed
类型:
只读的, bool |
isOnGround
类型:
只读的, bool |
isWitnessed
类型:
只读的, bool |
layer
参考:
KBEngine.addSpaceGeometryMapping
类型:
int8 |
otherClients
例子:
avatar的View范围内有玩家A和玩家B以及怪物C。
avatar.otherClients.attack(monsterID,skillID, damage)
此时,玩家A与玩家B的客户端都会调用到该实体attack方法,在他们的客户端可以调用指定技能的攻击动作做表现。
其他参考:
Entity.clientEntity Entity.otherClients |
position
例子:
self.position.y = 10.0
如果你想拷贝这个属性值可以使用如下方式:
import Math self.copyPosition = Math.Vector3( self.position )
类型:
Vector3 |
spaceID
类型:
只读的,Integer |
topSpeed
其他参考:
Entity.topSpeedY |
类型:
float |
topSpeedY
其他参考:
Entity.topSpeed |
类型:
float |
volatileInfo
易变类数据包括实体的坐标position和实体的朝向direction,易变类数据由于极易改变的特性,引擎底层使用了一套优化的方案将其同步到客户端。
这个属性是四个float(position,yaw,pitch,roll)代表距离值,当一个实体靠近当前实体达到距离则服务端向其同步相关数据。如果距离值大于View半径则代表总是同步。
还有一个特殊的bool属性optimized,它的作用是控制服务器同步时是否进行优化,目前主要的优化是Y轴。
如果为true,在一些行为(如:navigate)导致服务器能确定实体在地面时,服务器不同步实体的Y轴坐标,当同步大量实体时能节省大量带宽,默认为true。
用户也可以在.def制定不同实体的同步策略:
<Volatile> <position/> <!-- 总是同步 --> <yaw/> <!-- 总是同步 --> <pitch>20</pitch> <!-- 相距20米或以内同步 --> <optimized> true </optimized> </Volatile> <!-- roll未指明则总是同步 -->
类型:
sequence, 四个浮点数(float, float, float, float) |