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

Unity:カメラのViewportRectを調節して解像度対応する

unity

自分用メモ

想定している画面比率と違う場合に
カメラのViewportRectを調節して、全体の表示比率を保ちます。
(上下に黒帯が入ります)
メインカメラのオブジェクトにアタッチして使います。

ゲーム内でカメラの距離が調節できる機能があるなら
要らないかも。

 //カメラの画面比率を調節する
public class CameraAdjuster3D : MonoBehaviour {

    //デフォルトの画面比率
    [Range(5, 16)]
    public int BaseAspectWidth = 16;
    [Range(5, 16)]
    public int BaseAspectHeight = 9;


    void Awake()
    {

        Camera camera = gameObject.GetComponent<Camera>();

        float baseAspect = (float)BaseAspectHeight / (float)BaseAspectWidth;
        float nowAspect = (float)Screen.height / (float)Screen.width;
        float changeAspect;

        if (baseAspect > nowAspect)
        {
            changeAspect = nowAspect / baseAspect;
            camera.rect = new Rect((1.0f - changeAspect) * 0.5f, 0.0f, changeAspect, 1.0f);
        }
        else
        {
            changeAspect = baseAspect / nowAspect;
            camera.rect = new Rect(0.0f, (1.0f - changeAspect) * 0.5f, 1.0f, changeAspect);
        }

    }

}


別バージョン。
Rectじゃなくてカメラの距離を調整して表示比率を保つよ。
こちらは黒帯は入らない。やったぜ。
ただ、注意点として解像度によっては表示範囲が広がるので
見えちゃいけないものが見えないように要確認なのです。
(ポリゴンマップの端とか、出待ちのキャラとか)

public class CameraAdjuster3D : MonoBehaviour {

    //デフォルトの画面比率
    [Range(5, 16)]
    public int BaseAspectWidth = 16;
    [Range(5, 16)]
    public int BaseAspectHeight = 9;


    void Awake()
    {

        Camera camera = gameObject.GetComponent<Camera>();
        float fov = camera.fieldOfView;

        float baseAspect = (float)BaseAspectHeight / (float)BaseAspectWidth;
        float nowAspect = (float)Screen.height / (float)Screen.width;
        float changeAspect;

        if (baseAspect > nowAspect)
        {
           
            changeAspect = baseAspect / nowAspect;
            camera.fieldOfView = fov * changeAspect;
        }
        else if (nowAspect > baseAspect)
        {
            
            changeAspect = nowAspect / baseAspect;
            camera.fieldOfView = fov * changeAspect;
        }

    }


	
}