【Unity】【OculusQuest】unity1weekで作ったゲームをVR化してみた

この記事はUnityゲーム開発者ギルド2 Advent Calendar 2020 - Adventar の15日目の記事です!!

adventar.org

 

 

unity1weekに投稿したゲームをOculusQuest2に移植

unityroom.com

unity1weekとは、unityroomで不定期に開催されるイベントです。
お題が提示され、それから1週間でゲームを完成させて投稿するという、スペシャルハードな企画だったりします。
Web上で公開されるため、WebGL形式でビルドする必要があるのですが、今回は過去に私が発表したゲームのうち3点ほどをOculusQuest2に移植してみました。

 

選んだゲーム

今回VR化を試みたゲームは、コチラの3点です。

点つなぎゲーム

点つなぎゲーム | フリーゲーム投稿サイト unityroom

f:id:s44511173:20201214175102p:plain

記念すべき、unity1week初投稿作品!!
タイトルのセンスの無さが、初心者っぽさ丸出しですw

星と星の間をロケットで移動すると線が繋がり、全ての星をつなぐと星座が浮かび上がります。
VRで宇宙空間内を移動するとどうなるか!?楽しみですw

トリック オア コロッケ

トリック オア コロッケ | フリーゲーム投稿サイト unityroom

f:id:s44511173:20201214175050g:plain

この作品は、3Dステージを作ってみたい!という気持ちから作ったゲームです。
といっても、アセットのサンプルシーンをパクって、オブジェクトの配置をチョイチョイ変えただけなのですがw

3Dが苦手で、ベクトルが3次元になっただけで蕁麻疹が出る人間だったのですが
このゲームのおかげで3次元に(チョットだけ)慣れることができた気がします。
追いかけてくる敵(Unityちゃんw)に捕まらないよう逃げ回りながら、宝箱を探し当てるゲームです。© Unity Technologies Japan/UCL

 4COLORS

f:id:s44511173:20201214175055g:plain

4COLORS | フリーゲーム投稿サイト unityroom

こちらは一番最近のゲームです。
初めてランキング入り(操作性)を果たした作品です!わっしょい!!
DOTweenとUniRxの勉強をしようと思って作ったタイトルです。
おかげさまで最近UniRxが面白くて仕方ないですw

 

OculusQuestで遊んでみる

選んだ3つのゲーム。それぞれタイプが異なりますが、VRに移植したらどうなるか!?楽しみですねw

オモシロ順序予想

自分的には、オモシロ順列は次のようになるんじゃないかと予想してます。

  1. 4COLORS
  2. 点つなぎゲーム
  3. トリック オア コロッケ

理由はと言いますと、最近テトリスVRが出てるじゃないですか。やったことないけど。
てことは、パズルもVR化したら面白くなるんじゃないか!?
トリック オア コロッケが最下位な理由は、VR酔いする自信が200点満点だからです。。

点つなぎゲーム

実はこちら、unity1weekに投稿後にブラッシュアップしてAndroidアプリとして公開してます。結果は爆死ですがw
公開したバージョンを移植してみました。

f:id:s44511173:20201215121615g:plain

イイ!イイじゃないか!!
思っていた以上にイイ感じですw
宇宙空間という、非日常さがたまりません。
左トリガーで前進、右トリガーでバレット発射です。

VRではコントローラーを見ることが出来ないので、いかに簡単な操作にするかがポイントですよね。結構イケてるんじゃないでしょうか!?

トリック オア コロッケ

f:id:s44511173:20201215122457g:plain

く、暗い・・・そしてやはり酔うw
コントローラ移動だと絶対に酔うと思ったので、ワープ機能をくっつけたんですよ。
それでもやっぱり酔いました。。ゥゲロゲロ。動画見てるだけで酔う。。

UIの位置も問題ですよね。
VRゴーグルで見ると、レーダーの表示位置が高すぎるんですよ。
でも低くすると、マップを邪魔してしまって見えづらくなるし。

あまりに色々酷すぎて、クリアすることができませんでしたw

4COLORS

期待大のパズルゲーム!こちらはどうなったでしょうか!?

 

f:id:s44511173:20201215123120g:plain

あ、あれ。
思った以上に普通。代わり映えしない。
VRになったことによる変化を感じない。
しいて挙げれば、でかすぎて見づらい(汗

VRに移植するんだったら、背景とかを変えないとだめですね。
VRでやる意味がない。
点つなぎゲームで感じたような、
非日常な空間にいるっていう体験が必要なんだと思いました。
だってせっかくVRなんだしね。

 

オモシロ順序結果

結果は、こうなりました!

  • 点つなぎゲーム
  • 4COLORS
  • トリック オア コロッケ 

まさかの初投稿ゲームが1位を飾りました!
いやぁ、やってみないとわからないもんですね。

結論

  1. 過去に作ったゲームをVRに移植すると、結構面白い
  2. UIの位置と操作性が大事(VRに限らず大事だけど)
  3. 3Dマップを自由に移動するゲームは酔う
  4. 非日常な空間にいるっていう体験ができれば、ぶっちゃけどんなゲームでも楽しめる(個人の感想ですw

 

【Unity】【Quest2】OculusQuest2でURPしてみた

f:id:s44511173:20201109235137j:plain

今更なご報告ですが、Quest2買っちゃいました♪
後ろのワンコは愛犬の日向です。溺愛してます。溺愛しすぎてウザがられてます。

 

開発環境

  • Unity 2019.4.8f1
  • Oculus Integration 20.1
  • Japanese Apartment 1.0

ことの始まり

いつもお世話になっているUnity AssetStoreまとめさんで、下のような記事があったんです。

www.asset-sale.net

 

気づいたのが、セール最終日!しかも欲しかったアセットが目白押し・・。
こりゃもう買うっきゃ無い。いつ買うの?今でしょ!(古っ)

ってことで、即ポチしちゃいまして。
どうしても欲しかったアセットというのが、コチラ。

assetstore.unity.com

いいじゃん、オシャレな家の中にVRで入ってみたかったんだよ・・・。

 

早速中に入ってみる

f:id:s44511173:20201110000217j:plain

Quest2です。1より一回り小さい&画質がキレイ。
beat saberやりすぎて、シリコンカバーが到着する前に汗臭くなりそう。
キズナアイちゃんアプリは、ゲームよりも動画鑑賞をぜひ。

Oculus Integrationを入れたUnityプロジェクトに先程のアセットを入れてビルドします。
apkが出来上がったらQuest2にインストールして、実行!

f:id:s44511173:20201110084749j:plain

玄関先

 

f:id:s44511173:20201110084801j:plain

トイレ

 

f:id:s44511173:20201110084806j:plain

洗面所

 

f:id:s44511173:20201110084811j:plain

リビング

うーん・・・。
なんか、期待していたようなゴージャス感を感じられない。。
まぁね、アセットの紹介動画はモバイルで動かしてないだろうし、いろんな演出も入ってるんだろうし。
でもなんだろう?もうちょっとゴージャスになってもいいんじゃない?

URPをやってみよう

URPでプロジェクトを作成する

そこで、最近流行りのURP(Universal Render Pipeline)にチャレンジしてみました!

developers.wonderpla.net

URPを使うと従来よりも画質が向上し、負荷も軽減されるんだとかナントカカントカ。
詳しい仕組みはさっぱりわからんが、ようはゴージャス感をもうちょっと感じられるようになる!かも知れない!! 

ということで、早速プロジェクトをURPで作り直し。
あとから知ったのですが、PackageManagerを使うと既存のプロジェクトにURP適応ができるらしい。知らんかった〜。 

マテリアルを変更する

URP対応じゃないアセットを使うと、Materialがピンクになってしまうことがあります。これはシェーダーがURPに対応していないためです。
でも、心配することなかれ!
Edit > Render Pipeline > Universal Render Pipeline > Upgrade Project(またはSelected)Materials to UniversalRP Materialsを使えば、Unity側で変更してくれます。

準備ができたら、ビルドしてQuest2にインストールします。今度こそゴー☆ジャスな部屋の中に入れるはず!??

 

部屋の中に入ってみる(URP版)

f:id:s44511173:20201110092133j:plain

f:id:s44511173:20201110092136j:plain

f:id:s44511173:20201110092142j:plain

f:id:s44511173:20201110092155j:plain

 

なんかゴー☆ジャスになった!気がする!(でもよくわからない・・・)
並べて比較してみます。左:ノーマル/右:URPです。

f:id:s44511173:20201110084749j:plain f:id:s44511173:20201110092133j:plain

おお!なんか違う!光が柔らかい感じがする。

 

f:id:s44511173:20201110084801j:plain f:id:s44511173:20201110092136j:plain

トイレも明るい!!そしてなんとなく、便器がキレイに見えるw

 

f:id:s44511173:20201110084806j:plain f:id:s44511173:20201110092142j:plain

電気が圧倒的に明るい。Bloom入れてないのに。

 

f:id:s44511173:20201110084811j:plain f:id:s44511173:20201110092155j:plain

影がやわらかい感じがしますね。境界がぼやけてるというか。

 

URP+Bloomさせてみる

PostProcess入れてないんですが、光がBloomしてるっぽく見えますね。負荷になるので、VRにPostProcessは向かない(VR専用のFastタイプもあります)のですが、URPならばあまり負荷にならないんだとか。それならば、PostProcessさせたくなるってもんです!

 

f:id:s44511173:20201110093029j:plain

f:id:s44511173:20201110093057j:plain

f:id:s44511173:20201110093102j:plain

f:id:s44511173:20201110093105j:plain

比較するためと思ってIntensityを強めにしたのですが、強すぎた(汗
トイレなんか黄金になっちゃってます。が、Bloomなし版よりも全体的にやわらかい印象を受けます。

 

Bloom入れたバージョンと入れないバージョンを比較してみましょう。
左:URP/右:URP+Bloomです。

f:id:s44511173:20201110092133j:plain f:id:s44511173:20201110093029j:plain

おお、やっぱりBloom入ると違う!さらに光が柔らかい感じがします。

 

f:id:s44511173:20201110092136j:plain f:id:s44511173:20201110093057j:plain

黄金のトイレ・・・光り輝いてるよ・・・

 

f:id:s44511173:20201110092142j:plain f:id:s44511173:20201110093102j:plain

こちらも(略

 

f:id:s44511173:20201110092155j:plain f:id:s44511173:20201110093105j:plain

枕元の明かりは強すぎないほうが良いですよね。影もさらに柔らかい印象です。

 

結論

  1. ビジュアルの向上を目指すなら、URPを検討しよう
  2. URPはプロジェクト作成時に選択するが、PackageManagerを使えばあとからでも適応できる(未検証)
  3. 調子に乗ってIntensityを強くしすぎると、眩しくて寝られない部屋が出来上がる

 

【Unity】【uGUI】状態によってボタンの色を変える

ボタンにマウスオーバーしたり、クリックした時の色を変える方法です。
ちょっと目からウロコだったので、既知の話だとは思うけどご紹介。

開発環境

  • Unity 2019.4.8f1

ボタンの中身が文字の場合

ボタンを作る

f:id:s44511173:20201101174642p:plain:w300
まずはボタンを作りましょう。
Hierarchyウィンドウで右クリックし、UI > Button を選択します。
すると自動的にCanvasが作成され、その下層にButtonが配置されます。
EventSystemがHierarchyになかった場合、こちらも自動的に作成されます。
※EventSystemはuGUIに必要なものだから、削除したダメダメ!!

Buttonコンポーネントの設定

f:id:s44511173:20201101175327p:plain:w300
InspectorでButtonオブジェクトの設定を行います。

* Normal Color・・・通常時の色
* Highlighted Color・・・マウスオーバー時の色
* Pressed Color・・・押下時の色
* Selected Color・・・選択時の色
* Disabled Color・・・非活性時の色

実際に色を設定して、試してみましょう。
f:id:s44511173:20201101180248p:plain:w300
こんな感じにしてみました。クッソ派手ですね。
こんなボタン作ったら、客先にどやされること間違いなしです。

f:id:s44511173:20201101183012g:plain
こんな感じになりました。
Selected Colorが気になるところですね。
これは、ボタンを押下することでFocusが当たった状態と思われます。

ボタンの中身が画像の場合

ボタンを作る

f:id:s44511173:20201101183410p:plain:w300
テキストベースのボタンができたので、画像ベースのボタンを作ってみましょう。
ButtonオブジェクトのButtonコンポーネントとImageコンポーネントをいじります。

Imageコンポーネントの設定

  • Source Image・・・通常ステータス用の画像

Buttonコンポーネントの設定

  • Transition・・・Sprite Swap
  • Highlighted Sprite・・・マウスオーバー時の画像
  • Pressed Sprite・・・押下時の画像
  • Selected Sprite・・・選択時の画像
  • Disabled Sprite・・・非活性時の画像

f:id:s44511173:20201101184125g:plain
こんな感じになりました!!
テキストベースのボタンと同様ですね。

ボタンの前景アイコンは変えず、背景色のみ変えたい

そりゃー、そう思うでしょう。
ボタンのためだけに、何枚も画像を用意したくなんてありませんよね。
そんな時にお役立ちなテクが、コチラ!!

背景が透過なアイコン画像を準備

f:id:s44511173:20201103164152p:plain:w150 この一枚だけで良いんです。

Imageコンポーネントを追加

f:id:s44511173:20201103164926p:plain:w300
Buttonオブジェクトの子供にImageを追加し、それにこの画像をセットします。

Buttonコンポーネントの設定

ボタンの中身が文字の場合と同様の設定となります。
そうすると、こんな感じになりました!!

f:id:s44511173:20201103170814g:plain

知られているようで知られていない(というか、自分が知らなかった)テクのご紹介でした。

結論

  1. ボタンの状態を色で分ける方法
  2. テキストベースでの背景色、画像そのものの変更、アイコンベースでの背景色の変更が可能
  3. スマホアプリには、あまり不要なテクかもしれない・・。

【Unity】ScriptがアタッチされているObjectを探す

知らずにいると、人生損します。してました。

うっかりアタッチミス

1個で良いハズのScriptを、別のオブジェクトにもアタッチしちゃうことってありませんか?私だけでしょうか??
なーんかうまく動かないな〜なんて思っていたら、1件しか出ないハズのログが2件出ていたりして。はきゃー、やっちまった!!

・・・なんてことが、過去に何度か。何度もやってるんか、そんな失敗。

どのオブジェクトにアタッチしたっけ?

f:id:s44511173:20200730110145p:plain

あくまで「うっかりミス」なので、どのオブジェクトにくっついてるかわからんのですよ。Hierarchyウィンドウ内のオブジェクト数が少ない間は探す気にもなりますが、ものすんごい大量のオブジェクトがいるときなんて、探す気になんてなれようもない。

スクリプトで犯人探し

そんなとき、今まではこんなスクリプトを書いていました。

void Start()
{
    Debug.Log($"{name}");
}

そうすると、Consoleにアタッチされたオブジェクト名が表示されてくるわけです。

f:id:s44511173:20200730105741p:plain

こんな感じ。これでも十分、犯人探しはできます。

が、しかし。

Find Reference In Sceneで犯人探し

実は、もっと簡単な方法があったんです!!知らないと損!してた!!

ProjectビューでScriptを選択>右クリックメニューからFind Reference In Sceneを選択。これだけで良いんです!!

f:id:s44511173:20200730110529p:plain

こうすると、あらステキ!!!

f:id:s44511173:20200730110614p:plain

さっきまでゴチャゴチャしていたHierarchyビューが絞り込まれて、対象スクリプトがアタッチされたオブジェクトのみ表示されるようになりました!!!すごい!!!

スクリプト以外も探せる

探せるのは何も、スクリプトに限ったことではありません。マテリアルやテクスチャも探せます。マテリアルが増えすぎて、未使用品を整理したいなーなんて時に便利。

結論

  1. Projectビューで選択>右クリックメニュー>Find Reference In Sceneで、アタッチしているオブジェクトを検索できる
  2. Unityの機能は、知らなくてもなんとかなるけど、知ってると効率Up!!(まだまだ知らない機能があるんだろうなぁ・・・汗)

【Unity】AssetBundleをFirebaseで使ってみる

使わなくて良いなら、一生使いたくない。そう思っていました。。

 

 

AssetBundleとは

公式サイトはコチラ。

docs.unity3d.com

一部抜粋:

アセットバンドルはダウンロードコンテンツ (DLC) に有用で、初期インストールサイズを削減し、エンドユーザーのプラットフォームのために最適化されたアセットを読み込み、ランタイムのメモリにかかる負担を軽減します。

そうつまり、ストアにアップするアプリのサイズを軽減することが出来るわけですね。
また、コンテンツ配信等にも使用できることになります。
アプリサイズには制約がありますし、サイズが大きくなることでDL数が減る場合もあるそうです。小さくするに越したことはありません。

使ってみよう

開発環境

  • Unity2019.2.21f1
  • Firebase(Authentication、Storage)

サーバーレスを利用する

AssetBundleはサーバーに置いてこそ、その技量を発揮します。
ところが自分みたいな個人開発ですとサーバーエンジニアなんて雇うことはできないし、ましてサーバーの知識なんて皆無なわけで。
ゼロから勉強スタートしてたら、工数がなんぼかかるかわかりゃしない。

そこで役に立つのが、サーバーレスという仕組みです。

詳しくはググっていただくとして(w
めっちゃ簡単に説明すると、サーバー管理は企業がやってくれて、ユーザーはその機能を使うことだけに集中できるシステムです。「レス」だからといって、サーバーが存在しない訳ではないのです。

サーバーレスには色んなシステムがあります(AWSGCPなど)。サービス内容、価格、機能、メリデメ等を比較し、自分に合ったサービスを選択しましょう。
今回はFirebaseを選択いたしました。

Firebaseとは

Googleの提供しているサービスです。以下のようなサービスを利用できます。

  • Authentication
  • Database
  • Storage
  • Hosting
  • Functioins
  • Machine Learning

おまけにUnityに組み込むためのSDKも公開されており、イタレリツクセリ!
リファレンスに沿って、SDKをインストールしておきましょう。
個人利用であれば無料プランで十分だと思います。(従量制プランもあります)

AssetBundleを作ってみる

さっそくUnityでAssetBundleを作ってみましょう!
AssetBundleも色々作り方があるっぽいのですが、私はシンプルにAsset Bundle Browserを使用しました。

Asset Bundle Browserをインストールする

f:id:s44511173:20200727115140p:plain

Package Managerからインストールできます。

AssetBundleにしたいオブジェクトを作成する

f:id:s44511173:20200727121318p:plain

 

PinkとGreenのCubeを2つ作ってみました。あらカワイイ。こいつらをPrefab化しておきます。そしたらSceneからは削除しちゃいましょう。
依存関係の確認がしたいので、PinkCubeをGreenCubeの子供にセットしました。

AssetBundleBrowserWindowを開く

Windowメニューから開くことができます。開いたらタブをどこぞのWindowに入れ込ん
でおきましょう。(そうしないと、次の手順でWindowが背面にいってしまうため)

f:id:s44511173:20200727121022p:plain

「Drag assets here ...」と書かれているところに、先程作ったPrefabたちをD&Dしましょう。

 

f:id:s44511173:20200727121437p:plain

すると、こんな感じになります。GreenCubeの子供のPinkCubeと、それぞれのMaterialが自動的に加えられていることがわかりますね。

Buildする

AssetBundleWindowをBuild画面に切り替えます。BuildTargetとOutput Pathを設定したら、Buildボタンを押下しましょう。

f:id:s44511173:20200727121652p:plain

f:id:s44511173:20200727121947p:plain

ファイルが出力されました。
greencube」がAssetBundleファイルになります。

f:id:s44511173:20200727122438p:plain

greencubeをFirebaseのStorageにアップロードします。これでAssetBundleの準備完了です!

 

AssetBundleを使ってみる

Firebaseのアカウントを作る

Authenticationでユーザーを追加します。開発中はAuthなしでも良いと思いますが、私は練習も兼ねて毎回Authありにしました。
メールアドレスとパスワードでログインできるようにします。

Firebaseを初期化する
// 初期化処理
Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
   var dependencyStatus = task.Result;
   if (dependencyStatus == Firebase.DependencyStatus.Available)
   {
// 成功 } else   {
// 失敗
} });

 

Firebaseのリファレンスにあるコードのまんまです。私はこれを見逃していて、いつまで経ってもできずに時間をロスしました(>_<)

Android 向け Firebase Unity SDK には Google Play 開発者サービスが必要であり、SDK を使用する前に最新版にしておく必要があります。

アプリケーションの先頭に次のコードを追加します。SDK で他のメソッドを呼び出す前に Google Play 開発者サービスを確認し、必要であれば、Firebase Unity SDK で必要とされるバージョンに更新します。(C)Firebaseドキュメント

ということで、↑のコードを必ず呼び出す必要があります。

Authする

Firebaseが初期化できたら、作ったアカウントでAuthしましょう。

var email = "xxx@xxxxxx";
var password = "xxxxxxxxxxx";
_auth = FirebaseAuth.DefaultInstance;
_auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(authTask =>
{
    if (authTask.IsCanceled)
    {
Debug.LogError("Auth処理がキャンセルされました"); return; } if (authTask.IsFaulted) {
Debug.LogError("Auth処理が失敗しました: " + authTask.Exception); return; } FirebaseUser newUser = authTask.Result; Debug.Log($"Auth処理に成功しました: {newUser.DisplayName} ({newUser.UserId})");
});

 

AssetBundleをダウンロードする

いよいよ本丸のAssetBundleダウンロードです!!
まずはダウンロードしたいAssetBundleのURIを取得します。

// ストレージアクセスインスタンスの取得
_storage = FirebaseStorage.DefaultInstance;
// 作成したストレージのURIを指定
var storage_ref = _storage.GetReferenceFromUrl("gs://xxxxxxxxxxx.appspot.com");
// ダウンロードしたいAssetBundleのストレージ内におけるパスを指定
var green_ref = storage_ref.Child("Sample/greencube");
// AssetBundleのURIを取得
await green_ref.GetDownloadUrlAsync().ContinueWith((Task<Uri> fetchTask) => {
   if (!fetchTask.IsFaulted && !fetchTask.IsCanceled)
   {
       // 取得成功
       _uri = fetchTask.Result.AbsoluteUri;
   }
});

 

取得したURIを使用して、AssetBundleをダウンロードします。

 using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(uri, version:, crc))
 {
       yield return uwr.SendWebRequest();
       if (uwr.isNetworkError || uwr.isHttpError)
       {
             Debug.Log($"AssetBundleのダウンロードに失敗しました: {uwr.error}");
       }
       else
       {
// ダウンロード成功 var bundle = DownloadHandlerAssetBundle.GetContent(uwr); var prefab = bundle.LoadAssetAsync("greencube");
var cube = (GameObject)Instantiate(prefab.asset); } }

ここでAssetBundleのバージョンとCRCを設定するのですが、これはAssetBundleのBuild時に一緒に出力されたmanifestファイルに記載されています。

実行してみる

f:id:s44511173:20200727135435g:plain

Start()でAuth処理を、ボタン押下でAssetBundleのダウンロード〜Prefabの実体化を行っています。できちゃった!!!
AssetBundleとして作成したのはGreenCubeだけですが、その依存関係にあるPinkCubeとそれぞれのMaterialもちゃんと入っていました。
もしこれらを別々のAssetBundleとする場合、依存関係にあるものを先にダウンロードする必要があるとか。キャッシュのせいでうまくダウンロードできないとか。
まだわかっていない部分が色々あるのですが、その辺は使いながら学んでいければと思っています。

結論

  1. Firebaseを使ってAssetBundleをダウンロードできる
  2. AssetBundle、ハードルは高いけどなんとかなる(今のところ)
  3. Firebaseの設定は結構めんどいので、がんばろう!!!

【Unity】オクルージョンカリングしてみる

Unityではオクルージョンカリングという機能が使えます。
どんな機能かというと、カメラに映らないオブジェクトはレンダリングしないよ〜ってやつです(なんてテキトーなw)。
VRやAR、モバイル端末アプリをやってると、処理を軽くする必要があるわけで。
これがどのくらい有効なのか、検証してみました。

開発環境 

  • Unity 2019.2.15f1
  • Japanese Otaku City(アセット)

秋葉を疾走

今回はオクルージョンカリングの機能を存分に発揮できるよう、秋葉の街を再現したアセットを使用しました。

assetstore.unity.com

ZENRINさん提供の無料アセットです。無料にも関わらず、結構な再現率。
さらにQueryちゃんというカワイコちゃんモデルまでついてくるという。
なんて太っ腹なんだ、ZENRINさん!!(秋葉以外もあるよw)

f:id:s44511173:20200316001154g:plain

デモシーンでは車だったりQueryちゃんだったりが、秋葉の街を疾走してくれます。
まずはこのデモシーンをオクルージョンカリングなしで実行してみます。

 

f:id:s44511173:20200316001028g:plain

左側の大きい画面がScene View、右下の小さい画面がカメラ映像となっています。
カメラ映像に写っている建物は一部であるにも関わらず、すべての建物がScene Viewに写っているのがわかりますね。

f:id:s44511173:20200316001530p:plain

Profiler Windowで負荷状況を見てみます。
だいたい18fps程度出ていることがわかりました。

オクルージョンカリングの設定

詳しくはこちらw

docs.unity3d.com

 

まず、オクルージョンカリングしたい対象に対し、Static設定を行います。
今回は建物たちを対象としたいので、建物のルートオブジェクトを選択し、InspectorからOcculuder StaticOcculudee Staticを選択します。

f:id:s44511173:20200315235749p:plain

 

ルートオブジェクトの下にいる子オブジェクトたちも一緒に設定したいので、Yes, change childrenを選択。

f:id:s44511173:20200316001203p:plain

 

次に、Occulusion Windowsを表示します。

f:id:s44511173:20200316001800p:plain

Smallest Occuluderでは、対象とするオブジェクトの最小サイズを設定します。とりあえず1を設定しましたが、建物が対象なのでもっと大きくて良いと思います。
画面右下のBakeボタンを押下してベイクしたら、実行してみましょう。

オクルージョンカリングしてみたらこうなった

f:id:s44511173:20200316001146g:plain

先ほどと同様、左側がScene View、右下がカメラ映像です。
カメラ映像はなんら遜色が無いのに対し、レンダリングされている建物が切り替わっているのがわかりますね。
次に負荷状況を見てみましょう。

f:id:s44511173:20200316002140p:plain

うわーぉ!!劇的な変化です!!
だいたい58fpsくらい出ていることがわかりました。これはすごい!!

 

結論

  1. たくさんのオブジェクトを配置する場合、オクルージョンカリング機能を使おう
  2. Profiler Windowで負荷状況を確認しよう
  3. ZENRINさんのアセットは優秀!サンキューZENRINさん!!

【Unity】【OculusQuest】ハンドトラッキングを実装してみる

あけましておめでとうございます!!
新年早々(というか大晦日から)インフルエンザでぶっ倒れておりました。
いやぁ、死ぬかと思った。。ようやく復活です。
今年もよろしくお願いいたします!!

開発環境

  • Unity 2019.1.2
  • Oculus Integration 12.0(バージョン表記が変わった?)

ハンドトラッキングとは

昨年末に公開されたOculusQuestの新機能です。
ソフトウェアアップデートのみで、手の動きをトラッキングできるようになります。
やばいよ、すごいよこの機能。
対応ソフトはまだまだ少ないのですが、これからが楽しみなところです。

実装方法

まずはOculusIntegrationをアップデートしましょう。現行の最新バージョン(12.0)を入れればオッケーです。

f:id:s44511173:20200104163056p:plain

予めシーンについているカメラを削除し、Oculus > VR > Prefabs > OVRCameraRigを追加します。

 

f:id:s44511173:20200104163129p:plain

追加したカメラのインスペクタを開き、OVRManagerのHand Tracking SupportはHands Onlyを選びましょう。

 

f:id:s44511173:20200104163117p:plain

ヒエラルキのOVRCamerRig > TrackingSpace > LeftHandAnchor に、Oculus > VR > Prefabs > OVRHandPrefab をくっつけます。
RaightHandAnchorにも同様にくっつけます。

f:id:s44511173:20200104163133p:plain

くっつけたOVRHandPrefabはデフォルトで左手設定になっているので、RightHandAnchorのそれを、右手用に設定します。

  • OVR Hand
  • OVR Skeleton
  • OVR Mesh

上記をHand Rightにしましょう。
これで実装完了です!ビルドして動かしてみましょう。

Quest側の設定

f:id:s44511173:20200104165510j:plain

Questのメニュー > 設定 から、手を使用を選択します。
これをやらないで、ずっっっっっとハンドトラッキングできない・・・と悩んでおりましたw

実行してみる

f:id:s44511173:20200104165724g:plain

キターーーーー!!!
きましたよ、手の動きがトラッキングできております!!
やばいよすごいよOculusQuest!!!

結論

  1. OculusIntegrationは12.0を使う
  2. OVRCameraRigにOVRHandPrefabを追加する
  3. Quest側では、手を使うを設定する

 

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

【Unity】【OculusQuest】ビルドせずとも動作確認が可能に!!

これだよ、これ!!
これを待っていたんだ・・・!!!

今までのOculus Questアプリの動作確認方法

Unity Editor上で開発したQuestアプリは、ビルドして端末にインストールしないと動作確認することができません。
ALVR(PCで動かしたVRアプリをWi-fiでQuestに飛ばすソフト)を使用する方法もあるのですが、私のネットワーク環境ではスペックを満たしていなく・・。
試したらめっちゃカクカクしており、とても使えたものではありませんでした。

そういう訳で仕方なく、修正してはビルド&インストールを繰り返しており、とても効率の良い開発環境とは言えませんでした。

Oculus Linkをインストールした今の動作確認方法

 Oculus LinkはALVRの有線版といったところでしょうか。
PCとHMDをUSB Type-Cでつないで、PC上で動かしたVRアプリをQuestでプレイできる機能です。
ってことは、Unity Editor上で動作させた開発中のアプリをUSB接続中のQuestでもプレイすることができるのではないか!?

と思って試してみたら、できましたー!!

 

・・・まあ、当たり前っちゃ当たり前?w
でもでも、これで本当に開発が捗ります。神機能をありがとう!!
atelier-hinata.hatenablog.com

Oculus Linkについてはコチラの記事でも紹介しています。

atelier-hinata.hatenablog.com

セットアップについてはコチラ。

疑問点

Oculus LinkってばRiftのソフトをQuestで動かせるようにするんだから、プラットフォームはPCに変えるのかな?と思っていたのですが、Androidのままでいけました。
OVRCameraRigのTargetDeviceもQuestのままです。
むしろ、だから動いたのかな?

ただ、コントローラでの方向転換がうまく動いていませんでした。
Rコントローラのジョイスティックで方向転換するはずが、移動になってしまいます。
Lコントローラのジョイスティックを操作した直後の1回のみ、方向転換できます。
この辺がもしかしたら、プラットフォームだったりTargetDeviceの設定のせいだったりするのかも?(未確認)

結論

  1. Osulus Linkのおかげで、Questアプリの動作確認が格段に効率アップ
  2. Linkで動作確認するQuestアプリは、コントローラ入力が少しおかしいかも

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

【VR】Oculus Link セットアップしました!【2019/11/25更新】

【2019/11/25更新】

これでQuestにはなかった、あ~んなゲームやこぉ~んなゲームが
出来るようになっちゃうのね・・・!!!

 Oculus Linkとは

atelier-hinata.hatenablog.com

前回の記事でご紹介していますが、RiftのアプリをQuestでも使えるようになる機能です。ソフトウェアのアップデートのみでいけちゃいます。
β版ではありますが、この機能がついにリリースされました!!

 

www.oculus.com

詳細は公式サイト様にて。

セットアップの仕方

Oculus Questのソフトをバージョンアップする

■2019/11/25更新■

スマホアプリで自動アップデートをONにし、スリープ状態で放置しておくと、自動的にアップデートされます。

Oculus Setupをダウンロードする

www.oculus.com

Riftをお持ちの方はご存じだと思いますが、OculusにはQuestから入った私としては、どーやったらRiftのアプリが遊べるようになるのだか、さーぱりわかりませんでしたw
どうやらOculus Setupというアプリをインストールする必要があるとのことです。
まずは上記URLからダウンロードしましょう。

Oculus Setupをインストールする・・・のだが。

f:id:s44511173:20191120172318p:plain

何度やっても、この画面でインストールが止まってしまいます。
調べた結果、インストールのログが出るので、それを確認してエラー要因を突き止めることが出来るとか。
C:\Users\(ユーザ名)\AppData\Local/Oculus/OculusSetup.logがそのログになります。
なお、ユーザ名が日本語だとログが出力されませんでした。

ログの中身

さっそくログを確認してみます。すると、こんなのが出ていました。

[Info] [2019/11/20 14:14:26] Driver version from supplied version file: 1.43.0.000002
[Error] [2019/11/20 14:14:38] Process C:\Program Files\Oculus\Support\oculus-drivers\oculus-driver.exe exited with code -1 (failure).
[Debug] [2019/11/20 14:14:38] Install 'Dawn.Setup.InstallDriversStep' failed.

 おおぅ、確かにインストールでコケとる!!(知ってた)
oculus-driver.exeってやつが失敗するんだな?
てことでコイツのインストールエラーについてGoogle先生に聞いてみましたが、結構いろんな人が困っている割には明解な回答が見つからず・・・。

レジストリをゴッソリ消すとか、Windowsをガッツリ再インストールするとか、怖いことばかり目につきました。
レジストリはまだしも、OS再インストールとか無理ですから!!

Windowsの更新

見かけた中でも比較的安心な、Windowsの更新を実行してみることにしました。
自動で実行されてると思ってたんだけど、そうじゃなかったみたいw
これにより、NVIDIAのドライバが更新されました。

ちなみに、Oculus LinkはPCのスペックに制約がありますのでご注意ください!
グラボはNVIDIAのみが対応となっています。詳細は、こちらのサイト様にて紹介されています。

www.famitsu.com

 再度インストールにチャレンジ

f:id:s44511173:20191120175206p:plain

グラボのドライバを更新した後、再度Oculus Setupのインストールにチャレンジしたら、見事成功いたしました!!
いや~、ここまでの道のり長かった・・・。
あとは画面に従って、セットアップを継続すれば完了です!

さっそく遊んでみる

f:id:s44511173:20191120174422p:plain

とりあえず無料のやつでw

f:id:s44511173:20191120174500p:plain

視点を動かすとすこーしだけ、画像の細かい部分がカクカクしましたね。
Riftで遊んだとしても、この細かさだったらカクカクするのかも知れませんが。
何はともあれ、無事にOculus Linkのセットアップが完了いたしました!!

結論

  1. Oculus Linkのセットアップには、Oculus Setupをインストールする
  2. インストールの経過は、ログに出力される
  3. インストールに失敗したら、Windowsを更新してみよう
  4. ダンスセントラルは有線で遊ぶものではないことがわかったw

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

【VR】【イベント】Oculus Connect 6 Meetupに参加してきました

2019/10/11、BINARYSTAR株式会社様イベントスペースにて開催された「Oculus Connect 6 Meetup」に参加してきました。
それについて、ご報告いたします!

イベントの構成

イベントは、次の構成で行われました。

  1. Oculus Connect 6 参加報告
  2. VRトレンド紹介
  3. Oculus 体験会
  4. 交流会

なのですが、いかんせん台風19号直撃前夜。
3,4はごく短時間に省略されました。

Oculus Connect 6 参加報告

f:id:s44511173:20191013190810p:plain

Oculus Connectとは、年2回(5月と10月だったかな?)にシリコンバレーで開催されるFacebook公式のOculusイベントです。
 マークザッカーバーグ氏も登壇したとのことでしたが、すみません、無知な私はどなたか存じ上げませんでした・・・。FacebookのCEOだったのですね。

 

f:id:s44511173:20191013191554p:plain

来春以降にもOculusQuestのソフトバージョンアップのみで実現されるハンドトラッキング機能についても、紹介があったようです。
いやー、これ本当に楽しみですよね!
この後紹介されたビジネス向けVRでは、ハンドトラッキングが非常に好評だったようです。なんてったって、ゲーマーじゃない方にコントローラの説明が不要になったわけですから!!(笑)

ビートセイバーやる時にコントローラをぶん投げそうになるんですよ。なので、私もコントローラが不要になるのは非常にうれしいです。

 

f:id:s44511173:20191013192043p:plain

そのビートセイバー開発者の方が、赤いTシャツの登壇者の方。
よーくご覧になってください。Tシャツのプリントwww
左に映っている方も、何かの開発したすごい人(すみません、大事なところ失念)なようです。その方が会場を徘徊されていて、フランクに参加者の質問等に答えていたとのことでした。
そんなイベントなので、次回はぜひ皆さんもご参加してみては?と登壇者の方がおっしゃられていましたが、英語というドデカイ壁があるやん・・・。あと費用とかもさぁ・・・。

OculusQuestのアップデート

f:id:s44511173:20191013192913p:plain

OculusQuestの今後のアップデートについても発表がありました。

PC用だったOculus RiftのアプリをQuestでも使えるようになる機能です!!
これでソフトの幅が大きく広がりますね。
PCとQuestをType-Cで接続するわけですが、Unityエディタでのデバック実行もできるようになったりするのでしょうか。
個人的な話ですが、ALVRで実行するには家のWi-fi環境がヨロシクなくて・・。
いずれ変えなければと思っています。

なお、Riftと全く同等の体験ができるわけではなく、だいたい80%くらいの実現度だそうです。いずれはType-CではなくWi-fiでも実現したいとのことでした。
今はエンコード/デコードでどうしても遅延が発生するとのことです。

ハンドトラッキング

前述の通りです。

VRトレンド

Half Dome

f:id:s44511173:20191013194316p:plain

可変焦点を実現した次世代VRバイスです。
可変焦点とは、焦点を当てているものはハッキリ見えるけれど、それ以外のものはぼやけて見える機能のことです。
現時点のVRでは焦点を当てていようが当てていまいがハッキリ見えてしまい、それが違和感として残ってしまっています。
これが解消できたら、かなり現実に近い体験ができるのでしょう!

Half Domeは現時点で3まで開発が進んでいるそうです。
普及を考えると、Quest同様の5万円が上限とのこと。なんて太っ腹!!

Hyper-Realistic Virtual Avatar

f:id:s44511173:20191013194538p:plain

ヘッドセットのカメラで顔を認識し、アバターの表情をリアルに合わせるといった機能です。アバター自体は事前に作る必要があります。

Oculus for Business

f:id:s44511173:20191013195020p:plain

ビジネス向けのVRに特化したヘッドセットです。
実際にヒルトンホテルや外科手術の訓練現場で使用され、未使用よりも成果が上がったとのこと。
なにより、今までVRはゲーム向けとしてしか認識されていなかったのが、ようやくビジネス向けにも認められてきたというのが素晴らしい!!
Oculus Connectでも「THE TIME IS NOW(VRビジネスの時はきた)」がロゴになっていたようです。

ARトレンド

SparkAR

f:id:s44511173:20191013195811p:plain

FacebookInstagramで利用できるAR機能。
カメラアプリで撮影した写真を使っていたので、そんな機能がついてること知らなかったとですよ・・・。

LiveMaps

f:id:s44511173:20191013200157p:plain

ARグラスになるのか、はたまたコンタクトレンズになるのか。
形態は不明ですが、これが実現したらマジでSF映画の世界になります。
例えば映画館に行くと、映画の情報が空間に浮かんで表示されたり
竹林に行けばバーチャルな鶴が現れたり。
同じ時間・同じ場所にいる人たちが全員同じ映像を見れるようになるとのことで、実現できたら末恐ろしいとまで思いました。

f:id:s44511173:20191013200454p:plain

でも、この機能欲しいw
階段を降りるときにリマインダーが表示される機能ww
階段降りちゃってから忘れ物に気づいた時の絶望感www

VR会議

f:id:s44511173:20191013200641p:plain

私自身はVR会議どころか、TV会議もSkype会議もしたことがないのですが。
やはり表情や目線、手の動きが見える会議が一番とのことでした。

Skype会議だと話がかぶってしまい、結局はトランシーバーのような会話になってしまう。TV会議だと映らない人もいる。
文字だけでは伝わらないニュアンスが必要ではあるが、かといって会議のために全員が対面するだけの移動費・時間・場所の準備はもったいない。そういった経緯から開発に至ったとのことでした。

実際にVR会議をしながらVR会議ソフトを開発され、実体験をもとに改良されていったようです。

結論

Oculus LinkとハンドトラッキングtoB VRトレンドが熱い!!!(当社比)

 

 

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

【Unity】【OculusQuest】制限時間を表示する

f:id:s44511173:20191009165429g:plain

制限時間のカウントダウンを、イライラ棒の先端に表示してみました。
数字表示と共に時間ゲージの円が欠けていく仕組みになっています。

開発環境

イライラ棒Canvasを追加する

f:id:s44511173:20191009170442p:plain

Render ModeはWorld Spaceに設定しましょう。
Event CameraにはOVRCameraRig > TrackingSpace > CenterEyeAnchorを設定します。

カウントダウン用のTextをCanvasに追加する

アウトラインをつけたかったのでTextMeshProにしましたが、普通のTextでもOKです。

時間ゲージ用のImageをCanvasに追加する

f:id:s44511173:20191009171415p:plain

時間ゲージ用の画像を準備します。
インスペクタでTexture TypeをSpriteに設定しておきましょう。
これをImageのSourceに設定します。

 

f:id:s44511173:20191009171856p:plain

そうすると、Imageのインスペクタ上にImage Typeという項目が出てきます。
こいつをFilledに、Fill MethodをRadial360に設定してやります。
これで円が欠けていく時間ゲージが実現できます!
上から欠けていきたいのでFill OriginをTopに、満円からスタートしたいのでFill Amountは1にしましょう。

スクリプトからゲージ値を設定する

あとはこんな感じのスクリプトを書けばOK!

[SerializeField]
private TextMeshProUGUI time; //インスペクタからセット
[SerializeField]
private Image timebar; //インスペクタからセット
private int timelimit = 30; //ステージ毎に値を変える
private bool run = true; //ゲームオーバーになったらfalse

public async void Countdown() {
    while (timelimit > 0) {
        await Task.Delay(1000);
        timelimit--;
        if (run) {
            time.text = string.Format("TIME:{0:00}", timelimit);
            timebar.fillAmount -= timediff; //時間ゲージの満ち欠けを設定
        }
    }

    if(timelimit == 0) {
        run = false;
        GameOver();
    }
}

 これでイライラ棒の先端に制限時間を表示できるようになりました!

 

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

 

【Unity】【OculusQuest】Bloomさせる

f:id:s44511173:20191008113317p:plain

BEAT SABERっぽい雰囲気を目指すんなら、やっぱりBloomさせなきゃですよね!?

開発環境

エフェクト使用について

unity3d.com

上記URLの「VR でのイメージエフェクトの使用」に記載されていますが、イメージエフェクトは非常に負荷が高くVR向けではありません。
よって、使用の有無をよく検討する必要があります。

VRイライラ棒に関して言えば、他に重たい処理もありませんし
何よりBEAT SABERっぽくするのが大目的です。
よって遠慮なく使うことといたしました。

Post Processingをインストールする

f:id:s44511173:20191008114748p:plain

Bloomさせる一番手っ取り早い方法は、PackageManagerにあるPost Processingを使うことだと思います。Post ProcessingはメニューのWindow > Package Managerから表示されるPackageウィンドウからインストールします。
※未インストール時は、上記画面のボタンがInstallになります。

Post Process Layerをアタッチする

エフェクトを適応するカメラにPost Process Layerコンポーネントをアタッチします。
OculusIntegrationを使用している場合、OVRCameraRig > TrackingSpace > CenterEyeAnchor にアタッチしましょう。

f:id:s44511173:20191008115508p:plain

アタッチしたら、エフェクトを適応するLayerの設定を行います。
Anti-aliasingのModeですが、せっかく準備されているのです。遠慮なく使っちゃいましょうw

アンチエイリアスについてはProject SettingsのQualityで2x~4x Multi Samplingを適応するようにOculusで推奨されていますが、Post Processで適応するので今回は外してみました。

HDRを適応する

f:id:s44511173:20191008121848p:plain

Post Processingを使用するにはHDR(High Dynamic Rangeレンダリング)を有効にする必要があります。
VRではカメラの設定からHDRを有効にはできないので、Project SettingsのGraphics Settingsから設定します。

f:id:s44511173:20191008122314p:plain

Use Defaultsをオフにすると各項目が活性になりますので、Use HDRをONにします。
Low・Middle・Highの設定項目がありますので、同様にすべて設定します。

Post Process Volumeオブジェクトを作成する

新規オブジェクトを作成し、レイヤーをPost Process Layerで設定したのと同じものを設定します。そのオブジェクトにPosr Process Volumeスクリプトををアタッチしましょう。

f:id:s44511173:20191008123053p:plain

Is GlobalはONにしておきます。OFFにすると、オブジェクトからの距離でエフェクトをかける範囲を設定できます。
ProfileでNewボタンを押下すると、プロファイルが作成されます。
このプロファイルにエフェクトを追加していく感じになります。

Bloomを追加する

PostProcessStack Profileを開くと、エフェクトを追加する画面が出てきます。
こちらからBloomを追加しましょう。

f:id:s44511173:20191008123424p:plain

IntensityはBloomの強さ、Thresholdは発光の閾値です。
オブジェクトのIntensityが設定値以上のオブジェクトのみが発光します。
VRですので、Fast ModeはぜひONにしておきましょう。

これでBloomの設定は完了です!

発光マテリアルの作成

マテリアルを発光させるには、Standard ShaderのEmissionを使用します。
Emissionについては、下記URLに詳しく記載されています。

docs.unity3d.com

 

VRイライラ棒ではイライラ棒とステージが発光しています。
発光の度合いを変えるために、イライラ棒側のIntensityを強めに設定してあります。

f:id:s44511173:20191008124401p:plain

左がイライラ棒、右がステージのIntensity設定です。

 

f:id:s44511173:20191008125751g:plain

これで発光強度の異なるオブジェクトが配置できました!

結論

  1. Bloomさせるには、Post Processingを使用する
  2. オブジェクトを発光させるには、Standard ShaderのEmissionを設定する
  3. EmissionのIntensityの強さによって、発光強度を変えられる
  4. 発光させたくないオブジェクトは、Intensityを閾値以下に設定する
  5. Bloomすると一気にBEAT SABERっぽくなる!(当社比)

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

【Unity】【OculusQuest】立ってプレイするゲームを作る

OculusQuestはスタンドアロンVR機です。
せっかくなんですから、立ってプレイしたいですよね!?
そんなあなたの希望を叶える方法をご紹介します。

開発環境

OVRPlayerControllerを使う

atelier-hinata.hatenablog.com

↑の記事でご紹介しましたが、OVRPlayerControllerを使うとVR空間内を自由に移動することができます。
このコンポーネントUse Profile Dataというパラメータがありまして、プレイヤーの物理的な身長データを使用するかどうかを選択できます。
まずはこいつをONにしましょう。

f:id:s44511173:20191007145127p:plain

TrackingOriginをFloor Levelにする

次に、OVRCameraRigにアタッチされているOVRManagerのTracking Origin Typeを変更しましょう。

f:id:s44511173:20191007144854p:plain


これでオッケーです!
あとはプレイ前のガーディアン設定で、床の調整をしっかりとやっておきましょう。
コントローラを床にタッチさせることで、正確に検知することができます。

比較してみる

f:id:s44511173:20191007150921g:plain

f:id:s44511173:20191007150941g:plain

あああ、めっちゃ分かりづらい(汗

1個目の動画がUseProfileData=あり、TrackingOriginType=FloorLevel
2個目の動画がUseProfileData=なし、TrackingOriginType=EyeLevel

1mのキューブを床に配置しています。
なんとなく違いがお分かりいただけたでしょうか・・・。

結論

  1. 立ってプレイするアプリを作るには、OVRPlayerControllerのUseProfileData=あり、OVRCameraRigのTrackingOriginType=FloorLevelに設定する。
  2. OculusQuestに床位置をきちんと認識させるには、ガーディアン設定時にコントローラで床をタッチすると良い。
  3. ぶっちゃけ、設定はそのままでカメラの位置だけ上の方に設定するのでも良かったりするのかも・・・?(未検証)

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

【Unity】【OculusQuest】イライラ棒を作る

f:id:s44511173:20191001175736g:plain f:id:s44511173:20191001175741g:plain

イライラ棒を作った時の苦労話をツラツラと書いていきたいと思います。
結構苦労したんですよ、本当に。

開発環境

OVRPlayerControllerを使う

Oculus Integrationをインポートすると、膨大な量のサンプルシーンやPrefabがインストールされます。今回はその中から、OVRPlayerControllerを使用しました。
Assets > Occulus > VR > Prefabs に入っています。

OVRPlayerControllerにはCharacterControllerがアタッチされているので、スクリプトを組むことなくVR空間内を自由に移動することができます。
これにはOVRCamerRigがアタッチされていますので、通常のCameraがシーン内にある場合は削除しましょう。

AvatarGrabberRightを使う

今回は右手でイライラ棒を操作するので、AvatarGrabberRightを使用します。
Assets > Occulus > SampleFramework > Core > AvatarGrab > Prefabs に入っています。

なぜこれを使ったかというと、最初は手のアバターを表示してイライラ棒を掴んで操作しようと思っていたからです。
ですがBEAT SABERを思い出してみたら、手のアバターは表示されていないんですよね。という訳で、その名残というのが理由ですw

コントローラの位置や角度が取得できれば、他でも良いと思います。

 

f:id:s44511173:20191004144012p:plain

なお、AvaterGrabberRightはOVRameraRigの子オブジェクトとして設定します。
OVRPlayerControllerでUser Profile Dataを使用する設定にしていると、こうしないと手の位置が正しく表示されませんでした。

イライラ棒を作る

f:id:s44511173:20191004144249p:plain

柄の部分を中心位置としたいので、柄(Cube)の子オブジェクトとして刃(Cylinder)をくっつけました。

 

f:id:s44511173:20191004144623p:plain

イライラ棒を引っこ抜けないように(引っこ抜いたらビリビリさせる)、刃の前後にもコライダをくっつけました。
最初は透明にしていたのですが、透明だとビリビリしたときに「なんで!?」となってしまったので、すこーしだけ見えるようにしてみました。
が、なんだか余計に見えづらくなってしまったという・・・(汗)

動かしてみる

f:id:s44511173:20191004145439g:plain

これでイライラ棒が出来上がりました!
なお、イライラ棒ですので失敗すると当然のごとくビリビリしますw

f:id:s44511173:20191004150049g:plain

OVRInput.SetControllerVibrationメソッドを使用すると、コントローラをビリビリさせることができます。

ビリビリのエフェクトは、勉強中のUnityゲームエフェクト入門で作ったやつをそのまま使ってしまいましたw

www.shoeisha.co.jp

 

結論

  1. OVRPlayerControllerを使うと、VR空間内を自由に移動できる
  2. AvatarGrabberRightを使うと、コントローラの位置を取得できる
  3. コントローラをビリビリさせるには、OVRInput.SetControllerVibrationメソッドを使う
  4. イライラ棒すっぽ抜け防止のアイディアが最悪。もっと良い案モトム。

 

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑

 

 

【Unity】【Aseet】Exploderを使ってみた

メッシュを爆発させるアセットで有名なExploderを買ってしまいました。
Humble Unity Bundle祭りで、お財布のヒモが緩んだ隙の出来事でした。

 

f:id:s44511173:20191003122825g:plain

f:id:s44511173:20191003123013g:plain


VRイライラ棒の記事を次回から・・・と言っておきながら
まさかのアセットネタです。だって書きたかったんだもん。
しかも紹介するのが、Bundleの中身じゃないという。ナニコレ珍百景

 

Exploderとは

assetstore.unity.com

explodeとは爆発させるという意味でして。
その名の通り、メッシュを爆発させてくれるアセット(35ドル)になります。
めっちゃ楽しい。いろんなものを爆発させたくなります。危険思想ですな。

使い方

まず、Exploderを購入&ダウンロード&インポートします。
消費税はキッチリ10%取られました。9月のうちに買っておくんだった・・・。

 

f:id:s44511173:20191003124617p:plain

次に、ヒエラルキー上にExploderのPrefabを配置します。
Assets>Exploder>Prefabsに入っています。

 

f:id:s44511173:20191003125846p:plain

破壊したいオブジェクト(青)と破壊したくないオブジェクト(赤)を並べます。
スフィアと衝突したら破壊する仕組みです。
破壊したオブジェクトには「Exploder」タグをセットします。
これはアセットをインポートすると自動で追加されます。
こんなコードを書いて、スフィアにアタッチします。

[SerializeField]
private ExploderObject exploder; //インスペクタからセットしておく
private Rigidbody rigid; //キーボード操作用
private readonly string ExplodalTag = "Exploder"; //爆発させたいオブジェクトのタグ
private readonly string UseObjectTag = "UseObject";// 爆発させたくないオブジェクトのタグ

void Start()
{
    rigid = GetComponent<Rigidbody>();
}

void Update()
{
  //WASDキーで操作
    var x = Input.GetAxis("Horizontal");
    var z = Input.GetAxis("Vertical");

    rigid.AddForce(x*2, 0, z*2);
}

private void OnCollisionEnter(Collision collision) {
    if (collision.gameObject.tag == ExplodalTag) {
        // ぶつかった対象を爆発させる
        exploder.ExplodeObject(collision.gameObject);
        Debug.Log(collision.gameObject.name);
    }
    // 移動停止
    rigid.velocity = Vector3.zero;
}

これで動かした結果がこちら。

f:id:s44511173:20191003131640g:plain

・・・なんか、へん。

1回目の爆発は余韻が、破片の飛び散りがあっという間に終わってしまい
2回目の爆発はぶつかってからのタイムラグがありすぎる。
ナニコレ珍百景、アゲイン。

原因を探ってみる

OnCollisionEnterで出力しているデバッグログを見てみると、こんな感じになっていました。

f:id:s44511173:20191003133023p:plain

おふ。なにこのfragment_xxってヤツら。こんなの 配置してないんだけど!?
ナニコレ珍百景、リターンズ。

おそらくExploderが破壊したメッシュたちの破片にぶつかっていて
そいつらをも破壊しようとしているんだと思われます。なんて律儀な。

設定値を確認してみる

それって、まず最初にやることなんじゃないの・・・?

f:id:s44511173:20191003133538p:plain

まずは爆発関連から。

  • Radius・・・爆発判定の半径。後ほど記述しますが、オブジェクトを爆発させることの他に、自身を爆破して周囲を巻き込むことができます。その巻き込む半径になります。
  • Force・・・爆発力
  • Target Fragments・・・爆発させた後の破片の数。初期値が100になっていまして、これだとめっちゃ重たくなるw
  • Use Force Vector・・・爆破した破片の飛び散る方向をセット(ONにすると、XYZ入力ボックスが出てくる)
  • Ignore Tag・・・爆破したいオブジェクトの判定に、タグを使いたくないときにONにします。その場合、爆破したいオブジェクトにはExplodableスクリプトをアタッチする必要があります。
  • Explode Self・・・爆破させた後、自身を非アクティブにします。
  • Hide Self・・・爆破させた後、自身を非表示にします。
  • Delete Original Object・・・爆破したオブジェクトをdeleteします。オフの場合は、非アクティブになります。
  • Uniform Distribution・・・デフォルトでは、Exploderの中心から近い位置にあるオブジェクトは、多くの破片になります。遠いオブジェクトは、少ない破片になります。このオプションをオンにすると、オブジェクトの中心からの距離に関係なく、オブジェクトごとに均等にフラグメントの数が作成されます。
  • Split Mesh Islands・・・同じメッシュの非接続部分を分離して破片にします。
  • Disable Triangulation・・・???
  • Use 2D Physics・・・2Dに適応する際、ONにします。
  • Use Cube Radius・・・爆破範囲をスフィアではなく、キューブに設定します。
  • Multi-Threading・・・使用するスレッド数を設定します(最大3)
  • Cutting Plane Angle・・・破片の形状を選択します。

f:id:s44511173:20191003140247p:plain

次に、破片関連。

  • Pool Size・・・破片オブジェクトはプールされているのですが、その上限数を設定します。TargetFragmentより大きくしないと、例外が発生します。
  • Explodable Fragment・・・破片を爆破対象とするかどうか、です。これをオフっておけば、爆破した破片にあたって爆破して、さらにその破片を爆破して・・・っていう永久ループを免れます!!
  • Layer・・・破片オブジェクトのレイヤーを設定します。
  • Mesh Colliders・・・破片のコライダをメッシュコライダにします。重たいので、非推奨とのこと。
  • Disable Colliders・・・オンにすると、破片にコライダが適応されません。
  • Max Velocity・・・破片の最大速度を設定します。
  • Max Angular Velocity・・・破片の最大角速度を設定します。
  • Inherit Parent Physics・・・親オブジェクトの物理プロパティを継承します。
  • Mass・・・破片の重量を設定します。
  • Use Gravity・・・オンにすると、重力がかかります。
  • Angular Velocity・・・破片オブジェクトの角速度を設定します。MaxAngularVecocityで設定した以上にはならないっぽい。(設定自体はできます)
  • Random Angular Velocity・・・角速度をランダムにします。オフの場合、自身でセットした値にすべてのオブジェクトが回転します。
  • Freeze Position・・・オンにすると、面白いことになりますw
  • Freeze Rotation・・・回転しない軸を設定します。
  • Material・・・破片のマテリアルを設定します。設定しない場合は、爆破されたオブジェクトのマテリアルが適応されます。
  • Fragment Deactivation・・・破片の無効化を設定します。Never/Outside Of Camera/Timeoutから選択します。
  • Fragment Particles・・・破片にパーティクルを付けることができます。

以上を踏まえて

やりたいことを整理しましょう。

  1. スフィアに青いキューブがぶつかったら、その青キューブのみを爆破。
  2. スフィアに赤いキューブがぶつかったら、赤いキューブの半径2m範囲で爆破。
  3. 破片は爆破対象ではない。したがって、スフィアがぶつかっても爆発しない。
  4. 破片は床に散らばる。3秒後にフェードアウト。

設定値はコチラ!

f:id:s44511173:20191003150201p:plain

f:id:s44511173:20191003150007p:plain

 

コードは、OnCollisionEnterをこんな感じにしてみました。

private void OnCollisionEnter(Collision collision) {
    if(collision.gameObject.tag == ExplodalTag) {
        // ぶつかった対象を爆発させる
        exploder.ExplodeObject(collision.gameObject);
    } else if(collision.gameObject.tag == UseObjectTag) {
        // 自身が爆発して、周囲を巻き込む
        exploder.ExplodeRadius();
    }
    // 移動停止
    rigid.velocity = Vector3.zero;
}

直接オブジェクトを爆破したい時はExplodeObjectを、周囲を巻き込みたい時はExplodeRadiusを使います。
巻き込まれて爆破したいオブジェクトには、タグにExploderを設定しておきましょう。

実行結果

f:id:s44511173:20191003150325g:plain

やりたかったことが、できました!!

結論

  1. 爆発させたい時は、Exploderアセットを使うと便利
  2. 初期値のままだと、思うように動いてくれないので注意
  3. 面倒臭がらず、まずは取説を読もう
  4. これでVRイライラ棒で失敗した時に・・・クククッ

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑