コガネブログ

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

【Unity】【uGUI】SpriteAtlas がインポートされた時に Tight Packing をオフにするエディタ拡張

この記事における Unity のバージョン

  • Unity 2017.1.1f1
  • Unity 2018.3.9f1

はじめに

f:id:baba_s:20170915105306p:plain

SpriteAtlas がインポートされたら自動で Tight Packing をオフにしようと思って
いろいろ調べていたのですが、どうも現在の Unity のバージョンでは
SpriteAtlas 用のインポータークラスが存在しないみたいだったので
SerializedObject を使用して自作しました

ソースコード

Unity 2018 版

using System.Linq;
using UnityEditor;
using UnityEngine.U2D;

/// <summary>
/// SpriteAtlas の設定を自動で変更するクラス
/// </summary>
public sealed class SpriteAtlasPostprocessor : AssetPostprocessor
{
    //==============================================================================
    // 関数
    //==============================================================================
    /// <summary>
    /// SpriteAtlas がインポートされた時に呼び出されます
    /// </summary>
    private static void OnPostprocessAllAssets
    (
        string[] importedAssets ,
        string[] deletedAssets  ,
        string[] movedAssets    ,
        string[] movedFromPath
    )
    {
        var list = importedAssets
            .Where( c => c.EndsWith( ".spriteatlas" ) )
            .ToArray()
        ;

        if ( list == null || list.Length <= 0 ) return;

        for ( int i = 0; i < list.Length; i++ )
        {
            var path    = list[ i ];
            var atlas   = AssetDatabase.LoadAssetAtPath<SpriteAtlas>( path );
            var so      = new SerializedObject( atlas );
            var p       = so
                .FindProperty( "m_EditorData" )
                .FindPropertyRelative( "packingSettings" )
                .FindPropertyRelative( "enableTightPacking" )
            ;
            p.boolValue = false;
            so.ApplyModifiedProperties();
        }
    }
}

Unity 2017 版

using System.Linq;
using UnityEditor;
using UnityEngine.U2D;

public sealed class SpriteAtlasPostprocessor : AssetPostprocessor
{
    private static void OnPostprocessAllAssets 
    (
        string[] importedAssets , 
        string[] deletedAssets  , 
        string[] movedAssets    , 
        string[] movedFromPath
    )
    {
        var list = importedAssets
            .Where( c => c.EndsWith( ".spriteatlas" ) )
            .ToArray()
        ;
        
        for ( int i = 0; i < list.Length; i++ )
        {
            var path    = list[ i ];
            var atlas   = AssetDatabase.LoadAssetAtPath<SpriteAtlas>( path );
            var so      = new SerializedObject( atlas );
            var p       = so
                .FindProperty( "m_EditorData" )
                .FindPropertyRelative( "packingParameters" )
                .FindPropertyRelative( "enableTightPacking" )
            ;
            p.boolValue = false;
            so.ApplyModifiedProperties();
        }
    }
}

関連記事