コガネブログ

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

【Unity】Tilemap オブジェクトが選択されたら Tile Palette の矩形ツールを選択状態にするエディタ拡張

ソースコード

using System;
using System.Reflection;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine.Tilemaps;

public static class GridPaintPaletteWindowUtils
{
    private const BindingFlags BINDING_ATTR = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic;

    private static readonly Assembly   m_assembly         = typeof( AssetDatabase ).Assembly;
    private static readonly Type       m_type             = m_assembly.GetType( "UnityEditor.GridPaintPaletteWindow" );
    private static readonly MethodInfo m_gridSelectKey    = m_type.GetMethod( "GridSelectKey", BINDING_ATTR );
    private static readonly MethodInfo m_gridMoveKey      = m_type.GetMethod( "GridMoveKey", BINDING_ATTR );
    private static readonly MethodInfo m_gridBrushKey     = m_type.GetMethod( "GridBrushKey", BINDING_ATTR );
    private static readonly MethodInfo m_gridRectangleKey = m_type.GetMethod( "GridRectangleKey", BINDING_ATTR );
    private static readonly MethodInfo m_gridPickerKey    = m_type.GetMethod( "GridPickerKey", BINDING_ATTR );
    private static readonly MethodInfo m_gridEraseKey     = m_type.GetMethod( "GridEraseKey", BINDING_ATTR );
    private static readonly MethodInfo m_gridFillKey      = m_type.GetMethod( "GridFillKey", BINDING_ATTR );

    public static void GridSelectKey()    => m_gridSelectKey.Invoke( null, new object[0] );
    public static void GridMoveKey()      => m_gridMoveKey.Invoke( null, new object[0] );
    public static void GridBrushKey()     => m_gridBrushKey.Invoke( null, new object[0] );
    public static void GridRectangleKey() => m_gridRectangleKey.Invoke( null, new object[0] );
    public static void GridPickerKey()    => m_gridPickerKey.Invoke( null, new object[0] );
    public static void GridEraseKey()     => m_gridEraseKey.Invoke( null, new object[0] );
    public static void GridFillKey()      => m_gridFillKey.Invoke( null, new object[0] );
}

[InitializeOnLoad]
public static class Example
{
    static Example()
    {
        Selection.selectionChanged += SelectionChanged;
    }

    private static void SelectionChanged()
    {
        var gameObject = Selection.activeGameObject;

        if ( gameObject == null ) return;

        var tilemap   = gameObject.GetComponent<Tilemap>();
        var isTilemap = tilemap != null;

        if ( !isTilemap ) return;
        if ( EditMode.editMode == EditMode.SceneViewEditMode.GridBox ) return;

        GridPaintPaletteWindowUtils.GridRectangleKey();
    }
}

使用例

f:id:baba_s:20190928163052g:plain