『りあーずだんじょん』を作ろう 第4話

arg[0] | Hello.

どうも。flanny(ふらんにぃ)です。
今回も『ダンジョン探索ミニゲームを作る』を始めて参ります。

前回は「環境構築その2」ということで 「Git のお手入れ」と「ルール決め」について書きました。
今回は「マップデータを考える その1」です。
とりあえず、スクリプトは書かずマップを表示させてみます。

arg[1] | atlas map chips

How To

Unity には TileMap という比較的新しい機能があります。
まるで RPGツクール のようにマップを作るツールで便利らしいです。

が、今回は使いません。使い方を知らないから。
既存ツールの使い方よりも「マップってどう作る?」という視点に注目して進めます。

仕様

マップに関して、呼び名を統一しておきます。

  • マップチップ(MapChip)
    • 1マスに描画するマップのこと
    • 64×64の画像(Sprite)
  • マップチップセット(MapChips)
    • マップチップの集合体
    • いわゆるパレット
    • 複数のマップチップを "アトラス化" したもの
  • マップチップスペース(MapChipSpace)
    • マップチップを埋めるスペース
    • 1つのスペース(1マス)に1つのマップチップを持たせる
    • SpriteRenderer
  • マップ(MapChip)
    • ゲーム上で見せるマップ
    • マップチップスペースの集合体

マップチップとアトラス化

画像を用意する

さて―
まずはマップチップを作ります。
Adobe社に課金しているので、Illustratorを使います。

マップチップは、64×64 (px) の png形式 とします。
とりあえずなんでもいいので、番号を振った16枚を用意しました。

ここで、その16枚のマップチップを1枚の画像にまとめてしまいます。
縦4枚 横4枚 の計16枚で 全体で 256×256 (px) になります。

image

Unity 上では、まとめた1枚の画像を切り分けて使うことにします。
このように複数の画像を1枚にまとめ、切り分けて使うことを "アトラス化" と呼んだりします。
複数の画像を1枚にまとると、画像の読み込み回数を減らすことができます。
"アトラス化" にはメリット・デメリットがあるので、興味のある方は調べてみてください。

Sprite を Slice する

"アトラス化" した画像を マップチップセット と呼ぶことにします。
マップチップセットを Unity に読み込ませます。
そして Inspector で次の箇所を編集します。

TextureType      : Sprite (2D and UI)  
Sprite Mode      : Multiple  
Pixels Per Unit  : 1  

Filter Mode      : Point (no filter)

image

ポイントは3つ。
Pixels Per UnitFilter ModeSprite Mode です。

Pixels Per Unit

Pixels Per Unit は 画像の大きさに関する値です。
言葉通り、1Unit あたり何 Pixel で表示するかという意味です。
"Unit" とは Unityで定義されている大きさの単位です。
Scale1 = 1Unit と考えてください。

通常は「100」ですが、2Dの画像を扱うときは「1」の方が直感的に配置できるはずです。

Filter Mode

Filter Mode は画像の圧縮方法です。
今回のマップは 64×64 (px) といった小さい画像の集合になります。
そのため Point (no filter) にして綺麗に描画できるようにしています。

Sprite Mode : Multiple

Sprite ModeMultiple にします。
これによりマップチップセットを切り分けることができます。

「Sprite Editor」をクリックします。
「Slice」の「Type」を Grid By Cell Size にして切り分けます。
画像全体の大きさは 256×256 (px) で マップチップ1枚の大きさは 64×64 (px) です。
「Pixel Size」を X:64 Y:64 にして「Slice」をクリックし、合計16枚のマップチップにしましょう。

image

上手く切り分けられたので、右上の「Apply」をクリックして確定します。

arg[2] | put map chip renderers

ここからは、マップチップを置く場所を用意します。
ここではマップチップを置く場所を マップチップスペース と呼ぶことにします。

Unityは Sprite を描画するために SpriteRenderer に Sprite を渡す必要があります。
つまり、今回は以下のように考えるわけです。

  • Sprite = 切り分けたマップチップ
  • SpriteRenderer = マップチップスペース

ということで、10×10 (マス) のマップチップチップスペースを配置します。

Scene は SampleScene のままです。
解像度は Standalone (1024×768) です。

Sprite を綺麗に描画するためのカメラの設定

まずはカメラの設定をしておきます。
Main Camera の Camera を以下のように編集します。

Clear Flags : Solid Color

Projection  : Orthographic
Size        : 384 (height/2 の意)

image

Clear Flags

Clear Flags を Solid Color にします。
2Dを扱うときは、こちらの方を選んでおくと見やすいです。

Projection : Orthographic

Projection を Orthographic にします。
Perspective は「透視投影」、 Orthographic は「平行投影」です。
3DCGを扱ったことのある方なら何となくわかるかもしれません。

Size は「解像度の高さ / 2」にします。
今回は Standalone (1024×768) なので 768 / 2 = 384 です。

[

SpriteRenderer の配置

10×10 (マス) の計100個を配置していきます。

まず、親となる GameObject を用意します。
名前を「Map」とし、左上端の位置になるように座標を X = -288, Y = 288 とします。

次に、「Map」の子オブジェクトとして SpriteRenderer をアタッチした GameObject「MapChipSpace」を左上から左へと順に配置していきます。

SpriteRenderer の Sprite には、先ほど用意したマップチップの0番目を渡します。

inspector の値を入力するときは、計算式を使うことができます。
例えば (3) を配置するときに、(1) をコピぺして X に「0 + 64 * 2」のように入力すれば、「128」にしてくれます。
あとは「(1) ~ (10) までを配置したら、(1) ~ (10) をコピペして、Y の値だけ編集する」を繰り返せば、比較的楽に配置できます。

image

手入力で地道に配置できました。
SpriteRenderer の Sprite に違う画像を渡せば、ちゃんと置き換わるはずです。
しかし、さすがに全種類のマップ1つ1つの Sprite を置き換えるのは地獄でしょう。

return;

ひとまず、計100個のマップチップスペース(SpriteRenderer)を配置することができました。
次回は、簡易的なマップデータを用意して、マップチップスペースたちに反映させていきます。

Comment

今回のキーワード アトラス化:画像を1つにまとめて切り分けて使うこと