【UE】DataTableを使わずにBlueprintでCSVでデータ管理してみよう

# はじめに
こんにちは、G-Blossomエンジニアのぴーよです！

今回はUEでのCSVの取り扱い方について実践しつつご説明しようと思います。

UEでCSVを取り扱う手法は大きく2種類あります。
### 1. DataTableを作ってインポート
- 良い点
    - 非常に強力な機能でワークフローが充実している
    - 様々な型を利用できる
- 注意点
    - 複数行のヘッダーを使えない
    - キーバリュー型での取り扱いになるので、条件づけて絞り込みは工夫が必要
    - トランザクション的な運用はできない。あくまでマスタ  
### 2. CSVをテキストで読み込んでパースする
- 良い点
    - 複数行のヘッダーも読み込める
    - 特定の座標でデータを拾えるのでマッピングの自由度が高い
    - ファイルへの書き出しも可能なのでトランザクションにすることも可能（推奨するかは別）
- 注意点
    - パーサーを自前で用意しないといけない
    - 基本的にStringで取得する

今回は2の発展形で、パーサーのプラグインを使用します
Blueprint CSV Parsing
https://www.fab.com/ja/listings/1f5fc0dd-6b38-475b-8e5d-4dddae0d5852


# 今回の目標
CSVオブジェクトを作成して任意の値を取れるようになろう！

# 手順
### 1. Blueprint CSV Parsingをエンジンにインストール
前述のBlueprint CSV Parsingをご利用のUEのバージョンに対応するものをFabからダウンロードしてインストールします。
https://www.fab.com/ja/listings/1f5fc0dd-6b38-475b-8e5d-4dddae0d5852

### 2. プラグインの有効化
プロジェクトのプラグイン設定からBlueprintCSVParsingのチェックボックスをtrueにして有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/510e763c-9b15-7b24-c2b6-c06df8bafd94.png)

### 3. CSVの格納場所の作成
今回はプロジェクト直下に`InputData/CSV`のフォルダを作成します。
今回はテストデータとしてこちらを使います。右クリックで保存し、配置してください。
[test.csv](https://raw.githubusercontent.com/P-yoT/BlogAssets/refs/heads/main/datas/CSV/test.csv)
内容
~~~
,test1,test2,test3
a,1,11,111
b,2,22,222
c,3,33,333
~~~
### 4. 関数の作成
任意のBlueprintにCSV Load関数を作成します。インプットアウトプットは画像参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/6f868635-6a8f-e45f-69ab-f581635a46b8.png)


### 5. ファイルの読み込み部の作成
CSV Load関数を開き、`Text File Load to String`ノードへ接続します。
Filenameはフルパス付きのファイル名の必要があるので、`Get Project Directory`でプロジェクトのディレクトリを取得して、`InputData/CSV`内を指定しています。

引数のCSVFileNameに直接ファイル名を指定すれば良い形です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/27cd0346-31c6-0f3c-11e2-1deaa3403691.png)

### 6. CSVオブジェクトの成型
5.の続きに`Branch`ノードを繋ぎ、`True`に`Parse CSV Rows`ノードをつなぎます。CSVStringに先ほどの`Text File Load to String`で取得した`FileData`をつなぎ、`ReturnValue`を`ReturnNode`の`CSVObject`に繋ぎ、Successにチェックを入れます。
False側には直接`ReturnNode`をつなぎ、チェックが入っていないことを確認して完成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/a0a9797c-eaf6-6454-f720-7f5fa6330221.png)

### 7. 関数の呼び出し
イベントグラフのBeginPlayでテストしてみましょう。
BeginPlayから引っ張ってCSVLoadを呼ぶと、CSVFileNameに入力できるようになっています。

ここにCSVファイル名を入力するとCSVObjectが取れるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/b16767df-56d3-ed75-7e1b-b0f9e7e31dd8.png)

実際に値を見てみましょう。
CSVObjectから引っ張って適当な変数を作り、ブレークポイントを設定して実行すると画像の様になります。
行と列情報が取れていることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/2ca9372d-cb9e-d38f-291e-0d5055ecbbd0.png)

### 8. 任意の座標の取得
ここまでくれば色々な方法で値を取得できます。
CSVObjから引っ張ってgetで検索してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/f0ff7df7-d6d7-3cf9-a0a7-81f8050e43e3.png)

CSVグループの中に色々ありますね、実際に置いてあげるとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/167c627d-cbac-e3ee-e57b-9d99e200bd92.png)
どの取得方法もインデックスでも名前でも取れるようになっていますね。
個人的には良くGet Row by Keyを多用しています。条件付けする際にも何かと使えるのでオススメです

実際に繋いでみたのがこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946986/ab379f29-792d-d238-97f4-8e1f06c6f85e.png)
a行の値が取れていますね！

# 最後に
ゲームバランス等を考える際にパラメータ調整をプロジェクトから切り離したいケースなどでは気楽に扱えます。
めざせ爆速テスト環境！

# 参考資料
パッケージ化の際に役立つかも

【UE4】外部ファイルを含んだprojectをpackagingするときの注意点
 https://tyojugiga.hatenablog.com/entry/2019/10/25/113457