public override void Erase(GridLayout gridLayout, GameObject brushTarget, Vector3Int position)
        {
            // パレット上の処理はベースクラスに任せる
            if (ExPrefabBrush.IsPalette(brushTarget))
            {
                base.Erase(gridLayout, brushTarget, position);
                return;
            }

            ExBrushTarget[] ts = FindObjectsOfType <ExBrushTarget>();
            foreach (ExBrushTarget t in ts)
            {
                if (t.TilemapTarget && t.involved)
                {
                    Tilemap tilemap = t.GetComponent <Tilemap>();
                    if (tilemap != null)
                    {
                        //Debug.Log(size);
                        for (int y = 0; y < size.y; y++)
                        {
                            for (int x = 0; x < size.x; x++)
                            {
                                //base.Erase(gridLayout, brushTarget, new Vector3Int(x, y, 0));
                                tilemap.SetTile(position + new Vector3Int(-x, y, 0), null);
                            }
                        }
                    }
                }
            }
        }
        // Pickされた時に呼ばれる
        // Paintツールで非Editモート時のパレット上をクリックした時などにも呼ばれる
        public override void Pick(GridLayout gridLayout, GameObject brushTarget, BoundsInt position, Vector3Int pickStart)
        {
            base.Pick(gridLayout, brushTarget, position, pickStart);

            // パレット上ではない
            if (!ExPrefabBrush.IsPalette(brushTarget))
            {
                // メモ:cells.Lengthは0にはならない

                // Pickしたタイルが空だった場合、他のTilemapでも試行する
                if (cells[0].tile == null)
                {
                    ExBrushTarget[] ts = FindObjectsOfType <ExBrushTarget>();
                    foreach (ExBrushTarget t in ts)
                    {
                        if (t.TilemapTarget && t.involved)
                        {
                            GridLayout gl = t.GetComponentInParent <GridLayout>();
                            base.Pick(gl, t.gameObject, position, pickStart);

                            if (cells[0].tile != null)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            ExBrushEditor.UpdateActiveTilemapDropdown();
        }
        // Moveが終わったタイミングで呼ばれる
        public override void MoveEnd(GridLayout gridLayout, GameObject brushTarget, BoundsInt position)
        {
            // パレット上の処理はベースクラスに任せる
            if (ExPrefabBrush.IsPalette(brushTarget))
            {
                base.MoveEnd(gridLayout, brushTarget, position);
                return;
            }

            // 1. 複数Tilemapの移動
            MoveAllTilemapsRoutine(position, false, false);

            // 2. タイル以外の移動
            MoveGameObjectsRoutine(true, position);
        }
        // Move中にずっと呼ばれる
        public override void Move(GridLayout gridLayout, GameObject brushTarget, BoundsInt from, BoundsInt to)
        {
            // パレット上の処理はベースクラスに任せる
            if (ExPrefabBrush.IsPalette(brushTarget))
            {
                base.Move(gridLayout, brushTarget, from, to);
                return;
            }

            // 1. 複数Tilemapの移動プレビュー
            MoveAllTilemapsRoutine(to, true, false);

            // 2. タイル以外の移動
            MoveGameObjectsRoutine(true, to);
        }
        // Move開始時に呼ばれる
        public override void MoveStart(GridLayout gridLayout, GameObject brushTarget, BoundsInt position)
        {
            // パレット上の処理はベースクラスに任せる
            if (ExPrefabBrush.IsPalette(brushTarget))
            {
                base.MoveStart(gridLayout, brushTarget, position);
                return;
            }

            cellsDict = new Dictionary <ExBrushTarget, TileBase[]>();

            // 1. 複数Tilemapの移動プレビュー
            MoveAllTilemapsRoutine(position, true, true);

            // 2. タイル以外の移動の準備
            MoveGameObjectsRoutine(false, position);
        }
        // アンドゥをカスタマイズする
        public override void RegisterUndo(GameObject brushTarget, GridBrushBase.Tool tool)
        {
            // パレット上の処理はベースクラスに任せる
            if (ExPrefabBrush.IsPalette(brushTarget))
            {
                base.RegisterUndo(brushTarget, tool);
                return;
            }

            switch (tool)
            {
            // Eraseツールでは、全Tilemapを登録する(ベースクラスでは1つのTilemapしか登録されないので)
            case GridBrushBase.Tool.Erase:
            {
                ExBrushTarget[] ts = FindObjectsOfType <ExBrushTarget>();
                foreach (ExBrushTarget t in ts)
                {
                    if (t.TilemapTarget && t.involved)
                    {
                        base.RegisterUndo(t.gameObject, tool);
                    }
                }
                break;
            }

            // Moveツールでは、全TilemapだけでなくNPCやコイン等のGameObjectも登録する
            case GridBrushBase.Tool.Move:
            {
                generalBrush.MoveTargets.Clear();

                ExBrushTarget[] ts = FindObjectsOfType <ExBrushTarget>();
                foreach (ExBrushTarget t in ts)
                {
                    if (!t.involved)
                    {
                        continue;
                    }

                    if (t.TilemapTarget)
                    {
                        base.RegisterUndo(t.gameObject, tool);
                    }
                    else if (t.ObjectsTarget)
                    {
                        int c = t.transform.childCount;
                        for (int i = 0; i < c; i++)
                        {
                            Transform tr  = t.transform.GetChild(i);
                            Vector3   pos = tr.position;
                            if (generalBrush.SelectionBounds.Contains(pos))
                            {
                                // 第1引数名がbrushTargetなので不安だが、
                                // 普通のGameObjectを登録しても問題なく動く
                                base.RegisterUndo(tr.gameObject, tool);

                                generalBrush.MoveTargets.Add(tr);
                            }
                        }
                    }
                }

                break;
            }

            default:
            {
                base.RegisterUndo(brushTarget, tool);
                break;
            }
            }
        }