はじめに
この記事は「Unity #3 Advent Calendar 2019」の 12/9 の記事です
「Unity YAML Parser」を Python で使用することで
Unity の .asset や .prefab、.unity などのファイルを編集できます
目次
検証環境
- Unity 2018.4.8f1
- Python 3.7
インストール方法
Unity YAML Parser のドキュメントには
pip install でインストールするように記載されていますが、
pip install だと古い Unity YAML Parser がインストールされてしまい、
一部の API が使用できません
https://github.com/socialpoint-labs/unity-yaml-parser
そのため、上記ページの「Clone or download > Download ZIP」を押して
ダウンロードした「unity-yaml-parser-master.zip」を展開して
展開したフォルダ内の「unityparser」フォルダを
Python ファイルから参照する必要があります
ProjectSettings.asset の編集方法
# Unity YAML Parser をインポートする from unityparser import UnityDocument # 編集するファイルのパス path = '【Unity Project のパス】/ProjectSettings/ProjectSettings.asset' # ファイルを読み込む doc = UnityDocument.load_yaml( path ) # ProjectSettings.asset から ProjectSettings の情報を読み込む ProjectSettings = doc.entry # パラメータを参照する print( ProjectSettings.companyName ) print( ProjectSettings.productName ) # 構造型のパラメータを参照する color = ProjectSettings.m_SplashScreenBackgroundColor print( color[ 'r' ] ) print( color[ 'g' ] ) print( color[ 'b' ] ) print( color[ 'a' ] ) uvs = ProjectSettings.m_SplashScreenBackgroundLandscapeUvs print( uvs[ 'serializedVersion' ] ) print( uvs[ 'x' ] ) print( uvs[ 'y' ] ) print( uvs[ 'width' ] ) print( uvs[ 'height' ] ) # 配列のパラメータを参照する banner = ProjectSettings.m_AndroidBanners[ 0 ] print( banner[ 'width' ] ) print( banner[ 'height' ] ) # 入れ子のパラメータを参照する cardboard = ProjectSettings.vrSettings[ 'cardboard' ] print( cardboard[ 'depthFormat' ] ) print( cardboard[ 'enableTransitionView' ] ) # パラメータを変更する ProjectSettings.companyName = 'pika' ProjectSettings.productName = 'chu' # ファイルを保存する doc.dump_yaml()
ソースコード解説
読み込み
# Unity YAML Parser をインポートする from unityparser import UnityDocument # 編集するファイルのパス path = '【Unity Project のパス】/ProjectSettings/ProjectSettings.asset' # ファイルを読み込む doc = UnityDocument.load_yaml( path ) # ProjectSettings.asset から ProjectSettings の情報を読み込む ProjectSettings = doc.entry
まずは、上記のようなコードで
ProjectSettings.asset から ProjectSettings の情報を読み込みます
読み込んだデータは ProjectSettings 変数を介して参照できます
基本的なパラメータの参照
上記のような基本的なパラメータは
print( ProjectSettings.companyName ) print( ProjectSettings.productName )
このような記述で参照できます
構造型のパラメータの参照
上記のような構造型のパラメータは
color = ProjectSettings.m_SplashScreenBackgroundColor print( color[ 'r' ] ) print( color[ 'g' ] ) print( color[ 'b' ] ) print( color[ 'a' ] )
このような記述で参照できます
配列のパラメータの参照
上記のような配列のパラメータ(先頭にハイフンが付いている)は
banner = ProjectSettings.m_AndroidBanners[ 0 ] print( banner[ 'width' ] ) print( banner[ 'height' ] )
このような記述で参照できます
入れ子のパラメータの参照
上記のような入れ子のパラメータは
cardboard = ProjectSettings.vrSettings[ 'cardboard' ] print( cardboard[ 'depthFormat' ] ) print( cardboard[ 'enableTransitionView' ] )
このような記述で参照できます
保存
# パラメータを変更する ProjectSettings.companyName = 'pika' ProjectSettings.productName = 'chu' # ファイルを保存する doc.dump_yaml()
パラメータを変更したい場合は値を代入した後に
UnityDocument.dump_yaml
を呼び出します
以上のような手順で ProjectSettings.asset の編集が可能です
同様の手順で
- AudioManager.asset
- EditorBuildSettings.asset
- EditorSettings.asset
- GraphicsSettings.asset
- InputManager.asset
- TagManager.asset
などの .asset も編集できます
.prefab の編集方法
]
例えば、上記のように Transform と Example コンポーネントだけを持つ
プレハブを編集したい場合は下記のようなスクリプトを作成します
# Unity YAML Parser をインポートする from unityparser import UnityDocument # 編集するファイルのパス path = '【Unity Project のパス】/Assets/Hoge.prefab' # ファイルを読み込む doc = UnityDocument.load_yaml( path ) # Hoge.prefab から Transform の情報を読み込む transform = doc.get( class_name='Transform' ) # localPosition を参照する localPosition = transform.m_LocalPosition print( localPosition[ 'x' ] ) print( localPosition[ 'y' ] ) print( localPosition[ 'z' ] ) # localPosition を変更する localPosition[ 'x' ] = '1' localPosition[ 'y' ] = '2' localPosition[ 'z' ] = '3' # Hoge.prefab からすべての MonoBehaviour の情報を読み込む examples = doc.filter( class_names=( 'MonoBehaviour', ) ) # すべての MonoBehaviour の情報の中から for example in examples: # Example コンポーネントを探し出し(guid で判定) if example.m_Script[ 'guid' ] == '【Example コンポーネントの GUID】': # Example コンポーネントが見つかったらパラメータを参照する print( example.m_width ) print( example.m_height ) # パラメータを変更する example.m_width = '12' example.m_height = '34' # ファイルを保存する doc.dump_yaml()
読み込み
# Unity YAML Parser をインポートする from unityparser import UnityDocument # 編集するファイルのパス path = '【Unity Project のパス】/Assets/Hoge.prefab' # ファイルを読み込む doc = UnityDocument.load_yaml( path )
まずは、上記のようなコードで指定したプレハブの情報を読み込みます
読み込んだデータは doc 変数を介して参照できます
コンポーネントの検索
ProjectSettings.asset などのアセットファイルと違って
プレハブには GameObject 自体のデータや
Transform や MonoBehaviour のようなコンポーネントのデータなど
複数の情報が格納されているので
# Hoge.prefab から Transform の情報を読み込む transform = doc.get( class_name='Transform' )
get メソッドや、後述する filter メソッドを使用して、
どの情報を取得するのかを指定する必要があります
コンポーネントの編集
編集したいコンポーネントの情報を取得できたら
# localPosition を参照する localPosition = transform.m_LocalPosition print( localPosition[ 'x' ] ) print( localPosition[ 'y' ] ) print( localPosition[ 'z' ] ) # localPosition を変更する localPosition[ 'x' ] = '1' localPosition[ 'y' ] = '2' localPosition[ 'z' ] = '3'
あとは前述した ProjectSettings.asset と同様の方法でパラメータを編集できます
MonoBehaviour を継承したコンポーネントの取得
MonoBehaviour を継承した自作のコンポーネントを編集したい場合は
# Hoge.prefab からすべての MonoBehaviour の情報を読み込む examples = doc.filter( class_names=( 'MonoBehaviour', ) )
まずは filter メソッドですべての MonoBehaviour の情報を取得して
# すべての MonoBehaviour の情報の中から for example in examples: # Example コンポーネントを探し出し(guid で判定) if example.m_Script[ 'guid' ] == '【Example コンポーネントの GUID】':
GUID による判定で自作のコンポーネントかどうかを確認します
# Example コンポーネントが見つかったらパラメータを参照する print( example.m_width ) print( example.m_height ) # パラメータを変更する example.m_width = '12' example.m_height = '34'
自作のコンポーネントが見つかったら
あとは前述した ProjectSettings.asset と同様の方法でパラメータを編集できます
# ファイルを保存する
doc.dump_yaml()
変更を保存したい時は UnityDocument.dump_yaml
を呼び出します
同様の手順でシーンファイル(.unity)も編集が可能です
まとめ
以上が Unity YAML Parser を Python で使用して
Unity の .asset や .prefab、.unity などのファイルを編集する
基本的な方法になります
上手に使えば Unity エディタ外からアセットの編集が行えるため
興味がある方はぜひ使ってみていただければと思います