コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Python で .asset や .prefab、.unity などのファイルを編集する方法

はじめに

この記事は「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 変数を介して参照できます

基本的なパラメータの参照

f:id:baba_s:20191123231347p:plain

上記のような基本的なパラメータは

print( ProjectSettings.companyName )
print( ProjectSettings.productName )

このような記述で参照できます

構造型のパラメータの参照

f:id:baba_s:20191123231526p:plain

f:id:baba_s:20191123231528p:plain

上記のような構造型のパラメータは

color = ProjectSettings.m_SplashScreenBackgroundColor
print( color[ 'r' ] )
print( color[ 'g' ] )
print( color[ 'b' ] )
print( color[ 'a' ] )

このような記述で参照できます

配列のパラメータの参照

f:id:baba_s:20191123231553p:plain

上記のような配列のパラメータ(先頭にハイフンが付いている)は

banner = ProjectSettings.m_AndroidBanners[ 0 ]
print( banner[ 'width' ] )
print( banner[ 'height' ] )

このような記述で参照できます

入れ子のパラメータの参照

f:id:baba_s:20191123231732p:plain

上記のような入れ子のパラメータは

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 の編集方法

f:id:baba_s:20191124104418p:plain]

例えば、上記のように 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 変数を介して参照できます

コンポーネントの検索

f:id:baba_s:20191124105129p:plain

ProjectSettings.asset などのアセットファイルと違って
プレハブには GameObject 自体のデータや
Transform や MonoBehaviour のようなコンポーネントのデータなど
複数の情報が格納されているので

# Hoge.prefab から Transform の情報を読み込む
transform = doc.get( class_name='Transform' )

get メソッドや、後述する filter メソッドを使用して、
どの情報を取得するのかを指定する必要があります

コンポーネントの編集

編集したいコンポーネントの情報を取得できたら

f:id:baba_s:20191124105505p:plain

# 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 を継承したコンポーネントの取得

f:id:baba_s:20191124105701p:plain

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 エディタ外からアセットの編集が行えるため
興味がある方はぜひ使ってみていただければと思います