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

やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Cardboardでもユニティちゃんを表示させてみた

Oculus Rift DK2で表示させたユニティちゃんを、できるだけそのままCardboardTaoVisor立体視してみます。

開発環境などは先のエントリを参照。

Durovis Dive Plugin

Durovis DiveというCardboardクローン的プロダクトがあり、そこでiOS/Android向けに簡単に立体視と視点のトラッキングを実現できるUnityプラグインが配布されています。

以下の手順で適用します。

  1. Dive SDKのページからプラグインをダウンロード(執筆時点のバージョンは2.0 r498)
  2. Assets -> Import Package -> Custom package...でインポート
  3. Project ViewのAssets/Dive/Dive_CameraをHierarchy Viewにドラッグアンドドロップ。従来のカメラを無効化(Inspectorでチェックをoff)
  4. Dive_CameraのTransformを適切に設定(Oculus Riftのときと同じ)
  5. スプラッシュスクリーンの表示が必須とのことなので、AssetsにあるDive-Splashscreen.unityをビルド対象に追加(File -> Build Settings...の"Scenes In Build"に追加)

f:id:nowsprinting:20141103153246p:plain

Oculus Riftに比べて視野角が狭いので、外周の歪みも無い(無くていい)みたい。

Androidデバイス向けにビルドする

Androidデバイス向けのビルドを行ないます。

なお、動作を試すだけなら、Unity Remote 4が使えるはずなのですが、Android版とUnity 4.5.5では同期できませんでした。

ビルドの設定

  1. File -> Build Settings... を開き、Platformの"Android"を選択します
    • ここで"Google Android Project"をonにすると、apkでなくAndroidプロジェクト(Ant版)が出力されます
  2. Build Settingsの[Player Settings...]ボタンをクリックするとInspectorの表示が切り替わり、ここでアイコンなどを設定できます
    • "Other Settings"に、"Bundle Identifier"、"Bundle Version"および"Bundle Version Code"の設定があります。"Bundle Identifier"の設定は必須です
    • "Publishing Settings"に、apkに、署名するためのキーストアの設定があります。デバッグ証明書を使う場合はキーストア未選択のままでいいようです
  3. Unity -> Preferences... -> External Tools の"Android SDK Location"を設定(選択)します
  4. これで[Build]もしくは[Build and Run]ボタンでビルドできます(出力ファイルパスを聞かれます)

コマンドラインでビルド

AndroidアプリはUnityコマンドで直接ビルドできないため、Unityプロジェクト内にビルドを実行するスタティックメソッドを作成し、それをコマンドラインから呼び出します。

ビルドメソッドの作成

まず、スクリプトの格納フォルダを作ります。Assets -> Create -> Folderでフォルダを生成。名前をEditorに変更します(namespace UnityEditorをエラーにしないために必須)。

続いて、Project ViewのEditorフォルダを右クリック -> Create -> C# Scriptでスクリプトを生成します。名前は任意ですが、クラス名と一致させる必要があるのでここではBuilder.csとしました。

using UnityEngine;
using UnityEditor;

public class Builder {

    static void BuildAndroid(){
        string[] scenes = {
            "Assets/Dive/Dive-Splashscreen.unity",
            "Assets/UnityChan/Scenes/UnityChan_hw.unity"};

        string msg = BuildPipeline.BuildPlayer(
            scenes,
            "Build/UnityChanVR.apk",
            BuildTarget.Android,
            BuildOptions.None);

        if(!string.IsNullOrEmpty(msg)){
            throw new System.Exception(msg);
        }
        Debug.Log("Build completed ");
    }
}

失敗時は例外をスローすることで、Unityコマンドが終了コード1で終了します。

コマンドライン指定

次のコマンドで、BuilderクラスのBuildAndroid()メソッドを実行できます。

$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile /dev/stdout \
    -executeMethod Builder.BuildAndroid

なお、

  • Unityは二重起動できないため、コマンド実行時Unityは落としておく必要があります(MonoEditorは起動していてok)
  • 出力ファイルは上書きしてくれますが、必要なディレクトリ(上例ではBuildディレクトリ)はあらかじめ掘っておきます
  • -logFile /dev/stdoutを指定することで、通常コンソールに出力されるログを標準出力に出力できます

iOSデバイス向けにビルドする

iOSデバイス向けのビルド(正確には、iOS向けのXcodeプロジェクトの出力)を行ないます。

なお、動作を試すだけなら、Unity Remote 4を使うと便利です。

OpenDiveSensor.csの修正

そのままiOS向けビルドを行なうと、Assets/Dive/OpenDiveSensor.csでAndroidJavaObjectが見つからないというエラーが出ます。このオブジェクト宣言自体が不要なので*1以下は削除します。

AndroidJavaObject mConfig;
AndroidJavaObject mWindowManager;

Oculusパッケージをプロジェクトから取り除く

OculusUnityIntegration.unitypackageをインポートしている場合、それがシーンで使用されていなくてもビルドエラー*2が出るようです。iOSデバイス向けでは使用しないので、Project ViewのAssets/OVRを削除します。

ビルドの設定

  1. File -> Build Settings... を開き、Platformの"iOS"を選択します
    • "Symlink Unity libraries"は、UnityのライブラリをXcodeプロジェクトにコピーしないため高速に動作します。XcodeプロジェクトだけCIサーバなどでビルドするのでなければonでいいはず
  2. Build Settingsの[Player Settings...]ボタンをクリックするとInspectorの表示が切り替わり、ここでアイコンなどを設定できます
    • "Other Settings"に、"Bundle Identifier"と"Bundle Version"の設定があります
    • "Bundle Identifier"は、Info.plistのCFBundleIdentifierにセットされますが、末尾は${PRODUCT_NAME}に置き換えられます
    • "Bundle Version"は、Info.plistのCFBundleShortVersionStringCFBundleVersionの両方にセットされます
  3. これで[Build]もしくは[Build and Run]ボタンでXcodeプロジェクトを出力できます(出力ファイルパスを聞かれます)

コマンドラインでビルド

iOSアプリ(Xcodeプロジェクト)もUnityコマンドで直接ビルドできないため、Unityプロジェクト内にビルドを実行するスタティックメソッドを作成し、それをコマンドラインから呼び出します。

ビルドメソッドの作成

Android向けに作成したBuilderクラスに、BuildIos()メソッドを追加します。

using UnityEngine;
using UnityEditor;

public class Builder {

    static void BuildAndroid(){
        (snip)
    }

    static void BuildIos(){
        string[] scenes = {
            "Assets/Dive/Dive-Splashscreen.unity",
            "Assets/UnityChan/Scenes/UnityChan_hw.unity"};

        string msg = BuildPipeline.BuildPlayer(
            scenes,
            "Build/UnityChanVRiOS",
            BuildTarget.iPhone,
            BuildOptions.SymlinkLibraries);

        if(!string.IsNullOrEmpty(msg)){
            throw new System.Exception(msg);
        }
        Debug.Log("Build completed ");
    }
}

コマンドライン指定

次のコマンドで実行します。

$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile /dev/stdout \
    -executeMethod Builder.BuildIos

Xcodeプロジェクトのビルド

生成されたプロジェクトは、Xcodeでビルドできます(Xcode 6.0.1で確認)。 Xcodeプロジェクトをコマンドラインでビルドするにはxcodebuildコマンドを利用できます。詳しくは『iOSアプリ テスト自動化入門』のChapter 6などを参照してください。

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門

参考

Unity実践技術大全 (GAME DEVELOPER BOOKS)

Unity実践技術大全 (GAME DEVELOPER BOOKS)

ライセンス

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

*1:Android向けに必要な物は"#if UNITY_ANDROID"の中に書かれているので

*2:Cross compilation job Assembly-CSharp.dll failed.