FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »VR
このページの記事一覧

【Unity】VRoid(VRM)をインポートして動かす  


 VRoid Studio が 8/3 に一般公開されたのでさっそく触ってみた。


 VRM 形式は VRChat が流行った経緯もあり、3Dアバターファイルフォーマットとして新たに MMD とは別に VR 用として利用できるフォーマットだ(そのためか VRoid 上では A ポーズだね(笑))。Unity 向けの C# による標準実装(UniVRM)がオープンソースで提供されていて、簡単に扱えるということなので試してみた。

 実際にとても簡単で、ざっくり説明しておくと、UniVRM の Unity パッケージが配布されているので、それをプロジェクトにインポートし、VRoid Studio で作ったキャラをエクスポート(*.vrm ができる)。保存した VRM ファイルをプロジェクトにインポート(ドラッグ&ドロップでOK)すれば良い。あとは見た目が少しおかしくなったりするので、その辺りを適当に修正し、以前にやった方法で歩かせたりすれば動かせる。そんな感じだ。


(※) Unity 5.6.3p1 - 2018.2.1f1 / VRoid Studio 0.1.1 - 0.2.3 / UniVRM 0.40 / Windows10(x64) で確認



●VRoid Studio から VRM を作成する

1.まだ VRoid Studio をインスールしてないなら、公式サイトからダウンロードして、インストールしよう。ページの下の方へ行くと、Windows版 と Mac版 の両方がある。アーカイブを解答したら、そのフォルダ(ファイル)ごと移動すれば使えるようだ。

VRoid Studio

 ただ、私がバージョン 0.1.1 と 0.2.0 を試した所、保存したデータが完全互換では無いようだ(というか髪の位置がずれる)。またインストしたフォルダが別れていると(「VRoidStudio-v0.1.1-win」「VRoidStudio-v0.2.0-win」のように)起動時の「開く」メニューの一覧には出てこない(そして起動後には他のデータを読み込めない)。キャラを作り込むのは正式版が出てからの方が良いかも知れない(笑)。まぁ、現在はベータ版なので、今後改善されることを願おう。

●ver.0.1.1 で作ったもの


●ver.0.2.0 で読み込んだら髪の位置がずれた(笑)

※「髪型編集」で「手描きグループ1」を選択肢、「ガイドパラメータ>高さ」を調整すると直るようだ。


2.「新規作成」でキャラを作った場合は少なくとも髪だけは付けておこう。実際最初に髪を塗るのが面倒だったので(笑)、そのままデフォルトでエクスポートしてみたが、Unity で読み込んだら髪の部分だけ空の白いメッシュが重なってしまった。面倒だったらアホ毛一本でも良いかも知れない(笑)。


3.後はとにかくキャラができたらファイルのメニューからエクスポートするだけだ(ver.0.2.x 以降は「撮影・エクスポート」に移動した)。また、私が試したのは ver0.1.1 だったが、アプリが不安定なのか、閉じようとしたらフリーズしたりするので、なるべく途中経過は保存(Ctrl+S)しておいた方が良いかも知れない。

 エクスポートしたファイル(*.vrm)は「C:\Users\(ユーザー名)\Documents\vroid\avatars」(※Windows版)のように、個人用のドキュメント以下に作られるようだ。


※下のボタンが見えない場合は、ウィンドウを広げれば見えるようになる




●VRM を Unity にインポートする

1.Unity のプロジェクトを開いたら、まずは先に変換ツール「UniVRM」をプロジェクトにインポートしよう。

UniVRM

 パッケージは「UniVRM-x.xx.unitypackage」と「UniVRM-RuntimeLoaderSample-x.xx.unitypackage」(x.xx はバージョン)の2つがあるが(掲載時点:0.40)、「~RuntimeLoader~」となってる方は、実行時にリアルタイムに読み込む方法のようだ。ここでは「UniVRM-x.xx.unitypackage」の方をインポートして欲しい。


 「API Update Required」ダイアログが出たら「I Made a Backup. Go Ahead!」(自動でアップデート)で良い。



2.UniVRM のインポートが終わったら、VRoid Studio でエクスポートした VRM ファイルを適当なフォルダでも作って(ここでは「Model」としている)、エクスプローラーから(※Windowsのとき)ドラッグ&ドロップしよう。インポートにはしばらく時間かかるが、変換が完了したら、ドロップしたフォルダにプレファブができる


「NormalMap settings」が出たら「Ignore」の方が良いかも知れない。「Fix now」でも構わないが、インポート(変換)したマテリアルがギラギラとする(NormalMap を手動で直すしかない)。私はその辺りはあまり詳しくないのでお任せする(←とりあえず動けば良い人(笑))。
(※ver.0.2.x 以降では修正されてるようなのでどちらでも可。)



3.あとはプレファブをヒエラルキーに置いて、カメラやモデルの位置を調整すれば良い。ここではカメラの Z軸を -2 に、モデルの Y軸の回転を 180 度にしてカメラに写している。


※「NormalMap settings」は「Ignore」にしている




●VRoid(VRM)キャラを動かす

 VRMのインポートに成功したら、キャラを動かしてみよう。基本的には以前に書いた「SDプロ生ちゃんを動かす!」と同じ方法で良い。大まかに説明すると、歩行モーションなどのアニメータや、キー入力を判定するスクリプトをモデルにアタッチすれば良い。ただ、一から作るのは結構大変なので、とりあえず既存のアセットやスクリプトを利用して動かしてみよう。

1.歩行モーションなどはユニティちゃんのアセットを利用するので公式サイトからダウンロードしよう。サイトにアクセスして、画面右上の「DATA DOWNLOAD」を押し、規約を読んだら一番下の方にある「ユニティちゃんライセンスに同意しました。」をチェックし、「データをダウンロードする」でダウンロードページへ移動できる。ここでは「ユニティちゃん 3Dモデルデータ」を押してパッケージをダウンロードして欲しい。

 また、ここでは余談になるが、ユニティちゃんパッケージは Unity4 時代からリリースされているので、ユニティちゃん自体を使いたいときは、「ユニティちゃんシェーダー (Unity 5.4/5.5β 対応版)」や「ユニティちゃんスクリプト(Unity 5 修正パッチ)」もダウンロード&インポートした方が良い。

ユニティちゃん公式


2.パッケージをダウンロードしたら、プロジェクトにインポートしよう(掲載時点:UnityChan_1_2_1.unitypackage)。
インポートしたら、ヒエラルキーに置いた VRoid のモデルをクリックし、インスペクタで「Animator>Contoller」に「UnityChanLocomotions」をセットしよう。エディタでプレイしてみればわかるが、これだけで立ちアニメーションが再生される(わかりづらいかも知れないが、拡大してみると、ゆっくりと呼吸してるようにアニメしている)。



3.アニメーションするようになったら、次に操作できるようにスクリプトをアタッチする前に、ヒエラルキーで空のオブジェクトを作り(Creat Empty:ここでは「VRoid_Locomotion」としている)、その子要素になるように VRoid モデルをドロップしよう。また、親オブジェクト(VRoid_Locomotion)の Position や Rotation などは全て (0, 0, 0) にしておく(微調整はモデルの方の Transform でやる)

 これはそのモデルを変更したくなったとき、簡単に中身だけ変えられるようにしておく処置だ。VRoid Studio 本体もしばらくはアップデートされるだろうし、その互換性も微妙なようなので、このようにしておくと更新時に非常に楽になる。



4.VRoid モデルを空オブジェクトの子要素に置いたら、次に操作スクリプトを親オブジェクト(VRoid_Locomotion)にアタッチしよう。ここではユニティちゃんの操作スクリプト「UnityChanControlScriptWithRgidBody.cs」に少し修正を入れて、他のキャラでも使えるようにした「UnityChanControlScriptWithRgidBodyForAny.cs」スクリプトをアタッチする。そのスクリプトは以下からダウンロードして欲しい。

>>サンプルのスクリプトをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)


5.スクリプトをアタッチしたら、「Rigidbody」の「Constrains>Freeze Rotation」と「Capsule Collider」の「Center>Radius」「Height」だけは調整しておこう。シーンビューを平行投影モードにすると調整しやすい。真横からみると VRoid モデルは少し足が埋まってしまうようなので(※VRoid Studio 0.1.1 で作った場合(?))、ここでは子要素(モデル)の Y軸を 0.07 だけ上げている。値は任意で良い。



●モデルの Position.Y だけ 0.07 にして少し調整している(※VRoid Studio 0.1.1 で作った場合(?))


6.ここまでできたらプレイしても良いが、床が無いので奈落の底に落ちる(笑)。ヒエラルキーに Cube を置いて床にしても良いが、せっかくなので、モックに使えるアセットをインポートしてみよう。

 Unity2017 まではメニューから「Assets>Import Package>Prototyping」でアセットをインポートできたのだが、Unity2018 以降はどうやら「StandardAssets」は廃止されたようだ(たぶんインポートしたアセット同士でバージョンによるエラーや競合などのトラブルが発生しやすいため)。まぁ、オブジェクトだけなら Unity4 時代のものでも問題は無いので(スクリプトやシェーダーは古いバージョンをインポートするとエラーが出やすいので注意)、アセットストアから「Sample Assets (beta) for Unity 4.6」をダウンロードしよう。

Sample Assets (beta) for Unity 4.6


7.ダウンロードが完了したらインポートするときに、ダイアログで一度「None」を押し、全てをオフにしてから、「Prototyping」のフォルダのみをチェックしよう(Prototyping 以下は自動でチェックが入る)。全てをインポートすると時間がかかるのと、エラーが出る可能性があるので、気をつけよう(Unity4 時代のものは特に)。



8.インポートができたら、フォルダ「Standard Assets/Prototyping/Prefabs/」以下に色々なオブジェクトが入っている。床には「FloorPrototype64x01x64」辺りを置けば良いだろう。他にも階段「Step~」、坂「Ramp~」など色々あるので、好きに置いてみると良いだろう。

 ちなみに、Ctrl キーを押しながらオブジェクトをドラッグすると、一定幅で移動することができるので、グリッド状にキレイに配置することができる。この幅はメニュー「Edit>Snap Settings...」で設定できるので上手に使おう。



9.プレイしてみると上手く動いただろうか?動くには動いたが、カメラは追従してないかも知れない。カメラを追従させる方法は、一番簡単なやり方だと、「Main Camera」を作ったキャラの子要素にしてしまえば良い。ヒエラルキーで「Main Camera」を「VRoid_Locomotion」にドラッグ&ドロップしよう。子要素にしたら距離やアングルなどを調整して完了だ。




 カメラをスムーズに動かすには以前の記事「SmoothFollow3」辺りを使うと良い。ちなみにアセットストアで配布しているプラグインにはスワイプ、ドラッグ、ピンチ操作できるスクリプトなども一緒に入っているので、スマホなどで使ってみたいときには良いだろう。




※カメラスクリプト「SmoothFollow3」はプラグインにも同梱されています。





(関連記事)
【Unity】VRM(VRoid)をライブステージで踊らせるアプリを作ってみた
【Unity】【C#】Android で VRM(VRoid)を動的に読み込む
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】SDプロ生ちゃんを動かす!
【Unity】SDユニティちゃんを動かす!(Unity4)
【Unity】【C#】ユニティちゃんをサクっと簡単に動かす!(Unity4)
【Unity】【C#】SmoothFollow3(SmoothFollow に回転・遠近・高さ操作とピンチ・スワイプとの連携機能を付けた拡張版)


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: VR  VRoid  VRM  Unityオープンソースライブラリ  サンプル 
tb: 0   cm: --

【Unity】スマホで簡易360度(パノラマ, 全天球)ビューワを作る  


 タイトルは "スマホ"(※Android)となっているが、実際には他のプラットフォームでも関係ないので、作り方を覚えおけば色々応用が効くだろう。特に全天球への画像(動画)貼り付けは VR に使えばそのまま背景にできるので、Cardboard VRGearVROculus Go などにも簡単に流用できる(というより、元々「VRコンテンツ開発ガイド 2017」を以前読んでいたので、それをスマホに応用した)。ミクシータ(RICHO THETA) など360度カメラを持っている人は、保存した画像をそのまま使えるので試してみると良い(持ってなくても Google Play のアプリのサンプルでスマホに画像を保存すれば確認できる)。ARに応用してる例もあるね。


 なお、今回の記事はプラグインのギャラリー読み込みデモ(GalleryPickTest)のセットアップも兼ねている。サンプルシーンを使えば1から構築する必要はないので、すぐに試してみたい人はプラグインをダウンロードして欲しい。AssetStore版(ver.1.15以降[無料])GoogleDrive版の2つがあるが、基本的にはどちらも同じものだ。好きな方で構わない。

>>GoogleDrive版 プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

>>AssetStore版をダウンロード


※とりあえず試してみたい方は、最新版をビルドした apk デモをダウンロードできます。動作確認にもどうぞ。

プラグインデモをダウンロード
(Google Drive を利用)


Android 4.2以上
※「提供元不明アプリのインストール」許可が必要です。


 プラグイン自体のセットアップは以前の記事を参照して欲しい(>>GoogleDrive版 | >>AssetStore版)。デモが入っているパスは GoogleDrive 版では「Assets/_Test/」に、AssetStore版は「Assets/FantomPlugin/Demo/」となっているので適宜置き換えて欲しい。ファイル名は基本的に同じだ。


(※) Unity 2018.1.0f2 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■全天球素材のダウンロードと設定(360度ビューワ)

 360度のビューワを作る際には法線が内側を向いている球状メッシュを使う必要がある(Unityのデフォルトの球状メッシュは外側向き)。要するに球の内側から覗いたとき映像が見える必要があるので、通常は3Dモデリングツールなどで素材を作らなくてはならない。しかし幸いにも素材を提供してくれている方がいるので、有り難く使わせて頂こう(素材を提供してくれる人は神ですね(笑))。以下のページにある「Sphere100.fbx」(※ページ内で検索するとすぐ見つかる)をダウンロードして欲しい。

UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】 で「Sphere100.fbx」をダウンロード(※直接ダウンロードが簡単)。


 ダウンロードが完了したら、プラグインのサンプルシーンを使って実際にセットアップしてみよう。プラグインを利用している箇所はスマホから画像や動画のパスを取得しているだけなので、あらかじめプロジェクトに素材を含んでいる分にはプラグイン機能を使う必要はない。画像や動画を動的に貼り付ける部分は Unity の機能なので、コピペして色々なアプリに応用すれば良いだろう(「GalleryPickTest2.cs」にまとめてある)。それでは以下の方法で、サクッと簡単に360度のビューワを作ってみよう(笑)。


1.ダウンロードした「Sphere100.fbx」を Unity のプロジェクトにドラッグ&ドロップしよう(任意のフォルダで良い)。またインポートした「Sphere100」をクリックして、インスペクタで「Model>Scale Factor」を「1000」にしておく(大きさは任意でも良い)。





2.次にギャラリーから画像を取得するデモシーン「GalleryPickTest」(GoogleDrive版は「Assets/_Test/Scenes/」, AssetStore版は「Assets/FantomPlugin/Demo/Scenes/」内にある。検索を使うと簡単)を開こう。このデモはスマホの標準ギャラリーアプリを開き、画像や動画のパスを取得して Unity に取り込むものだが、オプション(形状)の「360 degrees」にはダミーのテキスト「Please replace with 'Sphere100', and set 'TextureMat' as material.」が表示されるのみで何も表示されない(プレイして「360 degrees」を押してみるとテキストが表示される)。このダミーテキストを全天球メッシュに置き換えることで、簡易360度ビューワにすることができる。



3.ヒエラルキーから「Stage」を開こう。この中にある「Sphere100 (360degrees Dummy)」(画像用)と「Sphere100Video (360degrees Dummy)」(動画用)が全天球ダミーなわけだが、この階層にインポートした「Sphere100」をドラッグ&ドロップしてオブジェクトを配置しよう。「Sphere100 Video」となってる方は「Sphere100」を複製(Ctrl-D)して名前を変えただけのものである。



4.各オブジェクトの Position が (0, 0, 0) となっているのを確認したら、次に Scale を変更しておこう。大きさは任意で良いが、ポイントは X軸を負の値にしておくことだ。これは正の値で試して見ればわかると思うが、カメラは球の内側から覗く感じになるので、正の値だと画像が左右反転して見える。なので、負の値にしておけば人の目には正しい方向に見えるというわけだ。またついでにオブジェクトに影を付ける処理は必要無いので、すべてオフにしておくのも良い(このデモでは影の無いマテリアルを使うので必須ではないが[※後述↓手順5])。

●画像用全天球「Sphere100」


●動画用全天球「Sphere100 Video」

※マテリアルのセットは下記(↓手順5)


5.あとは全天球に画像を映し出すためにマテリアルをセットしよう。GoogleDrive版では「Assets/_Test/Metarials/」に、AssetStore版は「Assets/FantomPlugin/Demo/Metarials/」に画像用の「TextureMat」、動画用の「VideoRenderTextureMat」があると思うので(プラグイン ver1.15以降)、それらをそれぞれ「Sphere100」「Sphere100 Video」の「Materials」にセットして欲しい。上記(↑手順4)のインスペクタのような感じになる。


 ちなみにこの「TextureMat」と「VideoRenderTextureMat」は特別なものではなく、「TextureMat」はプロジェクトビューで右クリックして「Create>Material」で新規マテリアルを作成し、インスペクタで「Shader」を「Unlit>Transparent」にしただけのもので、「VideoRenderTextureMat」の方は、先に「Create>Render Texture」を作っておき、同じように新規マテリアル(Create>Material)で「Shader」を「Unlit>Texture」にして、テクスチャに作っておいた「Render Texture」をセットしただけのものだ。ほぼデフォルトのままなので、必要あれば調整などは適当にやって欲しい(※ただし、このデモでは GalleryPickTest2.fitRenderTexture = true のとき、Render Texture を動画サイズに合わせて動的に生成するので、実際には使ってない。fitRenderTexture = false にするとセットした「VideoRenderTexture」を使うようになる[※解像度が固定サイズで良いときなどに使うと、負荷が少し軽くなる])。


6.最後にデモスクリプトの「GalleryPickTest2」をヒエラルキーで選択して、「Sphere」と「Video Sphere」にそれぞれ「Sphere100」「Sphere100 Video」のオブジェクトをセットしよう(初期状態では「Dummy」がセットされている)。これで準備は完了だ。






 エディター上でプレイして「360 degrees」をクリックしたら、背景が真っ白になったら成功だ(画像が読み込まれてないので白いだけ)。ビルドして実機で確認する方法はこちらの記事を参照して欲しい。

デモのビルド




 通常の画像を読み込んでも良いが、天井と底面の方を見ると収束してるので、せっかくなので全天球画像を読み込んでみよう。なんとあの日本列島360の全天球静止画がBOOTHにて無料で配布されている(まさに神!)。これをダウンロードしてスマホのストレージにコピーしよう。ギャラリーから読み込むと超美麗な360度画像を楽しむことができる(利用方法は規約に従ってね)。




 また以下のミクシータのアプリをインストして、保存したサンプルの画像を読み込んでみるのも良い。VR空間で見ると、まるでその場所にいるようで更に面白い。GearVR はそのままホーム>ギャラリーで観れるが、Cardboard なら色々ビューワアプリが出てるので観てみると良いだろう。ちなみに Unity 使える人なら、Cardboard VRGearVR も作るのはそう難しくはない(むしろVR内操作 UI 作る方が難しいね(笑))。しかし、全天球メッシュにあらかじめ画像を貼り付けておけば簡単に360度にできるので、挑戦してみるのも良いだろう。

RICOH THETA Type HATSUNE MIKU (Google Play) ※カメラが無くても、サンプル画像が入っているので、保存すれば360度画像を試せる。
VU Gallery VR 360 Photo Viewer (Google Play) ※Cardboard の360度ビューワアプリ
【Unity】GearVR アプリをビルドする







(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】GearVR アプリをビルドする
【Unity】ARCore を使って現実世界にプロ生ちゃんを召喚してみる



初音ミク」はクリプトン・フューチャー・メディア株式会社の著作物です。
© Crypton Future Media, INC. www.piapro.net (PCL)

このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License

関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン  FantomPlugin  VR 
tb: 0   cm: --

【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする  


 これは音量操作のプラグインのアップデート版となる。以前の記事にはプラグインの内部的なコード(Java)や仕様説明を書いたので、今回は Unity 側のコードやプレファブの使い方などを中心に書いておこう。プラグイン自体のセットアップからはじめる場合は、以前の記事を参照して欲しい。

>>プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)



(※) Unity 5.6.3p1 / AndroidStudio 2.3.3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■ハードウェア音量操作する際の AndroidManifest.xml について

 プラグインのセットアップにも書いてあるが、ここではもう少し詳細に解説しておこう。ハードウェア音量ボタンを押したときのイベントを取得する際には Unity で通常使われるアクティビティ「UnityPlayerActivity」をオーバーライドした、「HardVolKeyOnUnityPlayerActivity」(ハードウェア音量イベント取得用アクティビティ:プラグイン内に入っている)または「FullPluginOnUnityPlayerActivity」(プラグイン機能のすべてが入っている)を使う必要がある。これらのアクティビティ(Activity)はこのプラグイン独自のアクティビティで、ハードウェアキーのイベントを監視するコードが含まれている(初期のバージョンではあるが、Java コードは以前の記事に掲載してある)。インポートした「Assets/Plugins/Android/」にはマニフェストファイルのテンプレとして「AndroidManifest-HardVolKey~.xml」または「AndroidManifest-FullPlugin~.xml」が含まれているので、これらの中から適切なものを選んで(「縦置き・横置き」とか「API Level」とか)、「AndroidManifest.xml」にリネームしてビルドすることで利用することが可能になる。音量の取得・増減だけなら特別な権限はいらないので、使用するアクティビティさえ指定すれば、独自に書き換えても構わない。


 なお、ハードウェアボタンのイベントを受け取らず、Unity から一方的に音量を設定するだけなら、オーバーライドしたアクティビティを使う必要はない。具体的には例えば、後述する「GetMediaVolume()」「SetMediaVolume()」「AddMediaVolume()」(ハードウェア音量[メディア音量のみ]の取得と設定)のみの使用なら、これらマニフェストファイルは必要ない(Unity がデフォルトのマニフェストファイルを用意してくれる)。

(※) 独自のマニフェストファイルでビルドすると警告「Unable to find unity activity in manifest. You need to make sure orientation attribute is set to sensorPortrait manually.」が出るが、「UnityPlayerActivity」以外のアクティビティを使うと出るものなので気にしなくて良い(orientation=画面回転はUnity側のアプリの設定に合わせた方が良い)。



■HardVolumeController(プレファブ)の使い方

 サンプルシーンにも含まれている「HardVolumeController.prefab」はスクリプト「HardVolumeController.cs」をアタッチしたハードウェア音量操作をするプレファブである。同じように「HardVolumeControllerWithToast.prefab」「HardVolumeControllerWithToast.cs」というものも入っているが、これらは音量が操作されたときにプラグインでトースト(Toast)で現在音量を表示する機能を追加しただけのものである。つまり音量の表示方法以外は内容的に変わらないので、例ではどちらの場合でも置き換えて考えて欲しい。

 端末と連携してこれらプレファブを利用するには、オプションの設定とコールバックを上手く使う必要がある。少しその辺は紛らわしいので、その解説と設定例などをなるべく詳細に書いておこう。


●オプション設定やコールバックの説明
Enable Hard Keyこのスクリプトからは常にハードウェアの音量操作はできるのだが(Unity → Android)、端末のハードボタンを押したときにもスクリプトを利用するか否かの設定(Android → Unity[→何らかの動作])をするオプションとなる。別の言い方をすれば、「端末のハードボタンを押したときのイベントを受け取るか否か」と同義だ。端末のハードボタンと連携したいときはオンにする必要がある。オンにしたとき、端末のハードボタンで音量大を押すと Android → Unity へ "VolumeUp" メッセージ(文字列)が送られ、コールバック:OnHardVolumeKeyUp() が呼ばれる。同じようにハードボタンで音量小を押したときは Android → Unity へ "VolumeDown" メッセージが送られ、コールバック:OnHardVolumeKeyDown() が呼ばれる。インスペクタでこれらコールバックに何らかのメソッドを登録しておけば、端末のハードボタンを操作したとき独自のアクションが設定できる。オフにしたときは、端末のハードボタンのイベントを無視するので、端末側で操作したときの影響は受けない(端末での操作とは別々になる)。デフォルトはオフ(Unityでの操作、端末での操作は別々に行える)。
Hard Operation端末のハードボタンを押したとき、端末自身での音量操作をするか否かのオプション。オフにすると端末自身での音量操作は無効となり、Unity 側だけの音量操作となる。「Enable Hard Key」をオンにすることでハードボタン押下のイベントは受け取れるので、「Hard Operation=オフ+Enable Hard Key=オン」の組み合わせで「Android 端末で音量無効→イベントだけUnityで受け取る→コールバックでUIなどを表示→UnityからAndroidへ音量設定」のような流れを作ることで Unity 側でのハード音量操作を完全に制御できる。逆に「Hard Operation=オフ+Enable Hard Key=オフ」にするとユーザーは音量操作が全くできなくなってしまうので注意。デフォルトはオン(Android端末側でも音量操作は可能)。
Show UIUnity で音量操作を行ったとき、端末のシステムUIを表示するか否かのオプション。あくまで Unity 側からの操作のときのみなので、端末自身のハードボタンで操作したときには影響しない。
On Volume Called(int)
(コールバック)
音量の増減操作や現在の音量取得をしたときのコールバック。通常は UI などの呼び出しに使うと良い。「HardVolumeControllerWithToast」はこのコールバックでトースト(Toast)を呼び出すセットアップがされている。独自の UI などを作成したときはここにその表示メソッドを登録すれば良いだろう。引数の値(整数)は操作後の音量となる。
On Hard Key Volume Up
(コールバック)
端末のハードボタンで音量が上げられたときのコールバック。ハードボタン押下のイベントを受け取る必要があるので「Enable Hard Key=オン」である必要がある。「Hard Operation=オフ」のときは、端末自身で音量操作ができなくなるため、ここに音量アップのメソッドを登録すると良い(HardVolumeController.VolumeUp() でも良い)。「Hard Operation=オン」のときは、端末自身で音量操作ができるため、現在音量の表示だけで良いだろう(HardVolumeController.VolumeNow() 等)。逆にハードボタンを無視するならば登録する必要はない。
On Hard Key Volume Down
(コールバック)
端末のハードボタンで音量が下げられたときのコールバック。ハードボタン押下のイベントを受け取る必要があるので「Enable Hard Key=オン」である必要がある。「Hard Operation=オフ」のときは、端末自身で音量操作ができなくなるため、ここに音量アップのメソッドを登録すると良い(HardVolumeController.VolumeDown() でも良い)。「Hard Operation=オン」のときは、端末自身で音量操作ができるため、現在音量の表示だけで良いだろう(HardVolumeController.VolumeNow() 等)。逆にハードボタンを無視するならば登録する必要はない。




■HardVolumeController のセットアップ例

 言葉で説明すると少し難しく感じるので、簡単なセットアップ例を掲載しておこう。サンプルのシーンには微妙に異なったセットアップのプレファブが配置してあるので、動作確認して自分の使いたい機能に近いものを利用するのも良いだろう。

(例1)端末自身のハードボタン・Unity ともに音量操作をしたとき、端末のシステムUIとトースト(Toast)が表示されるセットアップ。
(※)サンプルのシーン「Assets/_Test/Scenes/PluginTest」に配置してある。


Enable Hard Key → ハードボタンのイベントを受け取る。
Hard Operation → 端末自身での音量操作も可能とする。
Show UI → Unity で音量操作をしたときも端末のシステムUIを表示する。
On Volume Called → Unity, 端末自身ともに音量操作したとき、トーストを表示する。
On Hard Key Volume Up →ハードボタンで音量を上げるイベントを受信したとき、現在音量を表示する(→トーストで表示される)。
On Hard Key Volume Down → ハードボタンで音量を下げるイベントを受信したとき、現在音量を表示する(→トーストで表示される)。



(例2)端末のハードボタンが押されたとき、Unity で独自の UI にて現在音量を表示し音量操作をする。また端末のシステムUIは表示しないセットアップ。
(※)サンプルのシーン「Assets/_Test/Scenes/DialogExTest」に配置してある。


(※)「VolumeUI」は独自のUI(uGUI)

Enable Hard Key → ハードボタンのイベントを受け取る。
Hard Operation → 端末自身での音量操作を無効化する(システムUIを表示させない)。
Show UI → Unity で音量操作をしたときに端末のシステムUIを表示しない。
On Volume Called → Unity, 端末自身ともに音量操作したとき、独自UIを表示する。
On Hard Key Volume Up → ハードボタンで音量を上げるイベントを受信したとき、Unity で端末の音量を上げる。
On Hard Key Volume Down → ハードボタンで音量を下げるイベントを受信したとき、Unity で端末の音量を下げる。




■スクリプトでハードウェア音量操作・取得などをする [メディア音量のみ]

 以前の記事にもコードは掲載してあるが、ここでは改めて機能ごとに分けて書いておこう。

●ハードウェア音量を取得する [メディア音量のみ]
using FantomLib;

#if UNITY_ANDROID && !UNITY_EDITOR
int vol = AndroidPlugin.GetMediaVolume(); //現在音量の取得
int max = AndroidPlugin.GetMediaMaxVolume(); //最大音量の取得
#endif

//HardVolumeController を使用するなら(内容は全く同じ)
HardVolumeController hardVolumeController = FindObjectOfType<HardVolumeController>();
int vol = hardVolumeController.volume; //現在音量の取得
int max = hardVolumeController.maxVolume; //最大音量の取得


●ハードウェア音量を設定・増減をする [メディア音量のみ]
using FantomLib;

#if UNITY_ANDROID && !UNITY_EDITOR
int vol = AndroidPlugin.SetMediaVolume(4, showUI); //音量=4
vol = AndroidPlugin.SetMediaVolume(0, showUI); //ミュート:音量=0
vol = AndroidPlugin.AddMediaVolume(1, showUI); //現在の音量+1
vol = AndroidPlugin.AddMediaVolume(-1, showUI); //現在の音量-1
#endif

//HardVolumeController を使用するなら(内容は全く同じ)
HardVolumeController hardVolumeController = FindObjectOfType<HardVolumeController>();
hardVolumeController.volume = 4; //音量=4
hardVolumeController.VolumeMute(); //ミュート:音量=0
hardVolumeController.VolumeUp(); //現在の音量+1
hardVolumeController.VolumeDown(); //現在の音量-1


●ハードウェアボタン押下による、端末自身での音量操作を有効/無効化する
using FantomLib;

#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.HardKey.SetVolumeOperation(true); //端末自身での音量操作が可能
AndroidPlugin.HardKey.SetVolumeOperation(false); //端末自身での音量操作を無効化
#endif

//HardVolumeController を使用するなら(内容は全く同じ)
HardVolumeController hardVolumeController = FindObjectOfType<HardVolumeController>();
hardVolumeController.HardOperation = true; //端末自身での音量操作が可能
hardVolumeController.HardOperation = false; //端末自身での音量操作を無効化


●ハードウェアボタン押下のイベントを取得するリスナーを登録する
using FantomLib;

void OnEnable() //MonoBehaviour イベント
{
#if UNITY_ANDROID && !UNITY_EDITOR
//ハードウェア音量キーのリスナー登録("HardVolumeKeyChange"はコールバックハンドラ)
AndroidPlugin.HardKey.SetKeyVolumeUpListener(gameObject.name, "HardVolumeKeyChange", "VolumeUp");
AndroidPlugin.HardKey.SetKeyVolumeDownListener(gameObject.name, "HardVolumeKeyChange", "VolumeDown");
#endif
}

void OnDisable() //MonoBehaviour イベント
{
#if UNITY_ANDROID && !UNITY_EDITOR
//ハードウェア音量キーの全リスナー解除
AndroidPlugin.HardKey.RemoveAllListeners();
#endif
}

//ハードウェア音量キーのイベントハンドラ(Android ネイティブから呼ばれる)
void HardVolumeKeyChange(string message)
{
if (message == "VolumeUp")
{
//音量を上げる操作されたときの処理
}
else if (message == "VolumeDown")
{
//音量を下げる操作されたときの処理
}
}

//※内容は「HardVolumeController.cs」と同じもの。

 サンプルコードは「Assets/FantomLib/Scripts/Module/HardVolumeController.cs」にまとまっているので適当にコピペしたり、継承して新しいクラスを作るのも良いだろう。またプレファブ「Assets/FantomLib/Prefabs/System/HardVolumeControllerWithToast」にはトースト(Toast)で操作したときの音量を表示できるようにセットアップしてある。少し改造すればVR(Cardboard/ハコスコ)にも応用できるだろう。シーン「PluginTest」「DialogTest」「DialogExTest」にはそれぞれ異なったセットアップのプレファブが配置がされているので、自分の好みに合ったものを利用するのも良いだろう。

(※) Unity 2017.2.0f3 でビルド / Galaxy S7 Edge (Android 7.0) で確認

(動作確認した機器)



※この記事のUnityアセットはプラグインとして配布されています。


※とりあえず試してみたい方は、最新版をビルドした apk デモをダウンロードできます。動作確認にもどうぞ。

プラグインデモをダウンロード
(Google Drive を利用)


Android 4.2以上
※「提供元不明アプリのインストール」許可が必要です。


(関連記事)
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidでスライダーで設定を変更するダイアログを使う
【Unity】Androidでスイッチで設定を変更するダイアログを使う
【Unity】Androidの選択ダイアログを使う
【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う
【Unity】Androidで数値・半角英数・パスワード入力ダイアログを使う
【Unity】Androidでテキスト入力ダイアログを使う
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
【Android】【Java】AlertDialog を使ってみる


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン  FantomPlugin  Cardboard  VR 
tb: 0   cm: --

【Unity】Amazonアプリストアに申請する  


 今度は Unity で「Google Cardboard/ハコスコ」で楽しめるスマホ用VRアプリをビルドしてAmazon AppStore に申請してみた。というより先日 Oculus Store に申請した GearVR アプリは、元々 Cardboard 用に作ったアプリだったので、こちらも試しにアップしてみるのも良いかと思っただけだったりする(てゆか最近まで個人でも Amazon AppStore から配信できることを知らんかった(笑))。

 やってみた感想は、たぶんこれまでで一番簡単だった。バイナリ(apk)のチェックなどは完全自動化されているようだし、そもそもアプリ動作に対する要件が特にないので(例えば「バックボタンで終了しろ」みたいな)、画像を揃えるだけで申請できた。また Google Play で公開されているものをそのまま使っても良いようなので(ただし、Google の API は使えないので、Amazon の API に入れ替える必要あり)、既にアプリ公開している人でもリーチを広げるのには良いかも知れない。デベロッパー登録から申請まで全て無料でできるので試してみるのも一興かと(笑)。



(※) Unity 5.6.2p3 / Windows10(x64) で確認



■Amazon AppStore 申請の大まかな流れ

 まずは既存の apk があるのなら、デベロッパーサイトにある「テストを始める」にその apk ファイルをドラッグ&ドロップしてみるのも良いかも知れない。申請時にも同じように apk をアップロードできる画面があるが、ここにドロップした場合は、デベロッパー登録なしでもテストできる。問題がなければ、そのまま申請の手続きの画面に移ることも可能だ(結果の履歴から申請登録することもできる)。


 デベロッパー登録がまだならアカウントを作成する必要があるが、それが完了したら即申請もできる。以下に簡単な申請までの流れを書いておこう。


1.デベロッパー登録をする。税に関する情報入力(課金アプリにする場合や広告などを使うときの税徴収に関する電子公文書)は少し面倒だが、無料にする場合も必要らしい。認証は小一時間もすれば完了する。

2.デベロッパーサイトの「ダッシュボード」または「アプリ&サービス」の「新規アプリを追加」でアプリを登録できる。アプリの情報入力および画像アセット、バイナリ(apk)をアップロードする。また、ドラッグ&ドロップのテストをした場合は結果の履歴が残っているので、そこから登録もできる(最新版は一番上)。

3.自動チェック(画像アセットが揃っている、アプリの問題チェック通過)が済んだら、Amazon AppStore に申請する(すべてが完了したら「アプリを申請」が押せるようになる)。

4.申請後はしばらく審査待ちになる(最大1週間とあるが、早ければ1日でリリースできる)。

5.審査をパスしたら、今度はリリース待ちになる(リリース日は情報入力で設定した日。未入力なら審査パス後にすぐ)。


 ちなみに私の場合、リリース日は特に指定しなかったせいもあり、約6時間後にはリリースされていた。はやっ!



■Amazon AppStore 申請要件の概要(主に画像アセット)

 ここでは必要なアセット(主にストア用画像)をまとめておく。細かい内容は FAQ に書かれているので、簡単に目を通しておくと良いだろう。

●提出するアセットの仕様(※画像のサイズなど)

・小アイコン:114 x 114px PNG (背景色透明)(アプリをインストールした後、端末に表示されるアイコン)

・大アイコン(サムネイル):512 x 512px PNG (背景色透明)(アイコンと同一の画像であること)

・スクリーンショット:3~10 枚まで:PNG または JPG。使用できるサイズは、
 800 x 480px (5:3), 1024 x 600px (128:75), 1280 x 720px (16:9), 1280 x 800px (8:5),
 1920 x 1080px (16:9), 1920 x 1200px (8:5), 2560 x 1600px (8:5)
 のいずれか(縦長または横長)

・プロモーション用画像 (推奨):1024 x 500px (256:125) (横長のみ) PNG or JPG

・動画:最大5 MPEG-2, WMV, MOV, FLV, AVI, H.264 MPEG-4
 最小幅720px (4:3 or 16:9); 高さ1200 kbps以上

(実際例)

(c) UTJ/UCL

(参考)
アプリの申請:アプリの詳細



■アプリの Build Settings

 Amazon AppStore にはあまり技術的な要件はないみたいだが、一応今回のビルド設定も載せておこう。ここでは Cardboard アプリを例にしているが、基本的に普通のアプリでも変わらないので、特に気をつける部分は API Level や CPU の設定くらいかも知れない。実際には申請時の登録情報にサポートしている端末を選択することができるので、既存のままでもかまわない。Fire タブレットなどにも対応させるなら「Android 5.1 Lollipop API Level 22」あたりにしておけば良いらしい(持ってないので未実証だが、アプリテストを信頼するとして(笑))。


 あとはテクスチャの圧縮を使うなら「OpenGL ES」のバージョンくらいか。「OpenGL ES 2.0」なら間違いないが、「OpenGL ES 3.0」なら「Android 4.3 (API level 18)」以上を、「OpenGL ES 3.1」なら「Android 5.0 (API level 21)」にしておく必要がある。以下にいくつか参考URLを載せておこう。

(参考)
Android プラットフォームのバージョン
OpenGL ES
Unityで画像fを圧縮する際のフォーマットのお話し(ASTCとETC)




 「Quarity Settings」なども任意で良いが、私は GearVR の設定のときと同じものを使っている。パフォーマンスが許すなら「Anti Aliasing」(アンチエイリアス処理)を「2x MultiSampling」以上にしても良いだろう。モバイルの場合、警告「Warning! Using antialiasing on a mobile device may decrease performance severely. You can change the mobile quality settings in 'Project Settings -> Quality Settings'.」(モバイルではアンチエイリアス使うとパフォーマンス下がるよ)が出るが、Android 5.0 (API 21) 以上ならわりといけるようだ。




■アプリのアップデート

 一番簡単な方法は申請の流れのときと同じように「テストをはじめる」に新しいバージョンのアプリをドロップし、「Test Results available」が出たら「View Results」(or 結果を表示)をクリックし、テストの履歴から「AppStore に提出」を押すことだろうか。提出ボタンを押すと「アプリには既にバイナリが含まれています。バイナリを置き換えますか?」とダイアログが出るが「YES」を押し、登録を保存すれば良い。あとは既存の情報を編集したり、リリースノートを書けば申請できるようになる。





 これははじめ戸惑ったのだが、メニューの「次バージョン」を押しても同じ画面になるが、「保存してバイナリを追加」は「既存をそのまま+新しいのを追加」のようになってしまうようだ。また、なぜかバイナリ(binary2)の自動チェックがされず、サポート端末が未設定になる。「バイナリを削除→追加」でも良いかもしれないが、先に述べたテスト結果からそのまま置き換え→提出した方が楽だ。


(関連記事)
【Unity】GearVR アプリを Oculus Store に申請する(要件・仕様の概要)
【Unity】GearVR 用にビルドする


■VR関連参考書籍・動作確認機器


このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License

関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: ストア申請  Cardboard  VR  ユニティちゃん 
tb: 0   cm: --

【Unity】VRレーザーポインター(ビーム)を作る  


 あくまで一例だが、簡単なレーザーポインター(ビーム)の実装方法を書いておこう。これは実際に私の作ったアプリに使っているものと同じだ。フリーなのでインストして試してみるのも良いだろう。

※Oculus Store で配信中(検索:sapphiart)

 はじめに大まかに仕様的なものを説明しておくと、今回の実装方法は「レーザーの発射位置(Anchor)から指している位置(Target)に向かってラインレンダラ(Line Renderer)で線を引く」という非常に簡単なものである(笑)。なので例として GearVR コントローラを使っているが、たぶん他のコントローラでも移植はそう難しくはないだろう。また SDK 依存を減らすためにも、レーザーを描く部分とそれを SDK(ここでは Unity 公式の VRSample)で使う部分を分けて書いておいた。レーザーで指すだけという最低限の機能しか付けてないが、コードの内容を理解すれば、他の SDK やコントローラでも簡単に応用できるだろう。

 また、今回は Oculus Utilities 1.16.0-beta を使用することにおいて、Unity2017.1f03 でやってみたら色々エラーが出るようなので、Unity 5.6.2p3 を使っている。なので自力で修正、または今後のバージョンアップで修正されたのなら、細かい仕様が変わってしまっている恐れがあるので、適宜置き換えて考えて欲しい。

(2018/07/21 追記)
 Oculus Utilities v1.27.0, VRSample 1.4, Unity2018.1.8f1 でデモシーンをパッケージ化したものを用意しました(Unity2017.3.0f3, Unity2017.4.2f2, Unity2018.1.8f1 で動作確認済み。簡単な仕様なので他のバージョン・環境でも大丈夫だと思う)。
とりあえず試したい方は Google Drive からダウンロードすることもできます(名称・構成などは記事とは多少異なってますが内容は同じです)。
また、流用・改変なども自由にやって貰って構いません。
>>レーザーポインタのデモをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)



(※) Unity 5.6.2p3 / Windows10(x64) で確認



■レーザー(ビーム)ポインタをラインレンダラで描く

using UnityEngine;

/// <summary>
/// LineRenderer によるレーザーポインタ
/// 2017/8/21 Fantom (Unity 5.6.2p3)
/// http://fantom1x.blog130.fc2.com/blog-entry-259.html
///(使い方)
///・空の GameObject にアタッチし、LineRenderer を追加する(線の幅[Width:0.005くらい]やマテリアル・色も設定する)。
///※LineRenderer のマテリアルを「Sprites-Default」などアルファが利くものにし、色のアルファを設定すれば半透明レーザーにできる。
///※Use World Space は true である必要がある(デフォルト値)。
///・インスペクタで Anchor にコントローラなどの GameObject をセットする。
///・認識させるオブジェクトにコライダを追加する。
///(仕様説明)
///・anchor → target へ LineRenderer で線(レーザー)を引く。
///・LineRenderer は厚さのないテープのようなものなので(ただし常にカメラの方を向いている)、カメラ位置とanchorが同じで、targetが真正面方向だと見えない(故にanchorのY軸をずらせば見える)。
///・外部の Raycaster で判定をするときは shotRay をオフにして、target に指す位置を入れる。
///・shotRay がオンのときは anchor 位置から anchor.forward 方向へ Ray を飛ばし、ヒットしたオブジェクトの transform が target に入る(ヒットが無いときは null)。ヒットした位置ではないことに注意(ヒットした位置は RaycastHit.point で取得できる)。
/// </summary>
public class LaserPointer : MonoBehaviour
{
public bool IsActive = true; //稼働フラグ
public float defaultLength = 0.5f; //ヒットなしのときのレーザーの長さ

public bool shotRay = true; //Ray を撃つ(false のときは target に指す位置を入れる)
public float rayLength = 500f; //Ray の長さ
public LayerMask rayExclusionLayers; //Ray 判定を除外するレイヤー

public Transform target; //指す位置(shotRay=true のときはヒットしたオブジェクトの transform が入る)
public Transform anchor; //発射位置(コントローラの位置)
public LineRenderer lineRenderer; //レーザーを描画するラインレンダラ

// Use this for initialization
void Awake()
{
if (lineRenderer == null)
lineRenderer = GetComponent<LineRenderer>();
}

// Update is called once per frame
void Update()
{
if (!IsActive)
{
lineRenderer.enabled = false;
return;
}

if (shotRay)
{
Ray ray = new Ray(anchor.position, anchor.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, rayLength, ~rayExclusionLayers))
{
target = hit.transform;
DrawTo(hit.point); //ヒットした位置にしたいため
return;
}

target = null;
}

if (target != null)
DrawTo(target.position);
else
DrawTo(anchor.position + anchor.forward * defaultLength); //コントローラの正面方向へ一定の長さ
}

//レーザーを描く
void DrawTo(Vector3 pos)
{
lineRenderer.enabled = true;
lineRenderer.SetPosition(0, anchor.position);
lineRenderer.SetPosition(1, pos);
}
}

 使い方は空の GameObject にこのスクリプトをアタッチし、更に「Line Renderer」を追加する(インスペクタの一番下にある「Add Component で「LineRenderer」を入力すると楽)。Line Renderer を追加したら、インスペクタで線の幅(Width)を 0.005 くらいにしておくと良い。またマテリアル・色はデフォルトでも構わないが、半透明レーザーにしたいなら、アルファの効くマテリアル(例えば「Sprites-Default」など)にし、色の設定でアルファを 200 くらいにしておくと良いだろう。線の太さの変化やグラデーション変化を加えても良い。これらは任意で構わない。ただし「Use World Space」(位置指定を World Space にする)だけは true にしておく必要がある(デフォルトでは true になっている)。

 あとはインスペクタで「Laser Pointer」の「Anchor」にコントローラなどレーザーを発射するオブジェクトをヒエラルキーからドラッグ&ドロップなどでセットするだけだ。


 オブジェクトの判定方法はコントローラから前方に Ray を飛ばして、ヒットしたオブジェクトを取得するだけのもので(target にその transform が入る)、特に何の機能も付いてない。レンスポンスなどは何らかの SDK などを使用することになるだろう。なお、ヒットさせたいオブジェクトにはコライダがアタッチされてる必要がある。

 1つ注意点としては、Line Renderer は厚さのないテープのようなものなので(ただし常にカメラの方を向いている)、カメラ位置とレーザー発射位置(Anchor)が同じで、かつ指す位置(Target)が真正面方向だと Gameビューでは見えないことだ。要するにエディタ上で初期位置がすべて (0, 0, 0) のようになってると見えないので、デバッグ用に表示したいなら、コントローラ等のY軸をずらせば見えるようになる(Sceneビューでは角度を変えれば見える)。実機ではコントローラは普通見下ろす感じになるので、初期位置が(0, 0, 0) でも特に問題はない(手の位置と連動して Transform が変わる)。



■GearVR コントローラでレーザーポインタを使う

 では具体的に Oculus Utilites(掲載時点:v1.16.0-beta) を使って、GearVR コントローラでレーザーポインタを使う方法をやってみよう。Oculus Utilites 自体のインポートからはじめるなら「GearVR ビルドをする」の記事を参照して欲しい。

 サンプルとしてシーン「Assets/OVR/Scenes/GearVrControllerTest」を開いてみよう。複製したものを使っても良い。このサンプルはビルドすればそのまま GearVR コントローラが使えるが、このコントローラからレーザーが出るようにする。設定は前述したインスペクタのようにすれば良い。とりあえず右手のコントローラを「Laser Pointer」の「Anchor」にセットしよう。ヒエラルキーとインスペクタでは以下のような感じになる。


 セットアップが済んだら、あとは「GearVR ビルドをする」と同じように「Build Settings」でこのシーンを追加して apk を出力するだけだ。実機で動作を確認してみよう。
●サンプルにレーザーが追加される
(※) Galaxy S7 Edge で確認



■VRStandardAssets(VRSamples)を使ってレーザーポインタでアイテムをクリックする

 次に何らかの SDK を使ってレーザーポインタでインタラクティブな動作をやってみよう。今回は公式の VRSamples を使うことにする(※VRSamples は完成プロジェクトなので、インポートすると現在のプロジェクトを書き換えてしまうので注意。別の新規プロジェクトにインポートする方が良い)。と言ってもレティクル(視点ポインタ)などのUIや Raycast でのオブジェクトの判定は他の SDK でも同じようにあるハズなので、一部置き換えれば移植は簡単だと思う。

●VRStandardAssets(VRSamples)でレーザーポインタを使う
using UnityEngine;

namespace VRStandardAssets.Utils
{
/// <summary>
/// VRSample の VREyeRaycaster や Reticle(使用するのはUIの位置)を LaserPointer.target に入力する。
/// </summary>
public class VRLaserPointer : MonoBehaviour
{
public LaserPointer laserPointer; //レーザーの描画
public VREyeRaycaster eyeRaycaster; //Rayを発射してオブジェクトを判定する
public Transform guiReticle; //レティクルなどのUI

// Update is called once per frame
void Update()
{
if (eyeRaycaster.CurrentInteractible != null)
laserPointer.target = guiReticle;
else
laserPointer.target = null;
}
}
}

 これは VRStandardAssets(VRSamples) の機能を前述の「LaserPointer」に橋渡しするだけのスクリプトである。VRStandardAssets では「VREyeRaycaster」というスクリプトが Ray を発射し、「VRInteractiveItem」コンポーネントとコライダを持つオブジェクトを取得するという仕組みでインタラクティブ機能を実現している。VRStandardAssets に入っているプレファブの一部を利用して、ここまでのサンプルシーン「GearVrControllerTest」で、レティクル付きのレーザーポインタでオブジェクトをクリックできるように改造してみよう。少し面倒だが、以下の手順でセットアップしたものをプレファブ化しておけば使い回しも簡単にできる。


1.「Assets/VRSampleScenes/Prefabs/Utils/」にある「MainCamera」をヒエラルキーにドラッグ&ドロップしよう。ドロップしたらカメラ自体は元からある「OVRCameraRig」を使うので、カメラとその他必要ないコンポーネントを削除(Remove Component)する。具体的には「Camera」「GUI Layer」「Flare Layer」「Audio Listener」「VR Camera Fade」「Return To Main Menu」「VR Tracking Reset」を削除する。残ったのは「VR Eye Raycaster」「VR Input」「VR Camera UI」「Selection Radial」「Reticle」となるようにする。また「MainCamera」のタグを無くし、ついでに名前を変えておこう。ここでは「VR Eye」としている。あとヒエラルキーで「Fade Panel」も削除しておこう。


2.次に先に作った「LaserPointer」オブジェクトに「VRLaserPointer」をアタッチしよう。そしたらヒエラルキーからドラッグ&ドロップして図のようにセットアップする。「Shot Ray」をオフにするのを忘れずに。これで「VREyeRaycaster」に判定を任せ、ヒットしているときレティクルのUI までレーザーが引かれるようになる(ヒットしてないときは「Default Length」の長さになる)。


3.それとレティクル(視点ポインタUI)もセットアップしておく。ヒエラルキーで「VR Eye>VRCameraUI>GUIReticle」を展開して、「Image」をオンにし、「Color」をレーザーに合うように色を変更しておこう。また今回は使用しないが、必要なら更に展開して UISelectionBar(リングUI)の色も変えておいても良い。ここではリングUI は起動時には非表示にしたいので「VR Eye」に戻り「Selection Radial」の「Hide On Start」をオンにしておく。



※リングUI は起動時に非表示にする


4.「VR Eye」のセットアップができたら、このオブジェクトに先に作った「LaserPointer」オブジェクトをドラッグ&ドロップし、子要素にしよう。そしてこれをプロジェクトエクスプローラでプレファブ化しておく。


5.「VR Eye」のプレファブ化ができたら、ヒエラルキーにあるものとプレファブのものをそれぞれ「RightHandAnchor」「LeftHandAnchor」を展開した先にある「Model」(コントローラの3Dモデル)の子要素に配置しよう。ここに置いておくと、右手用・左手用コントローラを切り替えたとき、自動的にオン・オフされるので便利だ。またプレファブ化した方はヒエラルキー上の参照は外れてしまうので、「Laser Pointer」の「Anchor」だけ設定しておこう。ここでは左手用「LeftHandAnchor」以下にプレファブ化した「VREye」を子要素に置いたので、「Anchor」に「LeftHandAnchor」を設定している。また子要素にすると Transform の Position が再計算されるので、(0, 0, 0) になっていることを確かめよう。ずれてしまった場合は必ず修正する(※動作は正しくても見た目がおかしくなるため)。あと情報表示が邪魔なら「CenterEyeAnchor」以下の「Canvas」を消しても良い。



※Transform は必ず (0, 0, 0) にする


6.これで必要なセットアップは一通り完了したので一旦シーンを保存しよう。またヒエラルキーの「OVRCameraRig」を「OVRCameraRig Gear」とでもしてプレファブ化しておくと再利用が簡単になる。そしてインタラクティブなテストをするために「VRSamples」に入っているサンプルシーン「Assets/VRSampleScenes/Scenes/Examples/InteractiveItem」を開き、ヒエラルキーにある「Cube1」をプレファブ化しよう(3つあるがどれでも同じ)。プレファブ化したらシーンは閉じてしまって良いので(保存はしなくても良い:任意)、再びテストするシーン「Assets/OVR/Scenes/GearVrControllerTest」に戻って、ここに先ほどプレファブ化したインタラクティブなアイテム「Cube1」をいくつか置いておく。


7.最後にシーンを GearVR 用にビルドしてみよう(VRSamples をあとから追加インポートした場合はシーンがいくつか追加されているので全て削除し「GearVrControllerTest」だけビルドする)。レーザーポインタでオブジェクトを指したり、クリックしたりすると色が変化するハズだ(起動初期にコントローラが認識されないときは、Backボタンを短押しすると認識される)。これで簡単な機能だけだがとりあえず完成だ。インタラクティブなアイテムにはスクリプト「VRInteractiveItem」の他に「ExampleInteractiveItem」もアタッチされている。この辺りのソースを覗けば(イベントで色を変えてるだけ)、他のアイテムなどにも応用は可能だろう。

●アイテムにヒットしてないときはデフォルトの長さで、ヒットしてるときはレーザーが伸びていく

(※) Galaxy S7 Edge (Android 7.0) で確認





(関連記事)
【Unity】GearVR アプリをビルドする
【Unity】GearVR アプリを Oculus Store に申請する



この作品・コンテンツは『サファイアートちゃん ライセンス条項』の元に提供されています。
This work is provided under "SapphiArt-Chan License" agreement.
© SapphiArt inc /SCL

関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: GearVR  VR 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR