Unreal에 SQLite 붙이기 – Plugin
개요
이전에 윈도우에서 직접 API를 호출해서 SQLite 를 연결했던 것은 에디터에서 한번 연결할 때마다 락이 걸려서 멸망했습니다.
그래서 이번에는 Plugin을 사용하는 방법을 알아보겠습니다. 물론 저번에 데이터베이스 플러그인들은 유료가 많았고, 무료로 사용할 수 있는 플러그인은 4 버전을 마지막으로 개발자가 사라져서 요원해졌다고 했는데 왜 이제와서 Plugin 이냐 라고 하신다면 오픈소스로 공개되어 있는 플러그인을 직접 수정해서 사용해보도록 하겠습니다.
그리고 여기서 제가 수정한 플러그인을 찾을 수 있습니다.
https://github.com/jineyne/UnrealSQLite3
플러그인 업데이트
일단 먼저 간단하게 UProerty 를 FProperty 로 수정해주었습니다. 알아보니 4.27 버전을 올라가면서 소스에 변경이 있었는데 반영이 안되어 있었습니다.
그리고 간단하게 Include 를 정리해주니 작동이 되었습니다.
설치
Repository를 다운로드 받으시고 Unreal Engine 프로젝트에 있는 플러그인 폴더 안에 압축을 푸시면 됩니다. (예: <ProjectRoot>\Plugins\UnrealSQLite3\) 혹은 이미 git으로 소스컨트롤을 하고 계시다면 하위 모듈로 추가하시면 됩니다.
그런 다음 Unreal Engine 프로젝트의 플러그인 설정에서 활성화 하면 됩니다.
사용법
플러그인은 액터의 Property를 채우는 것 과 같은 일들을 할 수 있지만, 가장 먼저 SQL 을 초기화해야합니다.
간단하게 highscore table 을 생성하는 예제 소스입니다.
const FString DB_NAME = "DB";
/* Connect to the database */
bool connect() {
const FString databaseFile = FPaths::ConvertRelativePathToFull(
FPaths::Combine(FPaths::ProjectSavedDir(), FString("my.db")));
if (!USQLiteDatabase::IsValidDatabase(databaseFile, false)) {
if (!USQLiteDatabase::CreateDatabase(databaseFile, false)) {
UE_LOG(LogTemp, Error, TEXT("Couldn't create database %s"), *databaseFile);
return false;
} else {
UE_LOG(LogTemp, Log, TEXT("Created database %s"), *databaseFile);
}
/* Register database, cannot be registered yet, because file did not exist. */
bool success = USQLiteDatabase::RegisterDatabase(DB_NAME, databaseFile, false, true);
if(!success) {
UE_LOG(LogTemp, Error, TEXT("Couldn't register database %s"), *databaseFile);
return false;
} else {
UE_LOG(LogTemp, Log, TEXT("Registered database %s"), *databaseFile);
}
/* Run some SQL without return value! */
success = USQLiteDatabase::ExecSql(DB_NAME, TEXT(
"CREATE TABLE Highscores IF NOT EXISTS ("
"id INTEGER PRIMARY KEY ASC,"
"score INTEGER,"
"player TEXT"
")"));
if(!success) {
UE_LOG(LogTemp, Error, TEXT("Couldn't create table"));
return false;
}
}
return true;
}
음으로는 결과를 포함하는 Query를 실행하는 방법입니다. 간단하게 플레이어 이름으로부터 최고점을 가져오는 소스입니다.
const FString playerName = "Squareys";
int64 out = -1;
TUniquePtr<SQLiteQueryResult> result = USQLiteDatabase::RunQueryAndGetResults(DB_NAME,
FString::Printf(
TEXT("SELECT score FROM Highscores WHERE player='%s'"), playerName));
if (result->Success && result->Results.Num() > 0 && result->Results[0].Fields.Num() > 0) {
out = result->Results[0].Fields[0].IntValue;
}
else {
UE_LOG(LogTemp, Error, TEXT("Could not get integer output: %s"), *(result->ErrorMessage));
}
이렇게 플러그인을 통해서 SQLite와 통신하고 필요한 테이블을 생성하며, 값을 가져와 처리하는 방법에 대하여 알아봤습니다. 비록 유로 플러그인들에 비해 아쉬운 점이 많지만 그래도 SQLite 에 접근하여 데이터를 처리할 수 있게 됐다는 것에 감사하네요.
Leave a Reply
Want to join the discussion?Feel free to contribute!