UnityでTileMapのエディターもどきを制作しております。
JSONの文字列データからマップの生成を行っており、数値ごとにセルにスプライトを割り当ててます。
例)-1ならタイルなし、0なら0番目のスプライトを使用
PlayMode(再生ボタン)中なら問題なく動作するのですが、
再生中以外に生成してしまうとTileMapの保存情報が壊れているみたいです。
具体的にはタイルを置いていない場所に0番目ののスプライトタイルがおかれてしまいます。
再生していない際でも、正常に動作させる方法はないでしょうか。
特定のGameObject下のgameObjectを全削除するプログラムを書いているつもりなのですが、
こちらも再生中以外はうまく動作しないようです。
3~4件削除した後に処理がとまってしまいます。
JSONデータ
1"listMap": [ 2 "0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0", 3 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 4 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 5 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 6 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 7 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 8 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 9 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 10 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 11 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 12 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 13 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3", 14 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4, 4, 4, 3", 15 "2, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4, 4, 4, 3", 16 "2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3", 17 "2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3", 18 "2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3", 19 "7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7" 20 ],
CustomAddButton.cs
1 2[CustomEditor(typeof(TileMapManager))] //拡張するクラスを指定 3public class CustomAddButton : Editor { 4 5 /// <summary> 6 /// InspectorのGUIを更新 7 /// </summary> 8 public override void OnInspectorGUI(){ 9 10 //ボタンを表示 11 if (GUILayout.Button("Json Load")){ 12 // エディタが再生しているか or しようとしてるかどうか 13 if(EditorApplication.isPlayingOrWillChangePlaymode){ 14 tileMapManager.JsonLoad(); 15 Debug.Log("Json Load"); 16 } else { 17 Debug.Log("Not Play Mode"); 18 } 19 } 20 } 21 22 //ボタンを表示 23 if (GUILayout.Button("Map Delete")){ 24 // エディタが再生しているか or しようとしてるかどうか 25 if(EditorApplication.isPlayingOrWillChangePlaymode){ 26 tileMapManager.MapDelete(); 27 Debug.Log("Map Delete"); 28 } else { 29 tileMapManager.MapDelete(); 30 Debug.Log("Map Delete"); 31 Debug.Log("Not Play Mode"); 32 } 33 } 34 35}
TileMapManager
1public class TileMapManager : MonoBehaviour { 2 3 [ContextMenu("Method")] 4 private void Method () { 5 6 } 7 8 public Tilemap tilemap; 9 10 // ステージを生成する 11 public void JsonLoad() { 12 13 // タイルマップのリセット 14 ResetTileMap(tilemap); 15 16 // 保存 17 jsonStage.SetFileName(fileNameJson); 18 19 // リセット 20 jsonStage.stage.Reset(); 21 22 // 読み込み 23 jsonStage.Load(); 24 25 Sprite sprite; 26 var bound = tilemap.cellBounds; 27 Tile tile = ScriptableObject.CreateInstance<Tile>(); 28 29 // マップの生成 30 for(int y=0; y<jsonStage.stage.listMap.Count; y++){ 31 32 // マップデータ文字を分解 33 String width = jsonStage.stage.listMap[y]; 34 width = width.Replace(" ", ""); // 空白を削除 35 36 // 文字列を分解してlistに追加 37 string[] arrayWidth = width.Split(','); 38 List<int> listWidth = new List<int>(); 39 for(int i=0; i<arrayWidth.Length; i++){ 40 int num = int.Parse( arrayWidth[i] ); 41 listWidth.Add(num); 42 } 43 44 // タイルマップのセット 45 for(int x=0; x<listWidth.Count; x++){ 46 47 // -1なら次へ 48 int spriteNum = listWidth[x]; 49 if( spriteNum < 0) continue; 50 51 // タイルマップのポジションの取得 52 //int posX = bound.position.x + x + 1; 53 int posX = bound.position.x + x; 54 int posY = (bound.position.y + jsonStage.stage.listMap.Count) - y - 1; 55 //int posY = (bound.position.y + jsonStage.stage.listMap.Count) - y; 56 57 // タイルマップのセット 58 string spriteName = jsonStage.stage.listSpriteName[spriteNum]; 59 sprite = GetSprite("Sprites/test", spriteName); 60 61 tile.sprite = sprite; 62 63 // 角度の設定 64 Quaternion rot = Quaternion.Euler(0.0f, 0.0f, 0.0f); 65 66 // 右上タイル反転 67 if(spriteName == CORNER_1_SPRITE_NAME){ 68 if(cornerCount1 == CORNER_1_FLIP){ 69 rot = Quaternion.Euler(0.0f, 180.0f, 0.0f); 70 } 71 cornerCount1++; 72 } 73 74 // 左下タイル反転 75 if(spriteName == CORNER_2_SPRITE_NAME){ 76 if(cornerCount2 == CORNER_2_FLIP){ 77 rot = Quaternion.Euler(0.0f, 180.0f, 0.0f); 78 } 79 cornerCount2++; 80 } 81 82 // タイルの設定と回転 83 SetTile(new Vector3Int( posX, posY, 0 ), rot, tilemap, tile); 84 85 } 86 } 87 88 // マップを全削除 89 public void MapDelete(){ 90 91 // 子オブジェクトを全削除 92 AllDestroy(stageObject); 93 ResetTileMap(tilemap); 94 95 } 96 97 // サイズを変えずに全てのタイルをリセット 98 public void ResetTileMap(Tilemap tilemap){ 99 100 var bound = tilemap.cellBounds; 101 // 全て削除 102 for (int y = bound.max.y - 1; y >= bound.min.y; --y){ 103 for (int x = bound.min.x; x < bound.max.x; ++x){ 104 Tile tile = ScriptableObject.CreateInstance<Tile>(); 105 Quaternion rot = Quaternion.Euler(0.0f, 0.0f, 0.0f); 106 //tilemap.SetTile(new Vector3Int(x, y, 0), tile); 107 SetTile(new Vector3Int( x, y, 0 ), rot, tilemap, tile); 108 } 109 } 110 } 111 112 // タイルをセット 113 private void SetTile(Vector3Int pos, Quaternion rot, Tilemap tilemap, Tile tile) { 114 tilemap.SetTile(pos, tile); 115 tilemap.SetTransformMatrix(pos, Matrix4x4.TRS(Vector3.zero, rot, Vector3.one)); 116 } 117 118 // 子オブジェクトを全削除 119 public void AllDestroy(GameObject gameobject){ 120 121 // PlayModeでなければ 122 if(EditorApplication.isPlayingOrWillChangePlaymode){ 123 foreach ( Transform n in gameobject.transform ) { 124 GameObject.Destroy(n.gameObject); 125 } 126 } else { 127 foreach ( Transform n in gameobject.transform ) { 128 GameObject.DestroyImmediate(n.gameObject); 129 } 130 } 131 } 132 } 133 134}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/26 05:39
2020/04/27 06:10