GitHub - LGlightflow/kbengine: A MMOG engine of server. 这是我修改好的适用于ue5 的 KBengine
1.创建UE项目
这里随便创建即可,仅做一个示例。这里我选的是Blank模板。
2.生成SDK
运行 : kbengine-2.5.12\server_assets\gensdk.bat,生成两个文件夹:
这里我们仅需要UE的这个文件夹。
3.复制到UE项目中
先在UE项目中新建一个Plugins文件夹,并且将步骤2生成的SDK复制到此文件夹中。
右键.uproject文件生成VS项目文件;
此时插件已经能在vs显示了:
4.在项目中配置插件
现在先向打开项目名.Build.cs,往PrivateDependencyModuleNames添加"KBEnginePlugins"
PrivateDependencyModuleNames.AddRange(new string[] { "KBEnginePlugins" });
(为什么是这个名字?名字来源于Plugins\kbengine_ue4_plugins\Source\KBEnginePlugins)
再用vs打开uproject文件,添加插件,修改如下:
{
"FileVersion": 3,
"EngineAssociation": "5.1",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "KBEngine_Template",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
},
{
"Name": "KBEnginePlugins",
"Enabled": true
}
]
}
添加两个文件:Account.cpp和Account.h文件:
这里最好在文件资源管理器创建好再添加现有项:
注:可以参考一下官方项目:
https://github.com/kbengine/kbengine_ue4_demo/releases/latest
我这里先在Account.h写一个类,继承自AccountBase:
#pragma once
#include "../Engine/KBECommon.h"
#include "../Engine/AccountBase.h"
namespace KBEngine
{
class Account :public AccountBase
{
public:
Account();
virtual ~Account();
virtual void __init__() override;
virtual void onDestroy() override;
};
}
如果遇到“无法打开源文件“” ”之类的错误的话,尝试第三步中右键.uproject文件生成VS项目文件;
如果遇到无法解析的外部符号,要创建上面的函数的定义。
此时遇到报错: “seg”的声明隐藏了上一个本地声明 :
报错1:seg
双击 “seg”的声明隐藏了上一个本地声明 ,进入ikcp.c文件:
将435行(其实vs可以直接定位到seg的位置的)seg变量改个名:
代码:
// move available data from rcv_buf -> rcv_queue
while (! iqueue_is_empty(&kcp->rcv_buf)) {
IKCPSEG *seg1 = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node);
if (seg1->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd) {
iqueue_del(&seg1->node);
kcp->nrcv_buf--;
iqueue_add_tail(&seg1->node, &kcp->rcv_queue);
kcp->nrcv_que++;
kcp->rcv_nxt++;
} else {
break;
}
}
其他类似的报错如法炮制.
报错2:una
una:(为了方便截图我将while(1)折叠起来了)
代码:
int ikcp_input(ikcpcb *kcp, const char *data, long size)
{
IUINT32 una1 = kcp->snd_una;
IUINT32 maxack = 0;
int flag = 0;
if (ikcp_canlog(kcp, IKCP_LOG_INPUT)) {
ikcp_log(kcp, IKCP_LOG_INPUT, "[RI] %d bytes", size);
}
if (data == NULL || (int)size < (int)IKCP_OVERHEAD) return -1;
while (1) {
[...]
}
if (flag != 0) {
ikcp_parse_fastack(kcp, maxack);
}
if (_itimediff(kcp->snd_una, una1) > 0) {
if (kcp->cwnd < kcp->rmt_wnd) {
IUINT32 mss = kcp->mss;
if (kcp->cwnd < kcp->ssthresh) {
kcp->cwnd++;
kcp->incr += mss;
} else {
if (kcp->incr < mss) kcp->incr = mss;
kcp->incr += (mss * mss) / kcp->incr + (mss / 16);
if ((kcp->cwnd + 1) * mss <= kcp->incr) {
kcp->cwnd++;
}
}
if (kcp->cwnd > kcp->rmt_wnd) {
kcp->cwnd = kcp->rmt_wnd;
kcp->incr = kcp->rmt_wnd * mss;
}
}
}
return 0;
}
报错3:size
if (needsend) {
int size1, need;
segment->ts = current;
segment->wnd = seg.wnd;
segment->una = kcp->rcv_nxt;
size1 = (int)(ptr - buffer);
need = IKCP_OVERHEAD + segment->len;
if (size1 + need > (int)kcp->mtu) {
ikcp_output(kcp, buffer, size1);
ptr = buffer;
}
ptr = ikcp_encode_seg(ptr, segment);
if (segment->len > 0) {
memcpy(ptr, segment->data, segment->len);
ptr += segment->len;
}
if (segment->xmit >= kcp->dead_link) {
kcp->state = -1;
}
}
报错4:无法打开包括文件:“Object.h”
双击此错误(或者找到KBEvent.h文件),修改#include "Object.h"为:
报错5:
这里我直接按上图所示的顺序贴截图了:
FileHelper.h,Paths.h, PlatformFilemanager.h:
Object.h:
报错6:ModuleMantager.h
报错7:AllowWindowsPlatformTypes.h等
报错7:pEventData:
报错8:nodiscard:
报错9:C1083 无法打开包括文件: “Engine/KBDebug.h”: No such file or directory
报错10:C1083 无法打开包括文件: “Scripts/Account.h”: No such file or directory
报错11:错误 C1083 无法打开包括文件: “Regex.h”: No such file or directory
报错12:E0434 无法用 "double" 类型的值初始化 "float &" 类型的引用(非常量限定) 将所有的FVector 替换为FVector3f(注意是所有!会出现替换了部分FVector也能运行的情况,但是为了下一步的生成sdk修复,最好还是替换所有)
5.生成sdk的修复
将修改过的文件放入KBEngine源码中,避免重新生成sdk导致上面的修改还要再做一遍。即将UE工程中 UE项目名\Plugins\kbengine_ue4_plugins\Source\KBEnginePlugins\Engine的下述文件移到 kbengine-2.5.12\kbe\res\sdk_templates\client\ue4\Source\KBEnginePlugins\Engine 目录下:
可以通过按修改日期排序来筛选
然后修改\kbengine-2.5.12\kbe\src\server\tools\kbcmd\client_sdk_ue4.cpp
并将client_sdk_ue4.cpp 的FVector 改为 FVector3f,应该是要改12处,如果使用全字匹配只找到8处,大概是漏了形如下图的修改:
按步骤2重新生成sdk,替换工程中的文件,成功构建项目则代表修复完成。