📷

[Unity/iOS][カメラ/AR] 動画録画を画面向きの切り替えに対応させる

2021/08/09に公開

UnityでiOS向けのカメラアプリを作る際に取り入れたTipsです。

はじめに

UnityでiOS向けのカメラ・ARアプリを作る場合、動画録画機能を付けることが多いと思います。
しかし、自由に画面向きを切り替え可能なアプリの場合、録画中に画面を切り替えるとアスペクト比が崩れてしまいます。

自作アプリで撮影した例
Aug-09-2021 14-13-18

標準のカメラの挙動を確認する

iOS標準のカメラでは、「動画録画を開始したタイミングで画面向き切り替えをロックする」という挙動でした。録画を開始したら画面向きの切り替えの必要は無いと思われるため、この挙動を採用し実装したいと思います。

Aug-09-2021 14-08-12

実装

Screen.orientaionで画面向きを指定できるため、録画開始タイミングの向きで固定し、終了時にAutoRotationに戻します。
また、録画開始後にRecorderが破棄された場合でも確実に固定を解除するため、OnDisable()でも解除されるように実装します。コードはこちら。

Recorder.cs

    /// <summary>
    /// 録画開始
    /// </summary>
    public void StartRecording()
    {
        // 画面向きを固定する
        Util.LockScreenOrientation();
        
        // 録画開始の処理
        // ...
    }

    /// <summary>
    /// 録画終了
    /// </summary>
    public void StopRecording()
    {
        // 画面向き固定の解除
        Util.UnlockScreenOrientation();

        // 録画終了の処理
        // ...
    }

    void OnDisable()
    {
        // 画面向き固定の解除
        Util.UnlockScreenOrientation();
    }

Util.cs

using UnityEngine;

public static class Util
{
    /// <summary>
    /// 現在の画面向きで固定する
    /// </summary>
    public static void LockScreenOrientation()
    {
        switch (Screen.orientation) {
            case ScreenOrientation.Portrait:
                Screen.orientation = ScreenOrientation.Portrait;
                break;
            case ScreenOrientation.LandscapeLeft:
                Screen.orientation = ScreenOrientation.LandscapeLeft;
                break;
            case ScreenOrientation.LandscapeRight:
                Screen.orientation = ScreenOrientation.LandscapeRight;
                break;
        }
    }

    /// <summary>
    /// 画面の向き固定を解除する
    /// </summary>
    public static void UnlockScreenOrientation()
    {
        Screen.orientation = ScreenOrientation.AutoRotation;
    }
}


実行結果

iOS標準のカメラと同じように、録画開始後に画面を固定し、録画した動画のアスペクト比が崩れるのを防ぐことができました。

アプリの挙動
Aug-09-2021 14-48-45

おわりに

今回はカメラアプリでの実装紹介でしたが、ARアプリでも活用できそうな内容でした。

Discussion