なんか面白くなって色々やってたら無駄に時間かかってしまったので、コードとコードの解説についてはモチベーションが上がった時に。
スタート地点はこんな感じです。プレイヤーの子オブジェクトとしてカメラがくっ付いている、Unityでは良くあるパターンです。
ちなみにカメラ境界線もカメラの移動予測地点移動も無くすとこんな感じ。よくある pic.twitter.com/8mhTgWmD4a
— 椿 (@tsubaki_t1) 2015, 9月 27
カメラの移動範囲を制限しようと思いましたが、StandardAssetsのUtilityにCameraFollowなるコンポーネントがあり、これがカメラの移動範囲を制限する機能だったのでそのまま拝借。
類似品にFollowTarget(3D用の対象を追跡するコンポーネント)やSmoothFollow(FollowTargetをスムーズにしたもの)FollowCamera2D(移動先を向いてくれるが移動すると追いついてしまう微妙なコンポーネント)もあった。
キャラクターの制御システム組むのも面倒くさいのでアリものを使用。StandardAssets/2DのCharacterRobotBoy(旧名PlatformerCharacter2D)を拝借。
とりあえずカメラはキャラクターを直接見るんじゃなくて、キャラクターの移動先を見るように設定。移動先をテキトウに設定してもCameraFollow様が何とかしてくれる超パワー
画面端で止まるカメラ。標準アセットに入ってたやつ pic.twitter.com/OTritNP474
— 椿 (@tsubaki_t1) 2015, 9月 26
で、CameraFollowさんは設定がワールド座標に移動するくせにシーンビューに範囲が表示されてなくて使いにくいって事で、範囲をシーンビューに表示するように改造。
使ったのはGizmoとHandle。
UnityのStandardAssets/2DにあるCameraFollowを少し改造。カメラの移動範囲を表示するようにした。薄い赤が表示範囲、濃い赤がカメラが移動する範囲 https://t.co/KnqVLo1f4R pic.twitter.com/rIn7RSfUun
— 椿 (@tsubaki_t1) 2015, 9月 27
思い返すと、 ここで欲が出てきたのがいけなかった。
どうせならカメラを切り替えられるようにしようと、範囲内に入ったらカメラのレンジを切り替えるコンポーネントを作成。
範囲切り替えの計算と切り替え先の取得はコライダーじゃなくて自前計算。ノードマップを作っといて、キャラクターが画面外に出たときに隣接するエリアの判定を行いエリアを更新する…みたいな感じ。
事前計算はMenuItemでサクっと。更新忘れが何度かあったから、エリア更新後1秒後とかにどんどんやっちゃっても良いかも。しょせんboxのあたり判定だし。
ちなみに隣接エリアが無ければ全検索という力技。これで画面外に出たときもちゃんと復帰出来る。
https://t.co/bDGyI1ruZ7 の続き。キャラクターがカメラの範囲から抜けた時、隣接するエリアにカメラを移動する。隣接するエリアは事前に検索しとく pic.twitter.com/PAFlS4jsle
— 椿 (@tsubaki_t1) 2015, 9月 27
これ縦にも使えるんじゃね…?って事で縦にもやってみる。
問題無く動作。
あとあと、カメラのx軸移動可能範囲を0にすることで、スクロールしないエリアが設定できる事に気づく。
カメラの移動できるエリアを縦に伸ばして、上下移動してもカメラが追随するように pic.twitter.com/xB4wavqeHx
— 椿 (@tsubaki_t1) 2015, 9月 27
何か色々と物足りなくなってきたので「2Dゲームを面白くする技術」の内容を思い出してマージンを設定してみる。
元々「エリアを出たら=画面が居に移動したら=ゼルダの伝説トライフォースっぽいやつ」を想定して作ってたけど、せっかくなので色々やってみよう的なモチベーション。
ただ基本的に「画面から出たら」がトリガー条件なので、移動先が少し巻き戻っててもあまり良い感じがしない。
「2Dゲームを面白くする技術」を参考に、カメラに移動マージンを設定してみる。厳密に模倣するならカメラ移動範囲に追加で制限を設けるか、いっそ例外的に範囲に入ったらレンジを切り替えちゃうかだけど…うーん pic.twitter.com/1jTGvzGur1
— 椿 (@tsubaki_t1) 2015, 9月 27
流石に「画面から出たら」に限界を感じたので、トリガー条件の「画面から出たら」にマージンを設定。
カメラの移動範囲を繋げるとカメラ切り替え境界線が大分離れてても綺麗につながるのは中々面白い。
https://t.co/s7WGF4BO2w の続き。「2Dゲームを面白くする技術」で紹介されてる動作を参考に、カメラ移動境界線に遊びのパラメータを追加。割と良い感じになった気がする。 pic.twitter.com/YtjoSoiAeq
— 椿 (@tsubaki_t1) 2015, 9月 27
次はグリッド移動とドット移動について作ろうか、それとも2Dカメラをもっと色々出来るようにしようか。