UnityEngine.Tilemapsを利用して、2Dのターン制ローグライクゲームの作成をしています。
今、Tile上にいるキャラクターが移動する際、その移動先に既に別のオブジェクトがあった場合は移動させないという処理を書いているところです。
そこで、GetTile関数が私が想定していた動作と別の動きをしていて、困っています。
以下詳細です。
以下のコードは、RuleTileを継承して各TileにTilePutObjectsというリストを持たせるためのものです。
このTilePutObjectsに、Tileごとに上に乗っているオブジェクトを保存して管理させる狙いです。
c#
1public class MyTileBase : RuleTile 2 { 3 protected TilePutObjects _tile_put_objects; 4 ... 5 }
以下のコードは、上記のコードにより、移動先のTileに既にオブジェクトがあった場合、移動せず、無い場合は移動するというコードです。
c#
1protected void Move(Vector3Int grid_add) 2 { 3 var tilemap = From.ReferenceTilemap; 4 var cur_position = new Vector3Int(From.CurGridPosition.x, From.CurGridPosition.y, From.CurGridPosition.z); 5 var next_grid = From.CurGridPosition + grid_add; 6 7 var next_tile_base = tilemap.GetTile<MyTileBase>(next_grid); 8 var cur_tile_base = tilemap.GetTile<MyTileBase>(cur_position); 9 10 if (!next_tile_base || !next_tile_base.Type.Movable || !next_tile_base.CheckMovable()) return; 11 From.gameObject.transform.position = tilemap.GetCellCenterWorld(next_grid); 12 From.CurGridPosition = next_grid; 13 14 next_tile_base.PutObjects.Add(From); 15 cur_tile_base.PutObjects.Remove(From); 16 }
以下は、MyTileBaseを継承した三種類のTileを配置したものになります。
大雑把に、黒のタイル、灰色のタイル、白のタイルとします。
以上の状態で、キャラクターの移動先のTileを取得(tilemap.GetTile)しようとすると、私の想定ではその移動先のTileが保存しているTilePutObjectsが取得できるはずでした。
しかし実際は、例えば移動先が白のタイルの場合、その白のタイル全体でTilePutObjectsが保存されていて、そのTilePutObjectsが返されます。
例えば、座標(0,0)が白のタイルで、TilePutObjectsに既にオブジェクトが登録されているとします。
その状態で、座標(2,2)に移動するとします。移動先が白のタイルの場合、移動先にオブジェクトが既にあると判定されて、移動することができません。
つまり、黒のタイル、灰色のタイル、白のタイルのグループでTilePutObjectsが管理されていることになっています。なので白のタイルのいずれかにオブジェクトがある場合、移動先がどれだけ離れていようとも、白のタイルには移動できません。
上記で上げた画像では白と灰色のタイルが交互に配置されています。この状態で既にオブジェクトが配置されている場合、斜め移動でしかできない状態です。
以上の動作は、Tilemap.GetTileで取得できるものが、その座標にあるTileのグループを取得するものだからなのでしょうか。
各Tileの個別に、状態を保存する変数を持たせるにはどうしたら良いでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/24 23:38 編集
2020/07/28 03:08