たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

ゲーム内で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

やったこと

上記サイトと少し違かったのは、私の環境では

f:id:c_taquna:20181121013152j:plain

この2つにチェックを入れいてること。

それと、Buildした後に

Window > Profler だけだと反映されていなかったので、Unityを再起動しました。これで起動したので、うまくいかない人は試してみてください。

感想

後はパフォーマンス・チューニングを。。。。

Rigidbodyを使用しないでオブジェクトの軌道予測線を表示する

またVRゲームを作っていて、飛んでくるオブジェクトを斬っていくゲームなのですが、イメージとしてはSAO2期 9話「デス・ガン」でキリトがシノンを守って敵の弾丸を全て叩き落とした時のようなシーンを作り出したいなと思っていて、今回はそのゲーム世界の要素の一つである「弾丸の軌道予測線」の作り方についてまとめます。(わからない人はアニメ見てください!)

f:id:c_taquna:20181109015438g:plain
こんな感じで、オブジェクトを生成すると同時にその軌道を線で表示します。その線の軌道をオブジェクトが動きます。

  • 使用したツール / 環境
  • 作り方
    • オブジェクトの配置
    • LineRendererの設定
    • Prefabs化からのオブジェクト生成
  • まとめ
  • 感想
続きを読む

DOTweenProでオブジェクトを動かす

Tween系で有名な、DOTweenPROを使用してみました。以下みたいなアニメーションをかなり楽に作ることができます。なんか、装備している武器の変形とかかっこよくできそう。

f:id:c_taquna:20181105232107g:plain

  • やりたいこと
  • 使用したツール / 環境
  • やること
    • DOTweenの購入・インポート
    • オブジェクトの配置
    • 実装
  • 感想
続きを読む

Simple Mesh Cutter を使ってみた。【使用方法】

こんかいはSimple Mesh Cutter のアセットを使ってみたので、そのメモを残します。

assetstore.unity.com

完成形がこちら。

f:id:c_taquna:20181101223742g:plain

今回書きたいこと

ただ、使用方法が最初わからなかったので、簡単に使用するための方法について書きます。内容的にはサンプルシーンにあるのを真似ただけなのですが、自分でもきっと忘れてしまうと思うのでまとめます。実際にどういう挙動しているのか、コードはそのうち読みたいなと思ってます。

使用したツール / 環境

  • Unity 2018.13f1
  • SimpleMeshCutter
  • UniVRM

まずやること

斬られるがわ

Cubeを使用しました。

f:id:c_taquna:20181101224245j:plain

Cubeに"CutterTarget"と"Slicer"スクリプトをアタッチします。CutterTargetのMeshにはHierarchyから配置したCubeをドラッグします。
これで準備完了。

斬る側

斬る側では、斬るための剣をParticleを使用して作成しました。さらに、Particleの親オブジェクトに、Colliderをアタッチしたオブジェクトを子として配置します。そして、このColliderに対して"Cutter"と"Blade"と"Rigidbody"をアタッチします。

f:id:c_taquna:20181101224558j:plain

その後はRigidbodyのConstraintsのチェックをすべて入れます。こうしておかないと、斬ったあとにオブジェクトがふわふわどっかへ飛んでいきます。

f:id:c_taquna:20181101225247j:plain

次は、CutterスクリプトのCutDefaultMaterialに"Cut"を追加して、BladeスクリプトのOverride Materialに"DestructionAddtiveGS"とEffectPrefabに"BladeEffect"を追加します。これで一通り完了です。あとは、ColliderがうまくCubeを通り過ぎるように動かしてみてください。

感想

いちおう動いたけど、中身をみないと詳しくはわからないので、ちゃんと確認しておきたい。

LeapMotion + OcusulRift でVRで音楽を聞く環境作成を目指してみた

音楽を聞くことをもっと楽しめたらなと思い、LeapMotionとOculusRiftを使用して、UIを操作することで音楽似合わせて色々とアクションが起こせるようにしてみました。

  • 今回つくったもの
  • やりたいこと
  • 使用したツール / 環境
  • どんなことをしたのか
  • 実装について
    • UIのオブジェクト
    • パーティクルの色の変更方法
    • 花火を打ち上げる方法
    • 雨を降らせる、雪を降らせる、桜の花びらを降らせる方法
  • 感想

今回つくったもの

<動画>
youtu.be

続きを読む

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にかなりリソースを食っていたため使用しない方針にした。

f:id:c_taquna:20180924223932j:plain

感想

想定外の挙動をしたときにlogcatだけではわからず、バージョンを下げたりしたので色々と試しながらの対応が必要だった。そのへんの解決に異常に時間を取られてしまったので、今後は原因究明と切り分けは別で対応していきたい。
あと、リリースをすることはとても勉強になった。次はちゃんとStoreに並べたいと思う。

AtCoder Beginners Selection をやってみた

お勉強の一環として、AtCoderAtCoder Beginners Selection をやってみた。Unityを触るのとは少し勝手がちがったのだけれど、やはり何をしたくてそれをどうすればできるのかを考えるプロセスは変わらないなーと思った。

今回やったこと

AtCoder Beginners Selection の全問といてみた。
AtCoder Beginners Selection - AtCoder

感想

自分が書いたコードとまったく同じ目的をもって書かれた他の人のコードを読むことができる点は非常に良いなと思った。勉強方法として人のコードを読むけれど、自分ならこうしたけどこの人はこうしたんだーというのがしっかりと比較できるのは最高。自分の愚かさを再認識することができる。

正直できないところは人のコードを見るのも手だと思った。人のコードを読んで、何をしているのかをちゃんと考えてそれを写経するだけでも十分な勉強になる。あまりにハマりすぎたあとに人の回答をみると、疲れすぎてサボり心(次の問題にいこっかな~~)と戦う必要があるので、割と早めに見るのがよいと思う。今回は特にコード量が少ないものをピックアップして見てた。

すごいなと思ったのは、問題の性質を抽象化?して、実装しているもの。このケースはこうで~このケースは~とか書いていると、絶対終わっているコードになるなという思いとも戦う必要がでてくる。


ところどころ、そもそも言語選択や問題選択をミスってNGになっているのもあり、ちょっと勢いで提出してしまっている部分もあるので、もっとちゃんと詰めながらやっていきたい
f:id:c_taquna:20180822065637j:plain

VRMのBlendShapeをスクリプトから変更する

VRMでBlendShapeを操作して、キャラクターの表情を変更できるようにしました。Lerpを使ってなめらかに変更できます。

今回つくったもの

f:id:c_taquna:20180819092758g:plain

やりたいこと

BlendShapeの値を操作して、キャラクターの表情を変更させたくて、かつLerpでなめらかに変更することで生きた表情を作りたいと思いました。

使用したツール / 環境

  • Unity 2018.13f1
  • UniRx
  • UniVRM

全体像

Buttonを押すと ReactiveProperty の値が変更され、それを契機に表情を変更するメソッドを実行しています。

実装

github.com

表情の変更

こちらは、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));

感想

本当はまばたき→悲しみという表情の連鎖をさせたかったのが、それはまた別で。

VRMのキャラをランタイムで読み込んで、ボタンでモデルを変更できるようにした

今回は、VRMをランタイムで読み込み、ボタンによってキャラを変更できるようにしてみました。読み込み時にモーションも追加して、↑ボタンで走るモーションも追加されています。

  • 今回つくったもの
  • やりたいこと
  • 使用したツール / 環境
  • 実装
    • Button→モデルの表示
    • ランタイムでロードする処理
  • 感想

今回つくったもの

youtu.be

続きを読む