初めに
BuildProfileの設定をエディタスクリプトから変更する方法がわかりづらかったので共有です。
実装手順
BuildProfileアセットの読み込みとPlayerSettings取得
BuildProfileアセットを読み込み、リフレクションでPlayerSettingsを取得します。PlayerSettingsはinternalフィールドのため、リフレクションが必要です。
var profile = AssetDatabase.LoadAssetAtPath<BuildProfile>("path");
var playerSettingsField = profile.GetType().GetField("playerSettings", BindingFlags.NonPublic | BindingFlags.Instance);
var playerSettings = (UnityEngine.Object)playerSettingsField.GetValue(profile);
var serializedSettings = new SerializedObject(playerSettings);
設定値の変更
SerializedPropertyを使って、目的のプロパティを変更します。今回の場合はproductNameを変更しています。
プロパティ名はBuild Profileの設定ファイルのInspectorのCopy Property Pathから確認できます
var productNameProperty = serializedSettings.FindProperty("productName");
if (productNameProperty != null)
{
productNameProperty.stringValue = newProductName;
}
変更の適用と保存
変更をSerializedObjectに適用し、内部メソッドを呼び出してアセットを保存します。ApplyModifiedProperties()
だけでは設定が保存されないため、BuildProfileModuleUtil.SerializePlayerSettings()
の呼び出しが必要です。
https://github.com/Unity-Technologies/UnityCsReference/blob/4b463aa72c78ec7490b7f03176bd012399881768/Editor/Mono/BuildProfile/BuildProfileModuleUtil.cs#L448-L451
// メモリ上で変更を適用
serializedSettings.ApplyModifiedProperties();
// BuildProfileModuleUtil.SerializePlayerSettings()を呼び出し
var coreModuleAssembly = Assembly.Load("UnityEditor.CoreModule");
var buildProfileModuleUtilType = coreModuleAssembly.GetType("UnityEditor.Build.Profile.BuildProfileModuleUtil");
var serializePlayerSettingsMethod = buildProfileModuleUtilType.GetMethod(
"SerializePlayerSettings",
BindingFlags.Public | BindingFlags.Static
);
serializePlayerSettingsMethod.Invoke(null, new object[] { profile });
// アセットを保存
EditorUtility.SetDirty(profile);
AssetDatabase.SaveAssets();
最後に
BuildProfileは使いながら学んでいるので、もっといい方法があれば知りたいです。
AIでも探してくれなかったので、AIの糧になればなと思います。