【Unity】Perspectiveカメラで2D画面の多重スクロール
横スクロール2Dゲームのステージで、背景がスクロールしたときちょっとずつズレるみたいなのを実装する。
素直にスクロール値を計算して毎フレーム位置を動かして……、とかやっても全く問題ないんだけど、まあ、とくに支障がないならカメラの機能だけでやってみようと。LateUpdateとか使って処理順意識するの嫌じゃん?
カメラ設定
遠くのものがゆっくりと動く(ようにみえる)ために、Perspectiveカメラを使う。Orthographicカメラではこの現象は起こらない。
定数を決める
カメラ~基準オブジェクトの距離
カメラがズレを起こさないメインとなるオブジェクト(基準オブジェクト)とカメラとの距離を決める。
距離はカメラのニアクリップ、ファークリップ内に収めて(まあ普通おさまるけど)、あとはまあ、なんやら使いたい機能があったらそれに都合がいいようにする。スプライトだけの世界なら特になんでもいいはず。
で、コード
float 基準オブジェクトとカメラの距離; float 背景オブジェクトとカメラの距離; GameObject 背景オブジェクト; 背景オブジェクト.transform.localScale = Vector3.one * 背景オブジェクトとカメラの距離 / 基準オブジェクトとカメラの距離;
という感じに、「遠くにあるものは小さく見える」を打ち消すように背景オブジェクトを拡大してやれば、いい感じに等倍に背景が描画されつつスクロールがズレてくれる。
あとは背景の端が見えないように調整とかが要るんだけど、まあ、そこはオブジェクトの構造依存の話なので知らない。
使えないパターン
横方向にはスクロールするけど縦方向はスクロールしない、とか、摂理に反することをしようとするとゴリゴリと毎フレーム位置を入れる処理が要る。しかたないね。