【Unity2d】スクロール機能実装のための前準備について

Unity2D

Unity2D ARPG

こんにちは。なおキーヌです。

ブログ毎日更新は356日目になります。

体調不良に見舞われ進捗が芳しくないので休日を利用してサクサクと進めていきましょう。

前回はUIを画面に実装してカメラの子要素にすることでカメラを動かしてもUIを画面に固定することができました。

現状は透過部分もあって見えなくてもいい所が見えてしまうのでゲーム画面以外は透過無しにしてしまいましょう。

スクロールの準備

スクロールさせるにはマップを作らなきゃいけませんね。

いずれはエディタを作りたいところではあるのですが、Unityそのものがエディタなので
今のところは要らないかなって感じですね。

Unityではシーンという概念があってシーンごとにマップが違う感じになるので、
それを利用して1シーン1ダンジョンという仕組みでよさげです。

現状のマップをコピーして上にずらして新たなエリアを作ってみましょう。

UIが邪魔な時は非表示にすれば消えてくれるので、
マップ作りの時は活用していきましょう。

原点の設定

今の内にやっておきましょう。

ご存知と思いますが、Unityでは原点(x,y)=(0,0)の場所が左下になります。

今まで別言語で2Dゲームを作ったりした人にはかなり違和感を覚えたのではないでしょうか?
3Dだと左下が基本になるのでしょうかね?

確かに数学とかの世界だと左下が原点で上に右上に上がるほど+の座標になるので
ある意味自然と言えば自然なのでしょうか。

ただ、今は2Dのゲームを作っているので左上が原点じゃないと違和感だらけ……

しかしUnityのデフォルトに反して左上を原点にすると、
色々整合性が取れなくなったり変更し忘れによるバグがあったりすると面倒なので左下を原点として進めましょう。

Pivotも基本的には中心になっているのですが、グリッドに依存するタイプのオブジェクトは
Pivotをすべて0にして左下に設定しましょう。

初めにこれをやってルール決めしておかないと後で位置変更がとてつもなくヘビィな作業になるので
今のうちに変更して、それからマップ作りを進めていきましょう。

今回は次回のための準備になるので、しっかりと数値と原点を決めてしまいます。

ヒエラルキーを確認

現状のヒエラルキーを確認しておきましょう。

Unityのゲーム制作に置いてかなり重要なポイントになるので、
適当に配置せずにちゃんと親子関係を築きます。

Canvasオブジェクト

最上位ヒエラルキーに配置します。

現状、Canvasオブジェクトの下にゲームに使うオブジェクトを配置しています。

こうすることでCanvasのtransformを変更するだけでまとめて子オブジェクトが移動してくれます。

メチャクチャ便利ですね!

プロパティの「RectTransform」の値を設定します。

基本的にCanvasは回転させることはないですが、Anchorは中心でよさそうなのです。

特に弄らなくてもいいでしょう。

どちらかと言うとPivotの変更が重要になります。

デフォルト状態ですと0.5になっているので中心部が(0,0)となるわけです。

3Dゲームの場合はそれでもいいかもしれませんが、2Dでなおかつグリッドを使おうとする場合
中心だと割り切れないことがあるので都合が悪くなります。

なので左上か左下にするべきなのですが、先ほども言った通りUnityの基本に沿って作っていくため
原点は左下にしておきましょう。

単純にPivotの数値をどちらも「0」にしてしまえばOKです。

ゲーム用オブジェクト

基本的にすべてCanvasの子オブジェクトとして配置します。

ここでのゲーム用オブジェクトはUnityでいうGameObjectということではなく、
プレイヤーやエネミーや壁等のゲームとして配置するオブジェクトのことを指しています。

Canvas直下のオブジェクトとしては

  • プレイヤーオブジェクト
    • アイテムオブジェクト
  • エネミーオブジェクト(空親)
    • 出現エネミーオブジェクト群
  • マップオブジェクト(空親)
    • エリアオブジェクト(空親)
    • エリア構成オブジェクト群

一旦こんな感じでしょうか。

何か増えたら基本的にCanvasの子になります。

MainCamera

Canvasと同じくして最上位に配置します。

というか、プロジェクト作成時に自動的に生成されますね。

これがゲーム画面に映る部分となります。

カメラはデフォルトではPivotを弄るプロパティが無いようですが、
今回はカメラそのものは座標を固定したままでCanvasをスライドさせて
ゲームがスクロールしているようにみせるのでPivotが中心でも問題ありません。

……と思ってたのですがよく考えるとCanvasを動かすということは、
子オブジェクトのTransformを相対的に変更するということですよね。

ということは子オブジェクトが増える度に処理量が増えてしまうので、
状況によってはスクロール時にかなり処理落ちしてしまうような気がします。

今のPCの性能なら余裕そうですが、処理を軽くするのはプログラマの義務でもあります。

いくら強いPCだからって怠惰を理由に処理負荷を上げて良い理由にはなりません。

出来る限り処理を軽くしていきましょう。

ということでスクロール実装はカメラ座標を変更することに決定しました。

今回に関しては初代ゼルダみたいに1画面のスクロールオンリーなので、
そこまで神経質に考える必要もないですね。

スクロール値を固定にしておき、スクロールが発生したらその値でスクロールするだけです。

GUIオブジェクト

MainCameraオブジェクトの子オブジェクトとして配置します。

カメラの子オブジェクトに配置することで、カメラを動かしてもUIが画面に張り付いた状態になります。

カメラが動いてUIがそのままの位置にいる状態はゲームとしてあり得ないですね(笑)

UIはプレイヤーとゲームをつなぐものなので基本的に画面固定になります。

なのでUI系のオブジェクトは基本的にカメラの子オブジェクトとして配置しましょう。

注意してほしいのが、カメラは中心が原点ですが子オブジェクトは左下を原点にしておきましょう。

EventSystem

自動で生成されますが、基本的にUnityのボタンとかの制御に使われるので消さずにおいておきましょう。

キー入力とかにかかわってくるので基本的にはノータッチになります。

以上、ヒエラルキーについて解説しました。

次回は原点やオブジェクトの親子階層について意識しながらマップを作っていきましょう。

少しだけネタバレしておくと、体験版は4x4のマップになるので

  • マップオブジェクト(空親)
    • エリアオブジェクト(空親)
    • エリアA
    • エリアB
    • エリアC
    • エリアD
    • エリアE
    • エリアF
    • エリアG
    • エリアH
    • エリアI
    • エリアJ
    • エリアK
    • エリアL
    • エリアM
    • エリアN
    • エリアO
    • エリアP

といった感じのヒエラルキーになります。

それでは!