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; } } }