dev-hsimyu

おれが作ったものとかについて紹介したりするブログ

Unity: サブカメラ画面を配置してワールドカメラと切り替え

最近Unityを使い始めたのでメモ代わりに記事を書いていきたいと思います。(クソゲーを作って一発当てるぞ!!!!)

gametukurikata.com

今回はカメラの切り替えの話です。
Unityでサブカメラを配置する場合、ViewportRectを小さくして任意の位置に配置することで可能です。


また複数カメラが存在する場合、カメラの描画順はDepthの値が小さいものから画面寄りに重ねられていきます。
naichilab.blogspot.jp

CameraコンポーネントのViewportRectの値はrectプロパティに、Depthはそのままdepthに格納されているので、
ワールドカメラと主観カメラを切り替えるといった動作を実現する場合、これを入れ替えてやればOKです。

サンプルはこんな感じ(subjectiveCameraのViewportRectの初期値は(0.7, 0.7, 0.3, 0.3)にしています)

public Camera mainCamera;
public Camera subjectiveCamera;
private bool isSubjectiveCameraOn = false;

void Update () {
    if (Input.GetKeyDown("v")) {
        CameraSwitcher();
    }
}

void CameraSwitcher() {
    if (isSubjectiveCameraOn) {
        isSubjectiveCameraOn = false;
        SwitchCameraProperty(subjectiveCamera, mainCamera);
    } else {
        isSubjectiveCameraOn = true;
        SwitchCameraProperty(mainCamera, subjectiveCamera);
    }
}

void SwitchCameraProperty(Camera currentMainCamera, Camera targetCamera) {
    currentMainCamera.depth = targetCamera.depth;
    currentMainCamera.rect = targetCamera.rect;
    targetCamera.rect = new Rect(0, 0, 1, 1);
    targetCamera.depth = -1;
}

rectを毎回newするより直接弄る方が少しコスト小かもしれません。
また、現在どちらのカメラが有効になっているかによって移動方法なども切り替えたいので、booleanで保持するようにしています。
実際の動作を見てみます。

こんな感じにワールドカメラと主観カメラを配置して、

動かします
youtu.be

いい感じですね。
一点、ワールドカメラをPlayerに追随させるために子要素として配置しているのですが、
回転がそのままになるため、カメラ切り替え時のワールドカメラの位置が次の切り替えまでそのまま保持されるような状態になっています。
このへんは好みで調整が必要になりそうです。

はい。