読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】距離に応じて2Dカメラを拡大・縮小する処理

カメラワークの続き。今回は二人のキャラクターが必ずカメラ内に収まるようにカメラの描画範囲を広げる、スマブラで見たアレを…作った過程を紹介します。

f:id:tsubaki_t1:20150930012742g:plain

当初、単純に2点の距離からカメラの描画範囲(camera.orthographicSize)を出していましたが、これは間違っていました。

ので、ちゃんと考えます。「2点のキャラクタが両方とも画面が居に行かない」をレターボックス(テクスチャのサイズに合わせて画面の描画範囲やアスペクト比を設定する)と同じような考えが通用しそうなので、そのアプローチで行きます。

tsubakit1.hateblo.jp

camera.orthographicSizeは高さの半分、つまり1を指定すると2mのオブジェクト(Cube2個分)と一致します。

f:id:tsubaki_t1:20150930015305j:plain

なので縦の距離は簡単。2点の距離を求めて、その半分の長さをsizeに与えてやれば二つともカメラにキッチリ描画されるようになります。

問題は横の長さで、なんかパっと思いつかなかったので力技で解決します。

まず適当にオブジェクト2点を配置し、その2点が綺麗に画面内に収まるSizeを設定します。自分がやった時は、適当にこんな感じで。

で、何か所かサンプリングして法則性を確認した処、どうやら画面比率が4:3の時に「ターゲットの距離幅×0.374」くらいの値で概ね一致する…と。

f:id:tsubaki_t1:20150930021403j:plain

なので次は0.374をひねり出します。少なくともアスペクト比が関連してるので、その値も使って。4:3のアス比はだいたい1.334。

y = x * (1/アス比)*0.5

て事で、二つのポイントがアス比より縦長だったら普通に「2点の高さ/2」、横長だったら「2点の幅 * (0.5/アス比)」なる形が出来た訳です。

ちなみにカメラの距離はVector3.Lerp(白の位置,赤の位置,0.5f)で出ます。

f:id:tsubaki_t1:20150930023659g:plain

あとは、このままだと「キャラクターが半分しか表示されない」ので、キャラクター2体分の余裕を持たせます。もしキャラクターのサイズが異なるなら、中心点をずらすのもやった方が良いかもです。

これは単純に「2点の差分」に追加で「2つのモデルの合計の半分のサイズ」を足してやれば、綺麗に収まります。もう少し余裕を持たせたいなら、もっと足せば良いです。

f:id:tsubaki_t1:20150930024545g:plain

コードはこんな感じです。カメラコンポーネントに付けて2点のTransform(カメラ以外)を設定すると、上のような感じで動きます。

実際に扱う場合は、カメラの座標を直接動かしているコード(UpdateCameraPosition)を任意のGameObjectを動かすように修正することで、色々なエフェクトと混ぜられます。

gist.github.com

ちなみに横スクロールアクションでステージを注目・ズームアウトするような場面では、フレキシブルにズームするより固定値でズームした方が設定が楽だし綺麗になると思います。