こんにちは、Unityエンジニアのオオバです。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

最初に結論

TextureImporterでSpritePivotの変更は不可

【Unity】SpritePivotをスクリプトからCustomにする方法_0

Pivotの値はスクリプトから変更できません。
それらしいAPIを見つけることはできませんでした。

こういうスクリプトから変更できないパラメータを、
スクリプトから変更するテクニックの紹介です。

metaを確認する

画像ファイルと同階層にmetaファイルが作られ、
metaファイル内にインポート設定が書き込まれます。

PivotをCenterとCustomで切り替えた際に、
変更が入る箇所を確認します。

■Pivot : Center

【Unity】SpritePivotをスクリプトからCustomにする方法_1

■Pivot : Custom

【Unity】SpritePivotをスクリプトからCustomにする方法_2

どうやら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メソッド内に記述している前提のコードです

【Unity】SpritePivotをスクリプトからCustomにする方法_3

参照パラメータ名は「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をスクリプトから変更してみました。

手順はとてもかんたんでした。

  1. metaファイルで該当パラメータを確認
  2. SerializedObjectで参照パラメータ名を確認
  3. 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);  
    }
}
オススメ記事
検証環境