コガネブログ

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

【Unity】Tilemap の Tile Palette で選択されているブラシをスクリプトから変更する方法

ソースコード

using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public static class GridPaintingStateUtils
{
    private const BindingFlags BINDING_ATTR = BindingFlags.Static | BindingFlags.Public;

    private static readonly Assembly     m_assembly = typeof( AssetDatabase ).Assembly;
    private static readonly Type         m_type     = m_assembly.GetType( "UnityEditor.GridPaintingState" );
    private static readonly PropertyInfo m_info     = m_type.GetProperty( "gridBrush", BINDING_ATTR );

    public static GridBrushBase gridBrush
    {
        get => m_info.GetValue( null ) as GridBrushBase;
        set => m_info.SetValue( null, value );
    }
}

public static class GridPaletteBrushesUtils
{
    private const BindingFlags BINDING_ATTR = BindingFlags.Static | BindingFlags.Public;

    private static readonly Assembly     m_assembly = typeof( AssetDatabase ).Assembly;
    private static readonly Type         m_type     = m_assembly.GetType( "UnityEditor.GridPaletteBrushes" );
    private static readonly PropertyInfo m_property = m_type.GetProperty( "brushes", BINDING_ATTR );

    public static List<GridBrushBase> brushes => m_property.GetValue( null ) as List<GridBrushBase>;
}

使い方

using UnityEditor;

public class Example
{
    [MenuItem( "Tools/Hoge" )]
    private static void Hoge()
    {
        // 設定したいブラシを名前で検索する
        var brush = GridPaletteBrushesUtils.brushes.Find( c => c.name.Contains( "Line Brush" ) );

        GridPaintingStateUtils.gridBrush = brush;
    }
}

これで Tile Palette で選択されているブラシをスクリプトから変更できます

f:id:baba_s:20190928142000p:plain