Unity2D カメラを対象に追従させる
前回までで、プレイヤーを操作できるようになったので、
今回はカメラが常にプレイヤーを画面の中央に捉え続けるような処理を追加します。
プレイヤーの子オブジェクトにカメラを登録する
まあ、2Dならこれでほとんど不自由しないんじゃないかと思います……
プレイヤーが回転しないため、プレイヤーが回るとカメラも回るという事故は起きず、
カメラを動かす演出が必要な時も、Position動かして対応できるし、
プレイヤーをDontDestroyOnLoadにしておけばカメラも破棄されないし、
実際これで問題なくゲームが回ると思うんですが、親子関係にしていると思わぬところで壁にぶち当たったりするかもしれないので、とりあえず別のやり方を考えてみます。
スクリプトで対象の位置をトラッキングさせる
簡単なコードを書いてカメラにアタッチします。
対象をInspectorから設定できるように、publicでTransformを宣言します。
これが設定されていなかった場合は、Start内でHierarchyにPlayerタグのオブジェクトを探させ、登録しています。それもなければ、何もしません。
ゲーム中、プレイヤーは常にシーンにいるはずだけど、一応……
あとは、後出しで位置を合わせにいけるようにLateUpdateを使って自身のpositionを更新させます。
待てよ、毎フレームVector3をインスタンス化したら重くなるだろ!
と思いましたが、Vector3はクラスではなく構造体で、すなわち値型ではなく参照型なので、結局インスタンスは1個になり、大した問題はないようです。
Vector2はVector3のzを0とする
Vector2で宣言すると、zの値が勝手に0になります。別に0でもいいですが、デフォルトでは-10になっていて、2Dモードのくせにこれがスプライトの描画に関わってくるのでそのままにさせておきました。
2DなんだしVector2で考えたいんじゃ!
という人は、Clipping Planesを調整することでこの問題は解決します。
とにかくカメラが映す奥行きをめちゃんこ広げてやればOKです(多分)。
これ別の記事に書いた方がよかったかもしれない。そのうち書きそう。
offsetXとoffsetYは、対象とカメラの位置をずらすのに使っています。
特に重要なのはYの方で、
これがないと、微妙に対象が上にずれてしまいます。
なぜこうなるかと言うと、スプライトのPivotをBottomにしているからです。
これ。
Centerにしている場合は、ここでは問題ありません。
なぜBottomにしているかというと、CenterだとスプライトのサイズによってPivotの高さが変わってしまい、地面を基準にした整列ができなくなってしまうからです。
というわけで、offsetYを0.5fにすると
キャラクターがだいたい画面の中央に来ました。