UnityのRPG Map Editorアセットの使い方と衝突判定について
Unityの有料アセットであるRPG Map Editorは2DのRPGのフィールドマップやダンジョン制作に有用な,Creative Sporeが作成したツールである.
目次
デモ
購入後にデモを実行する方法は以下の通り.
まず,Asset Storeからアセットをインポートする.
次に,Assets > CreativeSpore > RpgMapEditor > Samples > Scenes > demo1 - Big Mapを選択すると,デモを行うことができる.
ゲームを再生すると,プレイヤーキャラクターを動かすことができる.
また,左端に表示されているマップチップをリアルタイムで差替えて試すことができる.
セットアップ
- プロジェクトから
+
を選択する.
RpgMapEditor > AutoTileset
を選択すると,アセットに新しいタイルセットが追加される.
- 同様にヒエラルキーで右クリックまたは
+
を選択して,新しくタイルマップを作ることができる.
タイルセット
インスペクタで新しいタイルセットを見ると,アトラスの生成ボタンがある.
ここから,材料となるマップチップを読み込む.
タイルマップ
作成されたAutoTileMap
をヒエラルキーで選択する.
すると,インスペクタの下にTileset
とMap Data
という項目があるので,これを新規作成することでマップの作成を開始することができる.
マップチップの読み込み
ツクールやウディタなど向けに開発されたマップチップも利用したい場合.
- ヒエラルキーに
AutoTileMap
を作った後,インスペクタを開く. - Tilesetを
Create
するボタンを押す. - スロットサイズ(どれぐらいたくさんのタブを用意するか.つまり,どれぐらいたくさんの素材を使うことにするか.)とピクセル(32*32のマップチップなら「32」とする.)を決める.
- 3つのファイルができるが,素直な名前のTilesetを開き,使うことにするマップチップをタイルセットのアトラスに入れていく.
スロットサイズが2×2であれば,アトラスは4スロットを持つ.
ノーマルタイル1スロットごとに4つのタブができ,各タブには512×512ピクセルのサイズが確保されている.
マップの作成
レイヤー・衝突・コピーについて.
詳細はRPG Map Editorの付属ドキュメントを参照.
タイル
カメラから見たマップ・プレイヤーの見た目関係として3種類の区別がある.
タイルと基本的なレイヤーの関係は以下の通り.
- アルファのない不透明タイル(地面)→
Ground
レイヤーに置く. - アルファタイル(地面の上に置かれた物)→
Ground Overlay
レイヤーに置く. - オーバーレイタイル(キャラクターが裏にまわれる物):タイルセットで衝突の種類が「オーバーレイ(★)」となっているもの→
Overlay
レイヤーに置く.
通常の設定でプレイヤーキャラクターの下にくるのがGround
とGround Overlay
で,上にくるのがOverlay
である.
必要であれば,レイヤーは増減できる(し,後述の通り,コピーに特徴があるので,自分で見返して意味が分かるように適当な名前をつけてレイヤーを使い分ける方がよい).
その場合の見た目の関係は,カメラ・プレイヤー・各レイヤーのOrder
やDepth
に従う.
衝突の種類
プレイヤーが壁を突き抜けたりしないように,衝突を設定する.
プレイヤーより地面方向で一番近いところにあるものを基準に,衝突の判定を行なっているようである.
- ブロック(■):タイル全体に衝突する.
- 壁(□):縁の部分でのみ衝突する.オートタイルなんかでこの表示がある.
- 柵(♯):オーバーレイ的に後ろが見えるけれども,衝突する.
- オーバーレイ(★):衝突しないタイルの種類で,オーバーレイレイヤーに描かれることが想定されている.
壁とは,側面のことではなく,上から真下を見下ろした図で当たるところのこと.
正方形に囲われた9マスのタイルであれば,壁を周辺8マスに適用して,中心は衝突設定しない感じ.
特に理由がない限り,建物の側面にはブロックを使う.
衝突も後からまとめて設定できる.
コピーに関するTips
レイヤーを有効/無効にすることで,レイヤーを表示/非表示にすることができる.
また,タイルをコピーすると,無効にしたレイヤーをスキップできる.
Shiftキーに関するTips
Shiftキーを押しながらのマッピングはMap Layers
の並び順で次のレイヤーに置くという操作になる.
Ground
に地面を描きながら,Ground Overlay
に石や草を置きたいとき.Ground Overlay
に石や草を描きながら,その上空のOverlay
レイヤーへ旗や電灯を吊るしたいとき.
レイヤーを増やしても次のレイヤーへ描くという意味で挙動は同じである.
注意.
エディタ上でGround Overlay
→Ground
→Overlay
という並び順で作業している場合,Ground Overlay
でShiftを押すと,Ground
にタイルを置く.
また,Ground
でShiftを押すと,Overlay
になる.
ちなみに,Overlay
でShiftを入れると,これより後のレイヤーがないので描くことができない.
キャラクターを動かす
- サンプルの
Player
とPlayerCamera
をヒエラルキーに入れる.
PlayerCamera
のTarget
にPlayer
をセットする.
AutoTileMap
のViewCamera
にPlayerCamera
をセットする.
この見本では,サンプルのタイルセットとマップデータを用いた.
- 元から存在するメインカメラを削除する.
通行可・不可を確認する
RPG Map Editorで制作するマップにおいて,キャラクターが壁を突き抜けたりするのを予防するためのチェック方法.
単に通行の可・不可をチェックしたい
Auto Tile Map
のShow Collisions
にチェックを入れる.
通行できないところが赤で塗られる.
レイヤー別に表示・非表示を切り替えて状況を把握をしたい
インスペクターからマップをペイントするときのEditで,Map Layers
の各チェックボックスを使ってレイヤー表示/非表示を切り替える.
全てのレイヤーを表示したまま状況を調べたい.
ヒエラルキーのAutoTileMapData
に内包されたオブジェクトをクリックすると,マップ上で該当するレイヤーが強調表示される.
ただし,複数のレイヤーがペイントされたグリッドは,いずれのレイヤーでも強調表示される.
OrderとDepth
見た目の重なり方と通行可能性が一貫するかどうか実験した.
Order
数値が大きいとカメラ側に描かれる.
デフォルトは0となっていて,1, 2, …となると後から描き足されていく.
(マイナスに設定することもできる.)
しかし,衝突判定に影響を与えるわけではない.
Depth
数値が小さいと通常はカメラ側に描かれる.
つまり,プレイヤーをゼロ地点として,プラスで絶対値が大きい方が地面,マイナスで絶対値が大きい方が空中方向に描く.
衝突判定を上書きしていく.
マイナスのGround
に置かれたタイルは通行可・不可が利く.
プラスのOverlay
は,ぶつからないGround Overlay
のようなもの.
実験
通行可能な草むらタイルと通行不能な岩タイルを使って草むらの上に岩を置き,通路を塞ぐマッピングを行いたいとする.
(例示はGround
/ Overlay
の2分法で行う.)
まずは全てorder = 0
とする.
- 通常:
depth = 1.0
のGround
に草むら,depth = 0.5
のGround
に岩(草むらの上に岩を置く)⇒岩にぶつかる<見た目通りでOK> depth = 1.0
のGround
に岩,depth = 0.5
のGround
に草むら(岩と草むらが反対になっていて,岩を草むらで塗りつぶす)⇒プレイヤーは草むらに直面しているので通行可能<草しか見えないので衝突判定も見た目通りだが,草むらの下に変な物があるのは望ましくない>depth = 1.0
のGround
に草むら,depth = - 0.5
のGround
に岩(草むらの上に空中寄りの位置に岩を置く)⇒岩にぶつかる<見た目も衝突も正しいので実用上は問題ないが,余裕があれば修正すべき>depth = 1.0
のGround
に草むら,depth = - 0.5
のOverlay
に岩(草むらの上の空中に岩を置く)⇒岩が浮いているので,岩をくぐる<衝突が見た目と異なるのでNG>depth = 1.0
のGround
に草むら,depth = 0.5
のOverlay
に岩(草むらの上の地面寄りの位置の空中に岩を置く)⇒浮いている岩をまたぐ<衝突が見た目と異なるのでNG>depth = 1.0
のGround
に草むら,depth = 0.5
のGround
に岩という通常のケースから,岩を置くGround
レイヤーをorder = 0
,草むらを置くGround
レイヤーをorder = 1
⇒岩の後に草むらが描かれるので,岩が見えなくなる.しかし,Order
は衝突に作用しないので,Depth
に基づいて岩にぶつかる.<衝突が見た目と異なるのでNG>
結論
以上から,衝突が見た目と変わってしまうのでOverlay
とOrder
には注意する必要がある.
エクスポート
マップのエクスポートはUnityPackage形式で行える.
エクスポートするものの主な実体はTileset
,Map Data
,map.xml
であった.
Tileset
AutoTileMap
のインスペクタを開くと,Tileset
とMap Data
で使われているデータがある.このTileset
をクリックしたところにタイルセット,タイルセットのアトラスマテリアル,タイルセットのインポート設定という3つのファイルがある.これら3ファイル.
Map Data
先ほどのAutoTileMap
のインスペクタのMap Data
に該当するファイル.
map.xml
同じくAutoTileMap
のインスペクタで,Data
のタブにExport Map...
という項目があり,クリックするとXMLファイルが生成される.
ファイルの依存関係について
Map Data
は,Tileset
のどこに位置する画像が使われているかを各レイヤーごとに管理している.
XMLファイルはこのMap Data
のセーブデータである.
試しにXMLをエクスポートした後でマップを書き換え,XMLを再度インポートしてみると,エクスポートしたときのデータまで戻る.
Map Data
をそのままにTileset
を差し替えると,アトラス的に同じ位置にくる新しいTileset
の画像に差し替えられる.