Unity で テトリス風ゲームを作ってみる#8
前回の続き
前回までで、テトリミノの生成と落下、左右下への移動、左右回転、着地と削除と一連の流れの作り方が整理できた。
Next テトリミノ
今回は、Next テトリミノの実現方法について考える。
Next テトリミノは、次に落下予定のテトリミノを示している。新しく生成されたテトリミノはフィールド上部ではなく、まずNext テトリミノの位置(Next エリア)に表示する必要がある。Next テトリミノは、フィールド上のテトリミノが着地し、ラインの削除/落下処理が終わった段階で、フィールド上に移動し落下し始める。
また、ゲーム起動時(フィールド生成時)は、フィールド上部とNext テトリミノの2 ヵ所にテトリミノを生成する必要がある。
よって、
-
- Next テトリミノを表示するエリアを生成する
- Next エリアの位置にテトリミノを生成する
- Next テトリミノをフィールド上部に移動する
の3 つの動作が実現できればよい。
Next テトリミノの表示エリアをテクスチャで表現することを考える。これはブロックと同様にGameObject にSpriteRenderer コンポーネントを付けて、Sprite にNext 表示エリアテクスチャを設定すればOK。
今回、Next 表示エリア用のテクスチャは、256 x 256 Pixel のPNG 画像で作成。ブロックは128 Pixel で作成し1 Unit を 128 Pixel としたので、表示エリアテクスチャの"Pixel per Unit" を 128 とすると、2 Unit 分の大きさになってしまう。 Next 表示エリアは、テトリミノの最大縦横サイズ 4 x 4 ブロック(4 Unit x 4 Unit)が収まるサイズにしたいので、さらに2 倍の大きさになるように "Pixel per Unit" を 64 に設定する。
64 Pixel で 1 Unit なので、256 Pixel だと 4 Unit (= 4 ブロック)の大きさになる計算。
テトリミノの生成は、以前説明したテトリミノPrefab からGameObject を生成すればよいが、生成位置はNext エリアの中心にする必要がある。
今まで説明をしていなかったが、GameObject の位置を計算するには、GameObject の親子関係を理解しておく必要がある。
GameObject の位置を制御するTransform コンポーネントのポジションには、localPosition と position の2 つが存在する。localPosition は、親GameObject からの相対位置を表しており、position はScene 原点からの絶対位置を表している。
絶対位置を示すposition だけを使って位置計算をすることも可能であるが、そうしてしまうと例えば Next エリアの位置を変更した場合、Next テトリミノの表示位置もそれに合わせて再度計算しなおさないといけなくなる。Next テトリミノの表示位置は、Next エリア内の中心ということは変わらないので、それだと面倒。
つまり親子関係の依存を持つオブジェクト同士は、GameObject も親子の状態にしておいた方が扱いやすい。
子GameObject に親GameObject を設定するには、Tranform クラスのSetParent 関数を使って設定することができる。(親GameObject から子GameObject への設定は不要)
今回のNext エリアと Next テトリミノの位置関係は下図のようになる。
Sprite の表示位置に関して、もう2 点注意することがあるのでここで追記。
-
- Pivot
Sprite コンポーネントに設定するテクスチャにはPivot という設定項目があり、どこを基準に表示するかを変更することができる。例えば、Transform のポジションを(0,0)にしてSprite を表示しようとしたとき、Pivot がCenter になっている場合はテクスチャの中心が(0,0)になるように表示される。
好みにもよるが、自分の場合は左下を原点に位置計算をしたいので、Pivot の設定は、Bottom Left にしている。
-
- Sprite Sorting Layer
2D ゲームのSpriteの場合、Z 軸方向に手前にGameObject があったとしても、同一の"Sorting Layer" が設定されている場合は、"Order in Layer" に設定された値の大きい方が手前に表示され、"Sorting Layer" が大きい方がさらに手前に表示される。
つまり、
"Sorting Layer" の大きい方 → "Order in Layer" の大きい方 → Z 軸が手前の方
の順に評価されて表示順が決まる。
今回は、Next エリアのSprite よりも、テトリミノのSprite を手前に表示したいので、テトリミノのSprite の"Order in Layer" を1 に、Next エリアのSprite の"Order in Layer" を0 に設定する。
以上の検討結果をプロトしてみたのが、下記。
次の記事