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 에 접근하여 데이터를 처리할 수 있게 됐다는 것에 감사하네요.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *