コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】iOS / Android でゲーム中にカメラを起動し、撮影した写真や動画をゲーム内で使用できる「Unity Native Camera Plugin」紹介

はじめに

「Unity Native Camera Plugin」を Unity プロジェクトに導入することで
iOS / Android でゲーム中にカメラを起動し、
撮影した写真や動画をゲーム内で使用できるようになります

使い方

この記事では Android における使用方法を紹介していきます

f:id:baba_s:20181222161444p:plain

Unity の Player Settings から「Write Permission」を「External (SDCard)」に変更します

<provider
  android:name="com.yasirkula.unity.NativeCameraContentProvider"
  android:authorities="【Package Name】"
  android:exported="false"
  android:grantUriPermissions="true" />

「AndroidManifest.xml」の <application>...</application> タグ内に
上記の記述を追加します(【Package Name】の部分はパッケージ名に変更)

using UnityEngine;
using UnityEngine.UI;

public class Example : MonoBehaviour
{
    // シーンに配置してある RawImage
    public RawImage m_image;
    public int m_maxSize = 512;

    private void Update()
    {
        // 画面がタップされていない場合スキップ
        if ( !Input.GetMouseButtonDown( 0 ) ) return;

        // まだカメラにアクセスできない場合スキップ
        if ( NativeCamera.IsCameraBusy() ) return;

        // 最大 512 pixel のサイズで写真を撮影
        NativeCamera.TakePicture( OnTake, m_maxSize );
    }

    // 撮影後に呼び出される
    private void OnTake( string path )
    {
        // 撮影されていない場合スキップ
        if ( string.IsNullOrEmpty( path ) ) return;

        // 撮影した写真のテクスチャ情報を取得
        var texture = NativeCamera.LoadImageAtPath( path, m_maxSize );

        // 取得したテクスチャをシーンの RawImage に設定
        m_image.texture = texture;
    }
}

あとは上記のようなスクリプトを作成して使用することで
ゲーム中にカメラを起動して、撮影された写真をテクスチャとして
ゲーム内に表示することができます

using UnityEngine;

public class Example : MonoBehaviour
{
    private void Update()
    {
        // 画面がタップされていない場合スキップ
        if ( !Input.GetMouseButtonDown( 0 ) ) return;

        // まだカメラにアクセスできない場合スキップ
        if ( NativeCamera.IsCameraBusy() ) return;

        // 動画を撮影
        NativeCamera.RecordVideo( OnRecord );
    }

    // 撮影後に呼び出される
    private void OnRecord( string path )
    {
        // 撮影されていない場合スキップ
        if ( string.IsNullOrEmpty( path ) ) return;

        // 撮影された動画を再生
        Handheld.PlayFullScreenMovie( "file://" + path );
    }
}

動画の撮影と再生は上記のようなスクリプトで実装できます