こんにちは、Unityエンジニアのオオバです。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
最初に結論
- パラメータが外出しされていないときはmetaを確認
- metaの値はSerializedObjectから値を変更できる
- 未提供APIで詰まってもSerializedObjectでなんとかなる時がある
TextureImporterでSpritePivotの変更は不可
Pivotの値はスクリプトから変更できません。
それらしいAPIを見つけることはできませんでした。
こういうスクリプトから変更できないパラメータを、
スクリプトから変更するテクニックの紹介です。
metaを確認する
画像ファイルと同階層にmetaファイルが作られ、
metaファイル内にインポート設定が書き込まれます。
PivotをCenterとCustomで切り替えた際に、
変更が入る箇所を確認します。
■Pivot : Center
■Pivot : Custom
どうやらalignment
を9にすると、
PivotはCustomになることが分かりました。
SerializedObjectからパラメータ名を確認
注意点としてmetaファイル内の名前が、
アクセス可能なパラメータ名ではないことです。
アクセス可能なパラメータ名を、
SerailziedObject化したTextureImporterで確認します。
var importer = assetImporter as TextureImporter;
var so = new SerializedObject(importer);
var i = so.GetIterator();
i.NextVisible(true);
string log = "";
while (i.NextVisible(false)) log += $"{iter.name}\n";
// 結果を出力
Debug.Log(log);
↑のようなコードでSerializedObjectの全パラメータを出力します。
※アセットインポート処理にしたいため、OnPostprocessTextureメソッド内に記述している前提のコードです
参照パラメータ名は「m_Alignment」でした。
スクリプトでパラメータを書き換える
var importer = assetImporter as TextureImporter;
var so = new SerializedObject(importer);
var prop = so.FindProperty("m_Alignment");
prop.intValue = 9;
// 値の反映
so.ApplyModifiedProperties();
参照パラメータ名がわかったら、
値をスクリプトから書き換えます。
ApplyModifiedProperties()
を書き忘れると、
値は更新されないので注意です。
これでスクリプトから通常アクセス不可のPivotの値を変更できるようになりました。
まとめ
今回はスクリプトからアクセス不可のSpriteのPivotをスクリプトから変更してみました。
手順はとてもかんたんでした。
- metaファイルで該当パラメータを確認
- SerializedObjectで参照パラメータ名を確認
- SerializedObjectに直接パラメータをセット
提供されていないパラメータをスクリプトからなんとかしたい場合に使えるため、
今回のSprite Pivot以外でも活用できるテクニックです。
最後に今回のサンプルコードをアップしておきますので興味ある方はどうぞ。
using UnityEditor;
using UnityEngine;
/// <summary>
/// Sprite PivotをCustomに設定するサンプルコード
/// </summary>
public class CustomPivot : AssetPostprocessor
{
private void OnPostprocessTexture(Texture2D target)
{
var importer = assetImporter as TextureImporter;
if (importer == null) return;
importer.textureType = TextureImporterType.Sprite;
var so = new SerializedObject(importer);
// note : コメントを外すと全パラメータがログ出力されます
// PrintAllParameter(so);
var prop = so.FindProperty("m_Alignment");
// set Pivot Custom
prop.intValue = 9;
so.ApplyModifiedProperties();
}
private static void PrintAllParameter(SerializedObject so)
{
var i = so.GetIterator();
i.NextVisible(true);
string log = "";
while (i.NextVisible(false)) log += $"{i.name}\n";
Debug.Log(log);
}
}
この記事が気に入ったらフォローしよう
- Unity2021.1.16f1