LoginSignup
2
2

More than 5 years have passed since last update.

Unity2Dでタイルマップを敷き詰めてスクロールさせようぜ

Last updated at Posted at 2017-06-05

Qiitaには画像アップロード上限があるんで 古い記事をまとめ直す。

ちらつきの解消については 次のサイトの記事が参考になる。

「SpriteRenderer、とりあえずの隣接ドット対策」Unity / VRゲーム開発日記@長崎
http://icoc-dev.hatenablog.com/entry/2014/09/29/111645


Unity2Dでタイルマップを敷き詰めてスクロールさせようぜ

前回: http://qiita.com/muzudho1/items/86fedc87b4b9e5731bfb

20170605k2.png

後ろは だいたい こうなっている。

  • 画面 見えているところ
  • ステージ カメラが動いてくる。カメラに映ってないところも作っている。Unity では シーン と考える
  • 3D空間 何も置いてなくても、えんえんと空間は在る
  • ステージデータ 木とかコピーして増やせるんで、コピー元になるのを置いている。Unity では アセット と考える

撮影されてるところ は、コンピューターで計算する対象になるが、映ってないところは計算を省いてくれる。「カリング」でググろう。

じゃあ、Unityの3D空間に バンバン 山とか 木とかを置いていこう、となるんだが、木を1本1本 作っていては コンピューターの計算対象になる。
木とか コピーで水増しして映しておけばいいケースもある。計算を省こう。「プレファブ」でググろう。

Unityの シーン が、ステージ・データ そのものだ。

じゃあ、上図の ステージデータ って何か?
ゲーム開発受注の案件によっては

  • JSON形式にしてステージを送受信したい、
  • ステージは 方眼紙(配列)のイメージをしている

といったことがある。

Unityの シーン を直せず いじらず、テキストエディターで編集したい、ということだ。
これを とりあえず ステージデータ と呼ぶことにした。

このように ステージデータを編集するためのツールは マップエディタ
などと呼ばれ、アセットストアに いろいろ売ってるようだ。
調査予算とかないんで、無料で使える Tiled Map Editor で補うことにした。

「Tiled Map Editor」
http://www.mapeditor.org/

容量の面での問題

ステージをタイル形式にして JSON で送るのだから、転送容量は でかくなる。

ステージのデータが テキストで 1メガバイトを超えそう……、ということは「気にしなくていい」案件なら このまま進んで問題ない。

気にする場合は 別に対策を取ること。

スクロール機能

ランゲーだと 横に延々と走っていくわけだが、ステージ全部を最初にローディングするというのは 非現実的だ。

ステージの初めの方で すぐに死んでしまうプレイヤーもいるだろう。遊ばな後ろの方のステージを ローディング するのもおかしい。

20170605k3.png

まずは短いステージでやってみる。

上図の黒い枠を 0プレースホルダ―、1プレースホルダ―、2プレースホルダーと名付けるとする。

20170605k4.png

画面が上に行ってしまえば、0プレースホルダーを 2プレースホルダーの後ろに移動させるという仕組みだ。

// 多分こんな感じで 上に行く
transform.Translate( 0, 200f, 0 );

プレースホルダーの長さは 設定で伸ばせるようにしておこう。
どれぐらいの大きさが ゲームプレイに影響を与えない通信に収まるのか 設計フェーズでは分からない。

20170605m1.png

プレースホルダーの中は、左上から 0セル、1セル、2セル…… とする。

そして その場所に セル・ゲーム・オブジェクト を置いておく。

ステージ・データの タイル・データによって、
セルの スプライト画像を貼り換えたり、コライダー(BoxCollider2D)をON/OFF したりすればいいのではないか。

ただ、別々に 3つのプレース・ホルダーが動くプログラムを書くのが難だったので プレース・ホルダー・チェイン という名前の1つのクラス、1つのゲーム・オブジェクトにして 実装してみた。

// スクリプトで コライダーを追加する例

GameObject go = new GameObject("Cell0", typeof(SpriteRenderer), typeof(BoxCollider2D));
BoxCollider2D col = go.GetComponent<BoxCollider2D>();
col.size = new Vector2( 0.4f, 0.4f);

例えば、GameObject のコンストラクタは可変長引数になっていて、コンポーネントを追加していくことができる。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2