-
Notifications
You must be signed in to change notification settings - Fork 4
kbe系列问题
1 : mysql_errno=1045, mysql_error=Access denied for user 'kbe'@'localhost' (using password: YES)
这个错误是mysql直接报出的。 你可以网上搜这个问题。
一般是匿名用户造成的。
2: 有一个快速安装KBE的方法 假设mysql和mysql账号都配置完毕了 1:下载服务器源码和demo以及服务器demo资产库 2:编译服务器 3:进入服务器资产库运行start_server.bat启动服务器,脚本自动设置临时环境(假如没有在系统中指定环境变量) 4:可以打开客户端进入游戏了。
3:
要想在服务端放传送点并在客户端显示, 你可以看看demo中有传送员, 其实就是在服务器上创建一个实体, 你可以给这个实体增加一些模型外观等属性, 在客户端获取到这个属性然后使用你想要的模型和特效来表达这个实体。
4:
服务器上的space到底加载哪个navmesh取决于你自己怎么填充的
KBEngine.addSpaceGeometryMapping(self.spaceID, None, resPath, True, {0 : "srv_xinshoucun_1.navmesh", 1 : "srv_xinshoucun.navmesh"})
如果有2个地图, 你肯定有2个不同的space实体, 那你指定不同的navmesh就行了。
傳送員不是指 GameEntity_BP, 这是客户端用于表现的通用actor, 传送员主要是在服务端由逻辑定义出来的身份。 客户端你可以根据身份去组装你想要的模型和外观以及UI功能。 demo没有开发很完整, 所以demo的传送员只有名字显示为传送员, 实际上他与其他的怪和NPC的区别只是名字和不能移动。
unity的demo则可以通过传送门传送到其他副本中, 服务端的逻辑是一致的。
5:demo每个NPC和怪物都有个属性脚本modelID, 你配置表给不同的id就是不同的模型, 客户端你得到这个属性数据就可以做不同的模型外观表现.
6: 角色的资料在avatar_init.py里。
KBE的客户端核心代码只负责到D:\kbe\kbengine_ue4_demo\Plugins\KBEnginePlugins这一层目录。 其他代码都是需要按照你游戏自己增加和修改的。
7:
isPlayer只能判断是否是你自己。
应该根据modelID来设置模型.
8: isPlayer只能判断是否是你自己。
应该根据modelID来设置模型. 9: d_avatar_inittab.py modelID与Avatar.def中的modelID是没有关系的, d_avatar_inittab.py 是配置文件, 在服务器中你需要读取配置文件对Avatar的modelID赋值。 那么在第一次创建Avatar, 并且没有将modelID改变的情况下, 默认值就是你上面写的1
这里说的当然是客户端。 只是举个例子, 你要在客户端得到服务器上你定义的modelID属性值, 然后决定当前这个actor应该是什么造型。 根本不需要知道他是怪物还是玩家, 只需要知道造型,因为modelID在策划配置中人物和怪物肯定是不同的造型ID。
10: 不要总是盯着enterworld这一个事件,这个事件是引擎级的事件, 而引擎一个原始的entity是没有任何其他数据的, modelID是脚本逻辑层自己定义的allClients属性, 因此你需要在其他事件中得到这个信息。
KBE引擎层的事件有 https://github.com/kbengine/kbengine_ue4_plugins 看readme。
除此之外还有逻辑层自己产生的事件, 你可以看LogicEvents.h 其中有一个事件是UKBEventData_set_modelID,当服务器上entity的modelID被改变, 服务器会同步这个数据到客户端,客户端中kbe_scripts中的entity因为实现了set_[服务器def定义的属性名],插件就会调用实体的set_方法,让实体知道属性被改变了,而此时仍然是KBE层的通知,在demo中KBE脚本层又自己触发了set_modelID事件通知UE4渲染层,导致UE4 void AGameModeWorld::set_modelID_Implementation(const UKBEventData* pEventData)被触发, 在这里面你可以得知某个actor他是哪个造型ID。
并且demo已经设置到gameEntity(这个actor就是渲染层的actor)了, 你在渲染层已经可以直接访问了
void AGameModeWorld::set_modelID_Implementation(const UKBEventData* pEventData)
{
const UKBEventData_set_modelID* pData = Cast<UKBEventData_set_modelID>(pEventData);
AGameEntity* pAGameEntity = findGameEntity(pData->entityID);
if (pAGameEntity)
pAGameEntity->modelID = pData->modelID;
}
好好理解现在的底层和渲染层的数据交互模式.
12:由于enterworld时并没有modelID, 所以第一次你可以创建actor不要附加模型, 当set_modelID_Implementation触发之后再给这个actor附加指定的模型