搭建UE5+KBEngine服务器(2):为UE项目添加KBEngine插件

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,替换工程中的文件,成功构建项目则代表修复完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值