Chapter 43

◽ CSV を出力

ポコ太郎
ポコ太郎
2022.01.11に更新

BP から CSV を出力する方法

結論から言えばブループリントに CSV 出力機能は標準では公開されていないようです。
しかし以下の方法で可能な模様です。

  1. C++ の関数を BP に公開して利用
  2. 「Victory Plugin」を導入する
  3. Python を利用する
    ① py ファイルを 📘 Execute Python Command で実行
    ② 文字列を 📘 Execute Python Script でPythonコードとして実行

以下に順にご紹介します。

1. C++ の関数を BP に公開して利用

こちらの記事の最後のおまけ部分で解説されています。

https://qiita.com/EGJ-Kaz_Okada/items/ab5b21b6c5ad861d4987

EditorScripiting機能を使って各情報を収集・計測し結果をCSV出力したいケースがあるかと思います。その際は FFileHelper::SaveStringToFile 関数やSaveStringArrayToFile関数を活用しましょう!この関数にカンマ区切りの文字列を渡すことでCSVを出力する事が可能です。

ファイル保存/読み込み関連

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Core/Misc/FFileHelper/SaveStringToFile/
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Core/Misc/FFileHelper/LoadFileToString/

2.「Victory Plugin」を導入する

こちらの導入でランタイムでさえも CSV の入出力が可能になるようです。

https://orenda.co.jp/blog/1944/

オープンソースソフトウェア(MIT License )とのこと。
筆者は試していません。

BP から Text 出力

https://htsuda.net/archives/1815
こちらも 「Victory Plugin」の「SaveStringTextToFile」関数を利用するようです。

3. Python を利用する

最後は Python を利用する方法ですが、Python 開発環境を自前で入れる必要はありません。
Python を扱える方はこちらを参考に Python プラグインを導入してください。

具体的な方法はこちらの記事をご覧いただきたいのですが‥

https://kinnaji.com/2019/12/16/pythoncsvoutput/

上記の記事は「📘 Execute Python Command」関数による py ファイルの実行と「📘 Execute Python Script」関数によるコード実行を併用している事例になります。

そして本項では py ファイルは利用せず BP のみで行う方法を解説します。

まずは実際に試してみましょう。
Editor Utility Widget』でも『Editor Utility Blueprint』でも良いので作成して中を開き「📘 Execute Python Script」関数を作成します。

📘 Execute Python Script は文字列情報を Python コードとして認識して実行してくれる関数で、バラバラの文字列情報を繋ぎ合わせて実行できるため大変便利です。

最初から「Hello World!」をログに出力するコードが書かれていて、正常に動作しています。

この関数の凄いところが、断片的な文字列を結合してもちゃんと動作する点です。

📘 Execute Python Script だけで実行する際の注意点

色々とハマったのでメモしておきます。

まず下記のコードを記述して実行します(直接実行するので関数作成を省いています)。

import os

f = open("C:\Test", "w")
f.write("A,B\n1,2")
f.close()

すると‥私の環境ではカンマ区切りの文字列を書き込んだ際、自動的に CSV の拡張子が付いてくれませんでした。※UE4.27 と UE5 EA どちらも同様

また私の環境下の UE4.27 ではパスの指定箇所でのバックスラッシュが悪さをしてエラーが出ました。なのでこちらのように「r」をダブルクォーテーションの手前に記述すると良さそうです。

import os

f = open(r"D:\Test.csv", "w")
f.write("A,B\n1,2")
f.close()

これで無事に出力されました。

CSV を開くとこちらのように正常に書き込まれています。

これで、アセットのプロパティを列挙して CSV で出力するといったことも BP( + Pythonコード)で可能ですね。とても便利です。

パス上のフォルダが存在しない場合の対応

先ほどの記事を参考にした下記コードで UE4.27 / UE5 EA ともに問題無く動作しました。

import os

try: 
    os.makedirs(r"D:\Test")
except:
    pass

f = open(r"D:\Test\Test.csv", "w")
f.write("A,B\n1,2")
f.close()