ゲーム内でVRMモデルに攻撃に当たった時にBlendshapeを操作して表情を変える
OculusGoでゲームを作成しました。ゲームではVRMモデルを配置して、攻撃が当たったらそれをトリガーにして表情を変えるようにしました。そんなに難しいことはしてなくて、攻撃で使用されるオブジェクトがモデルに当たったらBlendshapeの値を変更しているだけです。それでも状況に合わせて表情が変わるとリアリティが出るな~と思いました。
VRMのBlendshapeについては下記URLを参考にしてください。
ブレンドシェイプの設定 - dwango on GitHub
- 使用したツール / 環境
- やりたかったこと
- 当たり判定 & Blendshapeの変更
- 感想
OculusGoでリリースする際のテクニカルレビューポリシーのポイントを整理する
OculusGoでアプリをリリースするときに、下記URLに記載されている要件を満たす必要があるのだが、毎回調べるのも面倒くさかったので、自分が過去にハマったポイントだったり、実装が必要だったりする部分をまとめた。今回、一発でテクニカルレビューは通っているので、問題ないはず。
Mobile Virtual Reality Check (VRC) Guidelines
- 使用したツール / 環境
- チェック表
- 関連記事
- まとめ
OculusGoアプリのリリースに向けて行ったパフォーマンス・チューニングまとめ
Oculus Go でリリースする時にどうしても問題になるのが、パフォーマンス・チューニングです。今回のリリースで何を対応したか記載します。まず、常時60FPSは出ている必要があるために確認したところ、全シーンで30~40FPS程度しかでていなかったので、フレームレートが低いことを解消することを目的としました。
- 使用したツール / 環境
- 最初にやったこと
- 現在のパフォーマンスと負荷の原因を確認する
- さらに修正方針を検討
- やった中で効果的だったこと
- 無駄な描画の削除
- 影の描画設定の変更
- やったけどそこまで効果がでなかったこと
- 設定の最適化
- Occlusion Culling
- まとめ
- 感想
OculusGoで起動しているアプリのパフォーマンス情報をUnityのProfilerから確認する
ゲームを作成していて、FPSが60にいかないのでアプリを起動している状態でのProfilerを確認する方法を調べた。
OculusGoで起動しているアプリのProfilerを確認する方法
www.vrgo.tokyo
使用したツール / 環境
- Unity 2017.3.1f1
やったこと
上記サイトと少し違かったのは、私の環境では
この2つにチェックを入れいてること。
それと、Buildした後に
Window > Profler だけだと反映されていなかったので、Unityを再起動しました。これで起動したので、うまくいかない人は試してみてください。
感想
後はパフォーマンス・チューニングを。。。。
Rigidbodyを使用しないでオブジェクトの軌道予測線を表示する
またVRゲームを作っていて、飛んでくるオブジェクトを斬っていくゲームなのですが、イメージとしてはSAO2期 9話「デス・ガン」でキリトがシノンを守って敵の弾丸を全て叩き落とした時のようなシーンを作り出したいなと思っていて、今回はそのゲーム世界の要素の一つである「弾丸の軌道予測線」の作り方についてまとめます。(わからない人はアニメ見てください!)
こんな感じで、オブジェクトを生成すると同時にその軌道を線で表示します。その線の軌道をオブジェクトが動きます。
- 使用したツール / 環境
- 作り方
- オブジェクトの配置
- LineRendererの設定
- Prefabs化からのオブジェクト生成
- まとめ
- 感想
DOTweenProでオブジェクトを動かす
Tween系で有名な、DOTweenPROを使用してみました。以下みたいなアニメーションをかなり楽に作ることができます。なんか、装備している武器の変形とかかっこよくできそう。
- やりたいこと
- 使用したツール / 環境
- やること
- DOTweenの購入・インポート
- オブジェクトの配置
- 実装
- 感想
Simple Mesh Cutter を使ってみた。【使用方法】
こんかいはSimple Mesh Cutter のアセットを使ってみたので、そのメモを残します。
完成形がこちら。
今回書きたいこと
ただ、使用方法が最初わからなかったので、簡単に使用するための方法について書きます。内容的にはサンプルシーンにあるのを真似ただけなのですが、自分でもきっと忘れてしまうと思うのでまとめます。実際にどういう挙動しているのか、コードはそのうち読みたいなと思ってます。
使用したツール / 環境
- Unity 2018.13f1
- SimpleMeshCutter
- UniVRM
まずやること
斬られるがわ
Cubeを使用しました。
Cubeに"CutterTarget"と"Slicer"スクリプトをアタッチします。CutterTargetのMeshにはHierarchyから配置したCubeをドラッグします。
これで準備完了。
斬る側
斬る側では、斬るための剣をParticleを使用して作成しました。さらに、Particleの親オブジェクトに、Colliderをアタッチしたオブジェクトを子として配置します。そして、このColliderに対して"Cutter"と"Blade"と"Rigidbody"をアタッチします。
その後はRigidbodyのConstraintsのチェックをすべて入れます。こうしておかないと、斬ったあとにオブジェクトがふわふわどっかへ飛んでいきます。
次は、CutterスクリプトのCutDefaultMaterialに"Cut"を追加して、BladeスクリプトのOverride Materialに"DestructionAddtiveGS"とEffectPrefabに"BladeEffect"を追加します。これで一通り完了です。あとは、ColliderがうまくCubeを通り過ぎるように動かしてみてください。
感想
いちおう動いたけど、中身をみないと詳しくはわからないので、ちゃんと確認しておきたい。
Oculusのテクニカルレビューで指摘された内容と対応方法
前に作成したゲームを改良して、OculusStoreへのリリースまで実施してみた。(実際はコンテンツレビューでKeyのみのリリースとなってしまいましたが)
その時にテクニカルレビューでリジェクトされた際に指摘されたメッセージとその対応策について記載します。
使用した環境
- Unity 2018.13f1 → Unity 2017.3.1f1
課題の説明
今回、受けた指摘と対応した内容を記載しました。
OverView | Result | 対応した内容 |
---|---|---|
Headlocked menus and UI elements are generally uncomfortable for the user and should be avoided. | A headlocked box with "Time" and "Targets" are displayed during gameplay. | 常に表示しているUIをHMDの動きにピッタリ合わせて動いてはいないと思い、HMDが動いたあとになめらかにUIが追従するような実装に変更した。Quarternion.Lerpで回転をゆっくりにすることで対応。ただ、それでもだめだったので、HMDとUIは同期させてはだめだとわかり、UIは銃に追随するように変更した |
The app runs and installs without crashing, freezing, or entering extended unresponsive states. | Steps to reproduce: 1) The user boots the app. 2) Progresses to the main menu. 3) Exits the app via "Back" or "Oculus" button. 4) Boots the app for a second time. 5) An indefinite "Black Screen" appears. At this point, the user has to fully shutdown or restart their Oculus headset. | どうしてもゲームを再度起動しようとするとクラッシュしてしまう。色々調べたがUnityのバグっぽかったので、Unityのバージョンを2017に落としたら改善された。 |
The app must request the minimum number of permissions required to function. | Your app is asking for excessive user permissions or using user permissions inappropriately. -Access Microphone Please remove all unnecessary permissions. If your app requires any of the permissions listed above please explain in detail why your app needs the permission in order to function. | 下記URLの通りに対応したら問題なく対応できた。スクリプトにあるクラスをみて自動で不要な権限が入ってしまうので、Micが使用されているスクリプトを削除するとOK。http://littlewing.hatenablog.com/entry/2018/09/04/170626 |
その他課題
ビルドの際に、Texture Compression を推奨通りにASTCにするとCrashしてしまう。そのため、ETC2にしてビルドした。
性能がでなかったため、Profilerで何に使用されているかを確認した。今回購入していたHighLightingSystemにかなりリソースを食っていたため使用しない方針にした。
感想
想定外の挙動をしたときにlogcatだけではわからず、バージョンを下げたりしたので色々と試しながらの対応が必要だった。そのへんの解決に異常に時間を取られてしまったので、今後は原因究明と切り分けは別で対応していきたい。
あと、リリースをすることはとても勉強になった。次はちゃんとStoreに並べたいと思う。
AtCoder Beginners Selection をやってみた
お勉強の一環として、AtCoderの AtCoder Beginners Selection をやってみた。Unityを触るのとは少し勝手がちがったのだけれど、やはり何をしたくてそれをどうすればできるのかを考えるプロセスは変わらないなーと思った。
今回やったこと
AtCoder Beginners Selection の全問といてみた。
AtCoder Beginners Selection - AtCoder
感想
自分が書いたコードとまったく同じ目的をもって書かれた他の人のコードを読むことができる点は非常に良いなと思った。勉強方法として人のコードを読むけれど、自分ならこうしたけどこの人はこうしたんだーというのがしっかりと比較できるのは最高。自分の愚かさを再認識することができる。
正直できないところは人のコードを見るのも手だと思った。人のコードを読んで、何をしているのかをちゃんと考えてそれを写経するだけでも十分な勉強になる。あまりにハマりすぎたあとに人の回答をみると、疲れすぎてサボり心(次の問題にいこっかな~~)と戦う必要があるので、割と早めに見るのがよいと思う。今回は特にコード量が少ないものをピックアップして見てた。
すごいなと思ったのは、問題の性質を抽象化?して、実装しているもの。このケースはこうで~このケースは~とか書いていると、絶対終わっているコードになるなという思いとも戦う必要がでてくる。
ところどころ、そもそも言語選択や問題選択をミスってNGになっているのもあり、ちょっと勢いで提出してしまっている部分もあるので、もっとちゃんと詰めながらやっていきたい
VRMのBlendShapeをスクリプトから変更する
VRMでBlendShapeを操作して、キャラクターの表情を変更できるようにしました。Lerpを使ってなめらかに変更できます。
今回つくったもの
やりたいこと
BlendShapeの値を操作して、キャラクターの表情を変更させたくて、かつLerpでなめらかに変更することで生きた表情を作りたいと思いました。
使用したツール / 環境
- Unity 2018.13f1
- UniRx
- UniVRM
全体像
Buttonを押すと ReactiveProperty の値が変更され、それを契機に表情を変更するメソッドを実行しています。
実装
表情の変更
こちらは、VRMのBlendShapeについて説明されているサイト。
ブレンドシェイプの設定 - dwango on GitHub
こちらは、VRMのBlendShapeをスクリプトから変更する方法が記載されているサイト。
BlendShapeを操作する - dwango on GitHub
今回、表情を変えるためにの実装は以下のコルーチン内で行っています。ReactivePropertyの値が変わる→表情を変更するためのメソッドを実行する→以下のコルーチンで表情を変更する。といった流れになっています。色々考えたのですが、Lerpで処理する場合これかなと。他にいい感じの実装方法ないかな。
IEnumerator BlinkCoroutine(VRMBlendShapeProxy proxy) { float blinkParameter = 0; blinkParameter = Mathf.Clamp01(blinkParameter); while (blinkParameter <= 1) { proxy.SetValue(BlendShapePreset.Sorrow, Mathf.Lerp(0,1.0f,blinkParameter * 15)); yield return null; blinkParameter += Time.deltaTime; }
以下の処理で、BlendShapeに値をセットしています。BlendShapePreset.Sorrow。表情の選択は、この"Sorrow"を変更して上げれば別の表情になります(Blinkとか)
proxy.SetValue(BlendShapePreset.Sorrow, Mathf.Lerp(0,1.0f,blinkParameter * 15));
感想
本当はまばたき→悲しみという表情の連鎖をさせたかったのが、それはまた別で。