Entwicklung von MySQL-Plugins

Entwicklung des UE4 MySQL-Plug-Ins

1. Projekteinführung

  • PersonUrealEngine MySQL PluginEröffnungsvorgang
  • Maßnahmen UnrealEngineElemente 链接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
  1. Standardauswahl游戏项目
  2. Standardauswahl空项目
  3. KonstruktionC++项目, Inklusion初学者内容包
  4. Wählen Sie das Verzeichnis aus, in dem das Projekt erstellt wird
  5. Projektnamen erstellenFH_TestMySQL
4.2 Neues Plug-in erstellen
  1. 找到EditSettings
  2. Wählen SiepluginsPlug-in-Schnittstelle aufrufen
  3. wählenNew Plugin
  4. wählenBlank
  5. Plugin-Namen festlegenFH_MySQL
  6. Descriptor DataGeben Sie ein, was Sie möchten
  7. Create Plugin
4.3 Erstellen Sie eine MySQL C++-Klasse
4.3.1 FH_ConnectionObject
  1. ErstellenObjectC++-Klasse, KlassennameFH_ConnectionObject
  2. Auswählen, um zum Plugin-Verzeichnis hinzuzufügenFH_MySQL(Runtime), Standardpublic .h,private .cpp
  3. Create Class
  4. Es öffnet sich ein FensterMessage, der Inhalt ist ungefähr 创建成功,但需要重新编译, wählen Sie ausNo
4.3.2 BPFuncLib_FHSQL
  1. ErstellenBlueprint Function LibraryC++-Klasse, KlassennameBPFuncLib_FHSQL
  2. Die restlichen Schritte sind die gleichen wie oben

5. Projektkonfiguration

5.1 Einführung in die MySQL-Umgebungsbibliothek
5.1.1 Umgebungsbibliothek importieren
  1. bereit machenConnectorLibs
  2. Gehe zumFH_TestMySQL\Plugins\FH_MySQL\SourceVerzeichnis
  3. Erstellen Sie ein VerzeichnisThirdParty
  4. allgemein ConnectorLibsVeröffentlichung ThirdPartyin
5.1.2 Projekteigenschaften konfigurieren
  1. RiderÖffnen Sie das erstellte UE4 C++-Projekt
  2. Suchen Sie den ProjektnamenFH_TestMySQL in der Ressourcenleiste im Verzeichnis Games
  3. Klicken Sie mit der rechten Maustaste und wählen Sie ausProperties
  4. Auswählen innerhalb von ConfigurationsDevelopment_Editor | x64
  5. wählenVC++目录
  6. Geben Sie den absoluten Pfad ein包含目录(include)项目文件路径\FH_TestMySQL\Plugins\FH_MySQL\Source\ThirdParty\ConnectorLibs\include
  7. Geben Sie den absoluten Pfad ein库目录(lib)项目文件路径\FH_TestMySQL\Plugins\FH_MySQL\Source\ThirdParty\ConnectorLibs\lib
  8. OK
5.1.3 Projektdateien konfigurieren
  1. ReparaturFH_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"]
    		}
    	]
    }
    
  2. ÜberarbeitetFH_MySQL.Build.cs, Satzposition项目文件路径\FH_TestMySQL\Plugins\FH_MySQL\Source\FH_MySQL, überarbeiteter Inhalt

    PublicDependencyModuleNames.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 inRider
  • Die Kompilierung ist abgeschlossen und kann direkt gestartet werden inRider运行UE4项目

8. Verpackungs-Plug-ins

8.1 Richten Sie vor dem Packen Kompilierungstools ein
  • Voraussetzung: Wenn es installiert istVisual 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 oder Visual Studio 2022 oder einer anderen Version

  • Datei suchenRunUAT.bat, mit记事本 öffnen oder bearbeiten

  • SpeicherortUE4引擎的安装目录\UE_4.27\Engine\Build\BatchFiles

  • 编辑 -> 查找%UATExecutable%

  • %UATExecutable% %* %UATCompileArg%verwandeln sich in%UATExecutable% %* -VS2019=true %UATCompileArg%

  • 我用的是 VS2022,修改成2022好像不行, aber ändern Sie es in 2019 und Sie können es normal verpacken

8.2 Verpacken des MySQL-Plug-Ins
  1. 找到EditSettings
  2. Wählen SiepluginsPlug-in-Schnittstelle aufrufen
  3. Plugin findenFH_MySQL
  4. Optionaler SchrittEdit: Bearbeiten Sie die relevanten Informationen des Plug-ins, einschließlich des Plug-in-Symbols
  5. Klicken SiePackage(打包), um das Verpackungsverzeichnis auszuwählen自定义
  6. Warten Sie einfach, bis die Verpackung abgeschlossen ist
  7. Die Umgebungsverpackung auf meinem eigenen Computer enthält keine Warning und Error, 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 oder Visual Studio 2022 oder einer anderen Version

  • Datei suchenRunUAT.bat, mit记事本 öffnen oder bearbeiten

  • SpeicherortUE4引擎的安装目录\UE_4.27\Engine\Build\BatchFiles

  • 编辑 -> 查找%UATExecutable%

  • %UATExecutable% %* %UATCompileArg%verwandeln sich in%UATExecutable% %* -VS2019=true %UATCompileArg%

  • 我用的是 VS2022,修改成2022好像不行, aber ändern Sie es in 2019 und Sie können es normal verpacken

8.2 Verpacken des MySQL-Plug-Ins
  1. 找到EditSettings
  2. Wählen SiepluginsPlug-in-Schnittstelle aufrufen
  3. Plugin findenFH_MySQL
  4. Optionaler SchrittEdit: Bearbeiten Sie die relevanten Informationen des Plug-ins, einschließlich des Plug-in-Symbols
  5. Klicken SiePackage(打包), um das Verpackungsverzeichnis auszuwählen自定义
  6. Warten Sie einfach, bis die Verpackung abgeschlossen ist
  7. Die Umgebungsverpackung auf meinem eigenen Computer enthält keine Warning und Error, 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)

Guess you like

Origin blog.csdn.net/weixin_44519692/article/details/127794987