さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】Perspectiveカメラで2D画面の多重スクロール

 横スクロール2Dゲームのステージで、背景がスクロールしたときちょっとずつズレるみたいなのを実装する。

 素直にスクロール値を計算して毎フレーム位置を動かして……、とかやっても全く問題ないんだけど、まあ、とくに支障がないならカメラの機能だけでやってみようと。LateUpdateとか使って処理順意識するの嫌じゃん?

カメラ設定

 遠くのものがゆっくりと動く(ようにみえる)ために、Perspectiveカメラを使う。Orthographicカメラではこの現象は起こらない。

定数を決める

カメラ~基準オブジェクトの距離

 カメラがズレを起こさないメインとなるオブジェクト(基準オブジェクト)とカメラとの距離を決める。

 距離はカメラのニアクリップ、ファークリップ内に収めて(まあ普通おさまるけど)、あとはまあ、なんやら使いたい機能があったらそれに都合がいいようにする。スプライトだけの世界なら特になんでもいいはず。

で、コード

float 基準オブジェクトとカメラの距離;
float 背景オブジェクトとカメラの距離;
GameObject 背景オブジェクト;

背景オブジェクト.transform.localScale = Vector3.one * 背景オブジェクトとカメラの距離 / 基準オブジェクトとカメラの距離;

 という感じに、「遠くにあるものは小さく見える」を打ち消すように背景オブジェクトを拡大してやれば、いい感じに等倍に背景が描画されつつスクロールがズレてくれる。

 あとは背景の端が見えないように調整とかが要るんだけど、まあ、そこはオブジェクトの構造依存の話なので知らない。

使えないパターン

 横方向にはスクロールするけど縦方向はスクロールしない、とか、摂理に反することをしようとするとゴリゴリと毎フレーム位置を入れる処理が要る。しかたないね。

こっちも参考

gamesonytablet.blogspot.jp