虚幻引擎(UE5)中接入MySQL数据库(附工程源码)
前言
本文主要讲解借助“MySQL Connector/c++”在虚幻引擎中完成Windows平台的MySQL数据库操控。
Windows平台MySQL Server部署,请移步这里
实施
1、新建项目并配置第三方库导入
新建C++ UE5项目,创建成功后在Source文件夹中添加ThirdParty文件夹。在ThirdParty文件夹中添加导入库模块“MeetMySql”(名称随意),并参照下图完成文件夹与文件创建。
2、下载“MySQL Connector/c++”
本文使用的是非安装版本的“MySQL Connector/c++”,下载地址,需要注意版本号是8.0.32。
3、导入头文件与库文件
解压缩mysql-connector-c++-8.0.32-winx64文件,按照以下步骤拷贝内容:
头文件:将解压内“include\jdbc”中的所有内容拷贝到虚幻项目“Source\ThirdParty\MeetMySql\include”下
库文件:将解压文件夹内库“libcrypto-1_1-x64.dll,libssl-1_1-x64.dll,mysqlcppconn-static.lib”拷贝到虚幻项目“Source\ThirdParty\MeetMySql\lib”下
4、编写build.cs文件
参照如下代码,编写build.cs文件,用于UBT索引关系。
1// Copyright 2015-2023 UEJoy 自动生成文件 Version 1.1.0
2
3using UnrealBuildTool;
4using System.IO;
5
6public class MeetMySql : ModuleRules
7{
8 public MeetMySql(ReadOnlyTargetRules Target) : base(Target)
9 {
10 Type = ModuleType.External;
11 //库文件路径
12 PublicSystemLibraryPaths.Add(Path.Combine(ModuleDirectory, "lib"));
13 //头文件路径
14 PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
15 //添加静态库
16 PublicSystemLibraries.Add(Path.Combine(ModuleDirectory, "lib", "mysqlcppconn-static.lib"));
17 // //加入动态库
18 RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "lib", "libcrypto-1_1-x64.dll"));
19 RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "lib", "libssl-1_1-x64.dll"));
20 }
21}
5、修改driver头文件编译冲突
在头文件路径下找到driver头文件路径:“\include\cppconn\driver.h”,由于虚幻引擎中有check断言宏,但此头文件中有如下代码
1CPPCONN_PUBLIC_FUNC void check(const std::string &);
2CPPCONN_PUBLIC_FUNC void check(const std::map<std::string,std::string> &);
如果不处理,则导致编译错误,解决方法,编译此头文件可先去掉check宏声明,加如下代码
1//暂时去掉check宏定义
2#undef check
3CPPCONN_PUBLIC_FUNC void check(const std::string &);
4CPPCONN_PUBLIC_FUNC void check(const std::map<std::string,std::string> &);
然后在此头文件尾加上原有的断言check宏,如下代码:
1#ifndef check
2#define check(expr) UE_CHECK_IMPL(expr)
3#endif
6、添加测试代码
- 在启动项目的build.cs文件中引入“MeetMySql”模块
1PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MeetMySql" });
- 编写测试代码,我添加到了gamemode的函数中,并将函数标注为指令函数(UFUNCTION(Exec)),以下是函数定义,实现了向数据库中添加表格,并插入元素。
1void AMySqlExampleGameModeBase::TestMySql()
2{
3 try
4 {
5 sql::mysql::MySQL_Driver* driver;
6 sql::Connection* con;
7
8 driver = sql::mysql::get_mysql_driver_instance();
9 con = driver->connect("tcp://localhost:3306", "root", "abc123456");
10
11 sql::Statement* stamt = con->createStatement();
12
13 stamt->execute("create DATABASE " "Pome");
14 stamt->execute("USE " "Pome");
15 stamt->execute("DROP TABLE IF EXISTS website");
16 stamt->execute("CREATE TABLE website(id INT, name CHAR(100), domain CHAR(200))");
17 stamt->execute("INSERT INTO website(id, name, domain) VALUES (1, 'pome', 'htts://www.pome.cc')");
18
19 delete stamt;
20 delete con;
21
22 UE_LOG(LogTemp, Log, TEXT("Create db was succeed!"));
23 }
24 catch (const std::runtime_error err)
25 {
26 }
27 catch (const sql::SQLException&)
28 {
29 }
30 catch (const std::bad_alloc& )
31 {
32 }
33}
- 在此声明函数的头文件中,加入如下头文件引用
1#define STATIC_CONCPP
2#include "mysql_driver.h"
3#include "cppconn/prepared_statement.h"
4#include "cppconn/driver.h"
5#include "cppconn/exception.h"
STATIC_CONCPP:宏必须添加,否则编译错误。
7、拷贝动态库到执行路径
将lib路径中的dll文件拷贝到“MySqlExample\Binaries\Win64”文件夹下,这样保证运行时可以找到关联动态库。
8、执行并查询库
执行代码后,通过数据库下的bin中的mysql登录库,查看库中内容:
结语
本文内的导入库只测试Windows平台,其他平台无法保证使用。
关于如何操作MySQL的增删改查,可以参考《使用 Connector/C++ 在 Azure Database for MySQL 中进行连接并查询数据》
版本
系统:win10
虚幻引擎:5.2
MySQL数据库版本:mysql-8.0.33-winx64
MySQL Connector C++版本:mysql-connector-c++-8.0.32-winx64
参考资料
1、MySQL Connector/C++: Usage Examples
2、使用 Connector/C++ 在 Azure Database for MySQL 中进行连接并查询数据
3、Github mysql-connector-cpp(github源码)