Entwicklung des UE4 MySQL-Plug-Ins
Artikelverzeichnis
1. Projekteinführung
- Person
UrealEngine MySQL Plugin
Eröffnungsvorgang - Maßnahmen
UnrealEngine
Elemente链接
Japanisch操作
MySQL-Zahleneinstellungen
2. Projektumgebung
IDE -> JetBrains Rider 2022.1 EAP7 内部版本号 221.4906.10
UnrealEngine -> 4.27.2
Compiler Environment -> Visual Studio 2022 提供编译组件
MySQL -> 8.0.28 MySQL Community Server - GPL
3. Projektressourcen
3.1 Struktur der Ressourcendatei
ConnectorLibs
- ConnectorLibs
+ include
+ lib
- ConnectorLibs.Build.cs
3.2 Ressourcenlinks
「ConnectorLibs」https://www.aliyundrive.com/s/wTrvzpVdfxU Extraktionscode: 0be0
4. Projekterstellung
4.1 UE4-Projekt erstellen
- Standardauswahl
游戏项目
- Standardauswahl
空项目
- Konstruktion
C++项目
, Inklusion初学者内容包
- Wählen Sie das Verzeichnis aus, in dem das Projekt erstellt wird
- Projektnamen erstellen
FH_TestMySQL
4.2 Neues Plug-in erstellen
- 找到
Edit
或Settings
- Wählen Sie
plugins
Plug-in-Schnittstelle aufrufen - wählen
New Plugin
- wählen
Blank
- Plugin-Namen festlegen
FH_MySQL
Descriptor Data
Geben Sie ein, was Sie möchtenCreate Plugin
4.3 Erstellen Sie eine MySQL C++-Klasse
4.3.1 FH_ConnectionObject
- Erstellen
Object
C++-Klasse, KlassennameFH_ConnectionObject
- Auswählen, um zum Plugin-Verzeichnis hinzuzufügen
FH_MySQL(Runtime)
, Standardpublic .h,private .cpp
Create Class
- Es öffnet sich ein Fenster
Message
, der Inhalt ist ungefähr创建成功,但需要重新编译
, wählen Sie ausNo
4.3.2 BPFuncLib_FHSQL
- Erstellen
Blueprint Function Library
C++-Klasse, KlassennameBPFuncLib_FHSQL
- Die restlichen Schritte sind die gleichen wie oben
5. Projektkonfiguration
5.1 Einführung in die MySQL-Umgebungsbibliothek
5.1.1 Umgebungsbibliothek importieren
- bereit machen
ConnectorLibs
- Gehe zum
FH_TestMySQL\Plugins\FH_MySQL\Source
Verzeichnis - Erstellen Sie ein Verzeichnis
ThirdParty
- allgemein
ConnectorLibs
VeröffentlichungThirdParty
in
5.1.2 Projekteigenschaften konfigurieren
Rider
Öffnen Sie das erstellte UE4 C++-Projekt- Suchen Sie den Projektnamen
FH_TestMySQL
in der Ressourcenleiste im VerzeichnisGames
- Klicken Sie mit der rechten Maustaste und wählen Sie aus
Properties
- Auswählen innerhalb von
Configurations
Development_Editor | x64
- wählen
VC++目录
- Geben Sie den absoluten Pfad ein
包含目录(include)
项目文件路径\FH_TestMySQL\Plugins\FH_MySQL\Source\ThirdParty\ConnectorLibs\include
- Geben Sie den absoluten Pfad ein
库目录(lib)
项目文件路径\FH_TestMySQL\Plugins\FH_MySQL\Source\ThirdParty\ConnectorLibs\lib
OK
5.1.3 Projektdateien konfigurieren
-
Reparatur
FH_MySQL.uplugin
, Textposition项目文件路径\FH_TestMySQL\Plugins\FH_MySQL
, nur Ergänzung verlangen"WhitelistPlatforms": ["Win64"]
{ "FileVersion": 3, "Version": 1, "VersionName": "1.0", "FriendlyName": "FH_MySQL", "Description": "Using UE4 Connecting MySQL Plugin", "Category": "FhPlugin", "CreatedBy": "FangH", "CreatedByURL": "https://fhangh.gitee.io/", "DocsURL": "", "MarketplaceURL": "", "SupportURL": "", "CanContainContent": true, "IsBetaVersion": true, "IsExperimentalVersion": false, "Installed": false, "Modules": [ { "Name": "FH_MySQL", "Type": "Runtime", "LoadingPhase": "Default", "WhitelistPlatforms": ["Win64"] } ] }
-
Überarbeitet
FH_MySQL.Build.cs
, Satzposition项目文件路径\FH_TestMySQL\Plugins\FH_MySQL\Source\FH_MySQL
, überarbeiteter InhaltPublicDependencyModuleNames.AddRange( new string[] { "Core", "ConnectorLibs", // ... add other public dependencies that you statically link with here ... } );
6. MySQL C++-Dateien
6.1 MySQL-Verbindungsobjekt
-
FH_ConnectionObject.h
#pragma once #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "mysql.h" #include "FH_ConnectionObject.generated.h" UCLASS(BlueprintType) class FH_MYSQL_API UFH_ConnectionObject : public UObject { GENERATED_BODY() private: UFH_ConnectionObject(); public: MYSQL *Fh_ConnMysql; };
-
FH_ConnectionObject.cpp
#include "FH_ConnectionObject.h" UFH_ConnectionObject::UFH_ConnectionObject() { Fh_ConnMysql = nullptr; }
6.2 MySQL-Funktionstool-Bibliothek
-
BPFuncLib_FHSQL.h
#pragma once #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "FH_ConnectionObject.h" #include "BPFuncLib_FHSQL.generated.h" USTRUCT(BlueprintType) struct FQueryResultRow { GENERATED_BODY() UPROPERTY(BlueprintReadWrite, Category="MySQL|Result Row Value") TArray<FString> RowValue; }; USTRUCT(BlueprintType) struct FQueryResultRows { GENERATED_BODY() UPROPERTY(BlueprintReadWrite, Category="MySQL|Result Rows Value") TArray<FQueryResultRow> RowsValue; }; UCLASS(BlueprintType) class FH_MYSQL_API UBPFuncLib_FHSQL : public UBlueprintFunctionLibrary { GENERATED_BODY() public: /* * Connection == MySQL Object * @return *UFH_ConnectionObject == MySQL Connector */ UFUNCTION(BlueprintCallable, Category="MySQL|Utils") static UFH_ConnectionObject *ConnectToMySQL(FString Host, FString UserName, FString PassWord, FString DBName, int32 Port, FString &ConnectMessage); /* * ConnectionObject == MySQL Object * @return bool == ConnectionState */ UFUNCTION(BlueprintCallable, Category="MySQL|Utils") static bool GetConnectionState(UFH_ConnectionObject *ConnectionObject); /* * ConnectionObject == MySQL Object * @return bool == ConnectionState */ UFUNCTION(BlueprintCallable, Category="MySQL|Utils") static bool CloseConnection(UFH_ConnectionObject *ConnectionObject); /* * ConnectionObject == MySQL Object * @return bool == Insert, Update, Delete Data Is Succeed Or Failed */ UFUNCTION(BlueprintCallable, Category="MySQL|Utils") static bool ActionOnTableData(UFH_ConnectionObject *ConnectionObject, FString SqlQuery); /* * TableName = DataBase TableName * InsertValues = MySQL Insert Values to Table * @return FString = MySQL Insert Query -> Insert */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString InsertFormatSqlQuery(FString TableName, FString InsertValues); /* * TableName = DataBase TableName * RowName = Need Update Row * @return FString = MySQL Update Query -> Update */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString UpdateAllFormatSqlQuery(FString TableName, FString RowName, FString UpdateValue); /* * TableName = DataBase TableName * RowName = Need Update Row * WhereName = Update Where * WhereSymbol = Operator Or Symbol * WhereValue = Condition Name * UpdateValue = Need Update Date Value * @return FString = MySQL Update Query -> Update */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString UpdateByWhereFormatSqlQuery(FString TableName, FString RowName, FString WhereName, FString WhereSymbol, FString WhereValue, FString UpdateValue); /* * TableName = DataBase TableName * @return FString = MySQL Delete Query -> Delete */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString DeleteAllFormatSqlQuery(FString TableName); /* * TableName = DataBase TableName * WhereName = Update Where * WhereSymbol = Operator Or Symbol * WhereValue = Condition Name * @return FString = MySQL Delete Query -> Delete */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString DeleteByWhereFormatSqlQuery(FString TableName, FString WhereName, FString WhereSymbol, FString WhereValue); /* * ConnectionObject == MySQL Object * @return bool == Select Data Is Succeed Or Failed */ UFUNCTION(BlueprintCallable, Category="MySQL|Utils") static bool SelectOnTableData(UFH_ConnectionObject *ConnectionObject, FString SqlQuery, FQueryResultRows &ResultRows); /* * TableName = DataBase TableName * @return FString = MySQL Select Query -> Select */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString SelectAllFormatSqlQuery(FString TableName); /* * TableName = DataBase TableName * @return FString = MySQL Select Query -> Select */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FString SelectByColumnsFormatSqlQuery(FString TableName, FString Columns); /* * TableName = DataBase TableName * @return TArray<FString> = Get All Rows -> In All Columns Values */ UFUNCTION(BlueprintPure, Category="MySQL|Utils") static FQueryResultRow GetRowByIndex(const FQueryResultRows &ResultRows, int32 RowIndex); };
-
BPFuncLib_FHSQL.cpp
#include "BPFuncLib_FHSQL.h" #include "mysql.h" #include <string> UFH_ConnectionObject* UBPFuncLib_FHSQL::ConnectToMySQL(FString Host, FString UserName, FString PassWord, FString DBName, int32 Port, FString &ConnectMessage) { const std::string m_Host(TCHAR_TO_UTF8(*Host)); const std::string m_UserName(TCHAR_TO_UTF8(*UserName)); const std::string m_PassWord(TCHAR_TO_UTF8(*PassWord)); const std::string m_DBName(TCHAR_TO_UTF8(*DBName)); const uint32 m_Port = Port; // Create MySQL Connection Object UFH_ConnectionObject *ConnectionObject = NewObject<UFH_ConnectionObject>(); // Init DataBase Connection Object ConnectionObject->Fh_ConnMysql = mysql_init(nullptr); // Judge Connection Status And Return ConnectMessage if (mysql_real_connect(ConnectionObject->Fh_ConnMysql, m_Host.c_str(), m_UserName.c_str(), m_PassWord.c_str(), m_DBName.c_str(), m_Port, nullptr, 0)) { ConnectMessage = TEXT("Connect Succeed"); } else { ConnectMessage = TEXT("Connect Failed"); } // Return MySQL Connection Object return ConnectionObject; } bool UBPFuncLib_FHSQL::GetConnectionState(UFH_ConnectionObject* ConnectionObject) { // Judge Current MySQL Connection State if (ConnectionObject) { if (ConnectionObject->Fh_ConnMysql != nullptr) { return true; } return false; } return false; } bool UBPFuncLib_FHSQL::CloseConnection(UFH_ConnectionObject* ConnectionObject) { // If MySQL Connected -> Close MySQL Connection; Return True // Else -> Return True if (GetConnectionState(ConnectionObject)) { mysql_close(ConnectionObject->Fh_ConnMysql); ConnectionObject->Fh_ConnMysql = nullptr; ConnectionObject = nullptr; return true; } return true; } bool UBPFuncLib_FHSQL::ActionOnTableData(UFH_ConnectionObject* ConnectionObject, FString SqlQuery) { const std::string m_SqlQuery(TCHAR_TO_UTF8(*SqlQuery)); // Judge MySQL Is Connected if (!ConnectionObject) { return false; } // Judge SqlQuery Is Apply Succeed if (mysql_query(ConnectionObject->Fh_ConnMysql, m_SqlQuery.c_str()) == 0) { return true; } return true; } FString UBPFuncLib_FHSQL::InsertFormatSqlQuery(FString TableName, FString InsertValues) { // INSERT INTO TableName VALUES(InsertValues); FString SqlQuery = "INSERT INTO " + TableName + " VALUES(" + InsertValues + ");"; return SqlQuery; } FString UBPFuncLib_FHSQL::UpdateAllFormatSqlQuery(FString TableName, FString UpdateRowName, FString UpdateValue) { // UPDATE TableName SET RowName=UpdateValue; FString SqlQuery = "UPDATE " + TableName + " SET " + UpdateRowName + "=" + UpdateValue + ";"; return SqlQuery; } FString UBPFuncLib_FHSQL::UpdateByWhereFormatSqlQuery(FString TableName, FString UpdateRowName, FString WhereName, FString WhereSymbol, FString WhereValue, FString UpdateValue) { // UPDATE TableName SET UpdateRowName=UpdateValue WHERE WhereName=WhereValue; FString SqlQuery = "UPDATE " + TableName + " SET " + UpdateRowName + "=" + UpdateValue + " WHERE " + WhereName + WhereSymbol + WhereValue + ";"; return SqlQuery; } FString UBPFuncLib_FHSQL::DeleteAllFormatSqlQuery(FString TableName) { // DELETE FROM TableName; FString SqlQuery = "DELETE FROM " + TableName + ";"; return SqlQuery; } FString UBPFuncLib_FHSQL::DeleteByWhereFormatSqlQuery(FString TableName, FString WhereName, FString WhereSymbol, FString WhereValue) { // DELETE FROM TableName WHERE WhereName=‘WhereValue’; FString SqlQuery = "DELETE FROM " + TableName + " WHERE " + WhereName + WhereSymbol + "'" + WhereValue + "';"; return SqlQuery; } bool UBPFuncLib_FHSQL::SelectOnTableData(UFH_ConnectionObject* ConnectionObject, FString SqlQuery, FQueryResultRows &ResultRows) { MYSQL_RES *m_Res = nullptr; MYSQL_ROW m_Column; TArray<FString> m_ColumnNames; FQueryResultRows m_Rows; const std::string m_SqlQuery(TCHAR_TO_UTF8(*SqlQuery)); if (!ConnectionObject){return false;} if (!ConnectionObject->Fh_ConnMysql){return false;} if (!mysql_query(ConnectionObject->Fh_ConnMysql, m_SqlQuery.c_str())) { ResultRows = {}; m_Res = mysql_store_result(ConnectionObject->Fh_ConnMysql); const int m_Columns = mysql_num_fields(m_Res); while ((m_Column = mysql_fetch_row(m_Res)) != nullptr) { FQueryResultRow m_Row; for (int i = 0; i < m_Columns; ++i) { m_Row.RowValue.Add(UTF8_TO_TCHAR(m_Column[i])); } ResultRows.RowsValue.Add(m_Row); } } mysql_free_result(m_Res); return true; } FString UBPFuncLib_FHSQL::SelectAllFormatSqlQuery(FString TableName) { // SELECT * FROM TableName; FString SqlQuery = "SELECT * FROM " + TableName + ";"; return SqlQuery; } FString UBPFuncLib_FHSQL::SelectByColumnsFormatSqlQuery(FString TableName, FString Columns) { // SELECT Columns1, Columns2, Country FROM TableName; FString SqlQuery = "SELECT " + Columns + " FROM " + TableName + ";"; return SqlQuery; } FQueryResultRow UBPFuncLib_FHSQL::GetRowByIndex(const FQueryResultRows &ResultRows, int32 RowIndex) { const FQueryResultRow m_Row = ResultRows.RowsValue[RowIndex]; return m_Row; }
7. Kompilieren Sie das Projekt
- Kompilieren Sie das Projekt in
Rider
- Die Kompilierung ist abgeschlossen und kann direkt gestartet werden in
Rider
运行
UE4项目
8. Verpackungs-Plug-ins
8.1 Richten Sie vor dem Packen Kompilierungstools ein
-
Voraussetzung: Wenn es installiert ist
Visual Studio 2017
müssen Sie diesen Schritt möglicherweise nicht ausführen, fahren Sie direkt mit dem nächsten Schritt fort -
Verpackung wird angezeigt
RunUAT
Fehlermeldung, bitte fahren Sie mit diesem Schritt erneut fort -
Bei Verwendung von
Visual Studio 2019
oderVisual Studio 2022
oder einer anderen Version -
Datei suchen
RunUAT.bat
, mit记事本
öffnen oder bearbeiten -
Speicherort
UE4引擎的安装目录\UE_4.27\Engine\Build\BatchFiles
-
编辑 -> 查找
,%UATExecutable%
-
%UATExecutable% %* %UATCompileArg%
verwandeln sich in%UATExecutable% %* -VS2019=true %UATCompileArg%
-
我用的是 VS2022,修改成2022好像不行
, aber ändern Sie es in2019
und Sie können es normal verpacken
8.2 Verpacken des MySQL-Plug-Ins
- 找到
Edit
或Settings
- Wählen Sie
plugins
Plug-in-Schnittstelle aufrufen - Plugin finden
FH_MySQL
- Optionaler Schritt
Edit
: Bearbeiten Sie die relevanten Informationen des Plug-ins, einschließlich des Plug-in-Symbols - Klicken Sie
Package(打包)
, um das Verpackungsverzeichnis auszuwählen自定义
- Warten Sie einfach, bis die Verpackung abgeschlossen ist
- Die Umgebungsverpackung auf meinem eigenen Computer enthält keine
Warning
undError
, daher gibt es theoretisch kein Problem mit der Verpackung (beim Schreiben dieses Plug-ins). -in Ich bin auf viele Probleme gestoßen, aber mithilfe der von mir bereitgestellten Umgebungsbibliotheksdateien und Konfigurationsschritte wurden die Probleme nach und nach gelöst)
Wenn eine Fehlermeldung angezeigt wird, fahren Sie bitte mit diesem Schritt fort.
-
Bei Verwendung von
Visual Studio 2019
oderVisual Studio 2022
oder einer anderen Version -
Datei suchen
RunUAT.bat
, mit记事本
öffnen oder bearbeiten -
Speicherort
UE4引擎的安装目录\UE_4.27\Engine\Build\BatchFiles
-
编辑 -> 查找
,%UATExecutable%
-
%UATExecutable% %* %UATCompileArg%
verwandeln sich in%UATExecutable% %* -VS2019=true %UATCompileArg%
-
我用的是 VS2022,修改成2022好像不行
, aber ändern Sie es in2019
und Sie können es normal verpacken
8.2 Verpacken des MySQL-Plug-Ins
- 找到
Edit
或Settings
- Wählen Sie
plugins
Plug-in-Schnittstelle aufrufen - Plugin finden
FH_MySQL
- Optionaler Schritt
Edit
: Bearbeiten Sie die relevanten Informationen des Plug-ins, einschließlich des Plug-in-Symbols - Klicken Sie
Package(打包)
, um das Verpackungsverzeichnis auszuwählen自定义
- Warten Sie einfach, bis die Verpackung abgeschlossen ist
- Die Umgebungsverpackung auf meinem eigenen Computer enthält keine
Warning
undError
, daher gibt es theoretisch kein Problem mit der Verpackung (beim Schreiben dieses Plug-ins). -in Ich bin auf viele Probleme gestoßen, aber mithilfe der von mir bereitgestellten Umgebungsbibliotheksdateien und Konfigurationsschritte wurden die Probleme nach und nach gelöst)