kb引擎经常会遇到的问题和处理办法。
1,如果你的属性是同步的,如果通过
self.dict[strP] = val
去修改不会触发属性同步,可以使用
setattr(self,strP,val),也可以利用dict方式来初始化数据而不发送给客户端。
2,在base里,你可以使用entityCall.cell 来调用cell方法
在cell里也可以通过entityCall.base来调用base方法。
3,entityCall.id是可以在任何地方获得的。
4,def onLogOnAttempt( self, ip, port, password ):
如果重新连线,内存有对象触发,我们可以处理断线重连。
这个回调函数可以返回如下常量值:
KBEngine.LOG_ON_ACCEPT:允许新的客户端与实体进行绑定,如果实体已经绑定了一个客户端,之前的客户端将被踢出。
KBEngine.LOG_ON_REJECT:拒绝新的客户端与实体绑定。
KBEngine.LOG_ON_WAIT_FOR_DESTROY:等待实体销毁后再进行客户端绑定。
5,动态开关,可以在data目里放一个systemInfo.py
#放置一些服务器的参数 systemInfo
import hashlib
serverRegular = 0 #是否正式服
writeMylog = 1 #是否写入mylog
isopen = 0 #是否放人,这个开关只有在正式服公网模式才会验证
然后在login的kbemain.py中定义
if(systemInfo.isopen != 1):
#如果关闭了停止登录,提示用户自定义消息1
errorno = KBEngine.SERVER_ERR_USER1
return (errorno, loginName, password, clientType, datas)
来开启和关闭服务器用户登录
6,cellData参数在创建cell对象的时候就无法访问了,直到在销毁cell对象的时候又可以访问了,貌似cellData里的数值会变成销毁cell时候的数值。
所以如果你希望重连后不进入房间,那么可以在cell里的onDestroy清空相关数据。
7,Logs目录的里log输出
玩家数量大会输出很多log,我们通过kbe\res\server\log4cxx_properties_defaults里面的log4cxx配置文件进行配置。
Loggers 六个级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。
低级别的不会输出,例如设置了DEBUG则TRACE的不会输出。
8,心跳设置
有时候在连线时候加载卡死的函数会掉线,可以在引擎的目录kbengine\kbe\res\sdk_templates\client\unity修改模板,增加下面的脚本
修改KBEngine.cs
public void SetHeartTick(int heart)
{
_args.serverHeartbeatTick = heart / 2;
}
然后再游戏中,我们继承的类中添加修改心跳周期的函数,例如
public class KB : KBEMain
{
//设置心跳
public void SetHeartTick(int tick)
{
gameapp.SetHeartTick(tick);
}
//恢复心跳
public void ResetHeartTick()
{
gameapp.SetHeartTick(serverHeartbeatTick);
}
}
我们在卡死之前调用KB.inst.SetHeartTick(int.MaxValue);之后回复就可以了。
9,属性作用域
如果一个属性的作用域分为多个部分,那么在实体的对应部分都存在该属性。
存在于实体多个部分的属性只能从属性的源头进行修改,其他部分会得到同步。
请参考如下表:(S与SC或者C都代表属性包含这个部分,不同的是S代表属性的源头,C代表数据由源头同步,SC代表实体的real部分才是源头,ghosts部分也是被同步过去的)
[类型] | [ClientEntity] | [BaseEntity] | [CellEntity] |
---|---|---|---|
BASE | - | S | - |
BASE_AND_CLIENT | C | S | - |
CELL_PRIVATE | - | - | S |
CELL_PUBLIC | - | - | SC |
CELL_PUBLIC_AND_OWN | C | - | SC |
ALL_CLIENTS | C(All Clients) | - | SC |
OWN_CLIENT | C | - | S |
OTHER_CLIENTS | C(Other Clients) | - | SC |
10,导入其他包
通常我们安装 pip install 包体,安装成功会显示路径,然后
只要把python的包拷贝到kbe\res\scripts\common\Lib下就可以了。
11,发送Post和Get的请求
Post可以使用下面的,首先header需要是application/x-www-form-urlencoded
本来写的是一个
headerdict = {"Content-Type": "application/x-www-form-urlencoded"}
parm = {
"payid" : one["payid"],
"shopid" : GameConfigs.BIGSPACE_PAY_ID
}
sparm = str(parm).encode('utf-8')
url = "http://192.168.3.18:9999/api/wechat"
KBEngine.urlopen(url,onBigSpacePayHttpCallback,sparm,headerdict)
这种结构发送过去后,表单Form只有一个Keys,内容是parm里的,不能满足需求。
应当按照下面方式来发送就符合一个Key对应一个Value了
headerdict = {"Content-Type": "application/x-www-form-urlencoded"}
parm = "payid=%s&shopid=%s" % (one["payid"],GameConfigs.BIGSPACE_PAY_ID)
sparm = str(parm).encode('utf-8')
url = "http://192.168.3.18:9999/api/wechat"
KBEngine.urlopen(url,onBigSpacePayHttpCallback,sparm,headerdict)
def onBigSpacePayHttpCallback(httpcode, data, headers, success, url):
#if success :
# self.FinishPay.de
INFO_MSG("返回,httpcode: %s , 成功: %s, url: %s , data : %s" % (httpcode,success,url,data))
if success == False :
WARNING_MSG("失败: %s" % (url))
Get可以使用:
url = "http://192.168.3.18:9999/API/reg.aspx?UserTel=&%s&ScriptID=%s&UserNumber=%s&StartTime=%s&EndTime=%s&PlayTime=%s" %(str(one["lineoffid"]),str(one["fbid"]),str(one["lineoffno"]),str(sbtime),str(setime),str(one["longtime"]))
KBEngine.urlopen(url,onHttpCallback)
def onHttpCallback(httpcode, data, headers, success, url):
#if success :
# self.FinishPay.de
print("onHttpCallback")
print(httpcode, data, headers, success, url)