Skip to content

環境構築

Masahiro Ide edited this page Jun 21, 2021 · 7 revisions

Unityプロジェクトをダウンロードして、apkファイルを作り、OculusQuestで動作を確認するまでの手順です。

検証環境

  • Unity2018.3.8f1,Unity 2018.4.17f1
  • Windows10
  • OculusQuest(Ver14)
  • Oculus Integration(Ver14.0)
  • Photon(Pun:2.17 Photon lib 4.1.3.0)

Unityプロジェクトを開く手順

Unity を入れる

以下からUnity 2018.3.8 or 2018.4.Xをインストールします。

https://unity3d.com/get-unity/download/archive

AndroidBuildSupportにチェックを入れます。

VirtualCollaboBaseをGithubからダウンロード

VirtualCollaboBaseのUnityプロジェクトをGithubからCloneやDownloadZipなどでダウンロードします。

https://github.com/tech-sketch/VirtualCollaboBase

Unityでプロジェクトを開く

ダウンロードしたUnityプロジェクトをUnity 2018.3.8で開きます。

OculusIntegrationのインポート

こちらのOculusのアーカイブページからバージョン14.0をダウンロードします。

https://developer.oculus.com/downloads/package/unity-integration-archive/14.0/

ダウンロードされたOculusIntegration_14.0.unitypackageをUnityにドラッグ&ドロップでインポートします。

右下のImportボタンをします。

インポートには時間がかかります。

その後ポップアップが出た場合、Yes,Upgrade,Restartを押してUnityを再起動します。

Photonのインポート&設定

ルームを管理したり、会話をしたりするのに必要なマルチプレイヤープラットフォームであるPhotonを設定します。

アカウントとIDを作る

Photonのサイトでアカウントを作ります。

https://dashboard.photonengine.com/ja-JP/account/SignUp

「新しくアプリを作成する」を押します

Photonの種別は「PhotonRealtime」と「PhotonVoice」をそれぞれ作ります。

名前は自由です。

2つ作るとこのような画面になります。

アプリケーションIDと書いてある部分をクリックするとID全体が表示されます。このIDを後ほど使います。

Photon Voice 2をインポート

アセットストアからPhoton Voice 2をインストールします。

https://assetstore.unity.com/packages/tools/audio/photon-voice-2-130518

Unityにインポートします。

MicWrapper.csコードの修正

エラーが出ていると思います。

MicWrapper.csのコードを修正します。この作業をしないと、VirtualCollaboBaseでアバターの口パクを動作させる部分でエラーが出てアプリが動きません。

MicWrapper.csをダブルクリックで開きます。検索で探すと便利です。

元のコードの中身をすべて消して、以下のコードをコピーペーストします。

MicWrapper.cs書き換え用
using UnityEngine;
using System;
using System.Linq;

namespace Photon.Voice.Unity
{
    // Wraps UnityEngine.Microphone with Voice.IAudioStream interface.
    public class MicWrapper : Photon.Voice.IAudioReader<float>
    {
        // Change to public static
        public static AudioClip mic;
        private string device;

        public MicWrapper(string device, int suggestedFrequency, Voice.ILogger logger)
        {
            try
            {
                this.device = device;
                if (Microphone.devices.Length < 1)
                {
                    Error = "No microphones found (Microphone.devices is empty)";
                    logger.LogError("[PV] MicWrapper: " + Error);
                    return;
                }
                if (!string.IsNullOrEmpty(device) && !Microphone.devices.Contains(device))
                {
                    logger.LogError(string.Format("[PV] MicWrapper: \"{0}\" is not a valid Unity microphone device, falling back to default one", device));
                    device = null;
                }
                int minFreq;
                int maxFreq;
                logger.LogInfo("[PV] MicWrapper: initializing microphone '{0}', suggested frequency = {1}).", device, suggestedFrequency);
                Microphone.GetDeviceCaps(device, out minFreq, out maxFreq);
                var frequency = suggestedFrequency;
                //        minFreq = maxFreq = 44100; // test like android client
                if (suggestedFrequency < minFreq || maxFreq != 0 && suggestedFrequency > maxFreq)
                {
                    logger.LogWarning("[PV] MicWrapper does not support suggested frequency {0} (min: {1}, max: {2}). Setting to {2}",
                        suggestedFrequency, minFreq, maxFreq);
                    frequency = maxFreq;
                }
                mic = Microphone.Start(device, true, 1, frequency);
                logger.LogInfo("[PV] MicWrapper: microphone '{0}' initialized, frequency = {1}, channels = {2}.", device, mic.frequency, mic.channels);
            }
            catch (Exception e)
            {
                Error = e.ToString();
                if (Error == null) // should never happen but since Error used as validity flag, make sure that it's not null
                {
                    Error = "Exception in MicWrapper constructor";
                }
                logger.LogError("[PV] MicWrapper: " + Error);
            }
        }

        public int SamplingRate { get { return Error == null ? mic.frequency : 0; } }
        public int Channels { get { return Error == null ? mic.channels : 0; } }
        public string Error { get; private set; }

        public void Dispose()
        {
            Microphone.End(this.device);
        }

        private int micPrevPos;
        private int micLoopCnt;
        private int readAbsPos;

        public bool Read(float[] buffer)
        {
            if (Error != null)
            {
                return false;
            }
            int micPos = Microphone.GetPosition(this.device);
            // loop detection
            if (micPos < micPrevPos)
            {
                micLoopCnt++;
            }
            micPrevPos = micPos;

            var micAbsPos = micLoopCnt * mic.samples + micPos;

            var bufferSamplesCount = buffer.Length / mic.channels;

            var nextReadPos = this.readAbsPos + bufferSamplesCount;
            if (nextReadPos < micAbsPos)
            {
                mic.GetData(buffer, this.readAbsPos % mic.samples);
                this.readAbsPos = nextReadPos;
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

アプリケーションIDの設定

Asset>Photon>PhotonUnityNetworkingにResourcesフォルダがあるか確認します。

Resourcesフォルダがない場合手動で作ってください。(このフォルダがないと、次の工程でPhotonServerSettingsが作成できません)  

Window > Photon Unity Networking > PUN Wizzard を開きます。(すでに開いているかもしれません)

Skipを押します。

PhotonServerSettings設定

Window>PhotonUnityNetworking>PUN Wizardを押して、

SetupProjectを押してPhotonServerSettingsを開きます。

(もしくはPhoton>PhotonUnityNetworking>Resourcesの中のPhotonServerSettingsをクリックしても開きます)

Server/Cloud Settings左の三角形を押して入力欄を開き入力していきます。

  • AppID Realtime : webで取得したPhotonRealtimeのアプリケーションID

  • AppID VoiceAppID : webで取得したPhotonVoiceのアプリケーションID

  • Fixed Region : JP

それ以外の項目はデフォルトのままで大丈夫です。

Layerの設定

Asset>VirtualCollaboBase>Scenes>Product>にCoreのシーンがあるので開きます。

CoreのシーンのPlayerオブジェクトの下にあるLocalAvaterのLayerの設定を確認します。設定がAvatarでなければ、後続の設定作業を行います。

Layerの名前の右の上下のUIをクリックし、でできたUIのAddLayerを選択します。

User Layer 8の設定値をクリアします。

User Layer 8の設定値をAvatarに変更します。

LocalAvaterのLayerの設定がAvatarになっていればOKです。シーンを保存します。 Layerの設定作業は以上です。


以上でUnityプロジェクトでの設定は終了です。

以降「apkファイルを作る」 or 「Unityエディタで動かす」の工程に進めます。

apkファイルを作る

SwitchPlatform

File>BuildSettingsでAndroidを選びSwitchPlatformを押します。

かなり時間がかかります。

ビルドするシーンをセットする

SceneInBuildに以下のシーンを以下の順番にセットします。

AndroidSDK

既にAndroidSDKがPCに入っている場合、 Buildを押すと「C:\Users\XXX\AppData\Local\Android\sdkにsdkがありませんが直接sdkを探しますか?」やOpenJDKに関する許可ダイアログが出るのでYesなどを押していけばビルドできます。

今のPCでAndroidビルドをしたことがない場合、AndroidのSDKをインポートする必要があります。

AndroidStudioからダウンロードできます。

https://developer.android.com/studio/?hl=ja

JDK

UnityでEdit>Preference>ExternalToolsでUse Embedded JDKにチェックを入れれば、JDKは自動でインストールされます。

詳しくはこちら!

Unity2018インストールからAndroidビルドするまでの手順

Build

BuildSettings右下のBuildを押してapkファイルを作ります。

保存場所や名前は自由です。

時間がかかります。

成功すると、apkファイルが入ったフォルダが開きます。

apkファイルをOculusQuestに入れる

コマンドプロンプトを使ってadbコマンド経由で入れる方法と、SideQuestという外部ソフト経由で入れる方法を説明します。

こちらの記事が詳しいです。

SideQuestを使ってOculus Questに非公式アプリ(apk)を楽々インストール

Oculus Quest/Oculus Goに非公式アプリ(apk)をインストールする(上級者向け)

(共通)OculusQuestを開発者モードにする

スマートフォンなどに入れたOculusアプリで開発者モードに設定します。

設定>OculusQuestを選択>その他の設定

開発者モードを選択

開発者モードをONにします

(共通)OculusQuestをPCにつなぐ

OculusQuestをPCにUSBケーブルで接続します。 

apkファイルを入れる

*SideQuestを使う場合

SideQuestを以下からダウンロードします。

https://sidequestvr.com/#/download

SideQuestを開き、右上の下矢印マークを押してapkファイルを開きます

もしくは左上のロゴ付近にapkファイルをドラッグします

*コマンドプロンプトを使う場合

コマンドプロンプトを開き、以下のadbコマンドでapkをインストール

adb install apkの場所.apk

新しいPCからOculusQuestにapkを入れる際、OculusQustの画面で、「Allow USB debugging?」(このPCを信頼しますか)のようなダイアログが出るのでOKを押します。

Successと出たら成功です。

(adb install と入力した後に、apkファイルをコマンドプロンプトの画面にドラッグすると楽です)

2回目からは

adb install -r apkの場所.apk

で再インストールができます。

OculusQuestで開く

ライブラリ>提供元不明のアプリからVirtualCollaboBaseを開きます。


ここまででOculusQuestでアプリを動かすための環境構築は終了です。

VirtualCollaboBaseの基本的な使い方はこちら

UnityEditorで動かす

Unityエディタ上で、PCVR(もしくはOculusLink)をつなぎ、動作確認をすることができます。

Asset>VirtualCollaboBase>Scenes>Product>Coreを開きます。

実行をするとアプリが始まります。

PlayerSettings>XRSettings>VirtualRealitySupportにチェックが入っている必要があります。