yumeの日記: Unity制作 メデューサ・ゲーム #18
●カメラ
1-1~1-3、2-1、3-2、3-3が完成した。
ここまでは一画面に収まるステージばかりだったが、もう少し複雑なステージを作るとなるともっと広いステージが必要だ。
ならばカメラの仕組みも少し変えなければならない。
カメラの仕組みはおおむね二つの方向性がありそうだ
A 縮尺を変えて、あくまで一画面でパズルをとらえる方式
B プレイヤーを中心してカメラを動かす方式
ゲームの主体はパズルなので、基本的には全体が見えた方がストレスがなさそうだが、細かい調整が必要な場面もありうるので、基本はBで作っていこう。
さらに、それにマウススクロールなどで縮尺を変える機能をつければよさそうだ。
Unityのパッケージマネージャから「Cinemachine」というパッケージがダウンロードできる。よく使うようなカメラの動きなどを設定できるものだそうだ。2D用の機能もある。
これを入れて、メインカメラと合体し、Cinemachine側で「追従・プレイヤー」と設定しておく。
カメラの縮尺は、2Dの場合OrthographicSizeを使えばよいようだ。このサイズが5.4fのとき、1920x1080のスプライトを同じ幅にピッタリ描画してくれているようだ。
これを基準に、zoomMagnitudeに入力分の値(ここではマウススクロールで+-0.1刻み)を足して、最終的にそれが縮尺倍率として画面に表示される。
zoomMagnitudeが1.0ならorthographicSizeは5.4、2.0なら10.8だ。縮尺でいうと1倍~0.5倍となる。
この時、視界を覆い隠す一枚のスプライトオブジェクト(mySightFog)は1920x1080で設定してあったので、カメラを縮小する(=視野を広くとる)と、このスプライトがカメラに対して小さくなってしまう。
そこで一旦無理やりだがこのオブジェクトのスケールを同じ倍率で拡大縮小することでなんとかした。しかし動作としてはちょっと気持ち悪いし、実際拡大縮小時にちらついている部分があるので、初めから最大倍率の一枚のスプライト(またはスプライトタイル)にした方がよいかもしれない(今の表現はちょっと面白いけど)。
private void ChangeCameraZoom(float changeValue)
{
zoomMagnitude = Mathf.Clamp(zoomMagnitude + changeValue, 1.0f, 2.0f);
myCVC.m_Lens.OrthographicSize = zoomDefault * zoomMagnitude;
mySightFog.transform.localScale = new Vector3(zoomMagnitude, zoomMagnitude);
}
そもそもなぜちらつくんだろう。FixedUpdate内で実行すればちらつきはなくなるが、入力がたどたどしくなってしまう。
あるいはカメラまたは画面自体にかぶせて、けどミスティや鏡の視野のメッシュでマスクできる状態を作ることができればいいのかもしれないが……。うーむ。
他にも少し気になることとして、ミスティが移動中に少しがたがたしていることがある。これはカメラとの兼ね合いだろうか。
Unity制作 メデューサ・ゲーム #18 More ログイン