がとーしょこらの技術録(旧)

記録や技術的な記事を書いていきます

Editor拡張的にみたUnity2019でできるようになること

VRChatで使用しているUnityEditorのバージョンが2018.4.20f1から2019.4.28f1になります。
Unity2019になったときにUnityEditor拡張的にはどのようなことができるようになるかを調べてまとめてました。
他にも見つかれば追記していきます。

新機能

UIElements

Editor拡張のGUI部分をXAML的な記法で作ることができるようになりました。
従来の作り方でも作ることができますが、GUI作成を支援する機能も備わっているので移行するのはありだと思います。
ちなみにもっと後のUnityのバージョンではこの名称はUI Toolkitに変わっているようです。

docs.unity3d.com

Unity Package Manager (UPM)

プロジェクト内のUnityPackageを管理できる機能です。
この機能を使用してインポートしたUnityPackageが管理されます。
管理されているUnityPackageは新しいバージョンがあるとこの機能の画面から最新バージョンをインストールできます。 docs.unity3d.com

Addressable Asset System

リソースを読み込むための新しい方法が増えました。
従来のResources.Loadに変わる方法として提案されています。
この機能を使用するにはPackageManagerでこの機能を追加するためのUnityPackageをインポートする必要があるようです。

docs.unity3d.com

EditorTools

SceneView上でGameObjectやComponentを操作しやすくする機能を実装するためのAPIが増えました。

learning.unity3d.jp

blog.yucchiy.com

変更点

AssetDatabase V2 (Experimental)

V2ということで内部的に大幅変更されてそうです。
しかし、V1と同じAPIを使用できるので、この変更で関連するスクリプトを変更する必要はないようです。
GUIDの持ち方は変わるみたいなのでGUIDのファイルを直接参照するようなものは変更する必要があるかもしれないですね。
また、キャッシュサーバーを使ってインポートやプラットフォーム切り替えを高速化するようですが、そのためにUnity Acceleratorを使用するようです。

learning.unity3d.jp

EditorStyles

新しく使えるようになったスタイルがあったり、全体的に見た目が変わっていたりします。

新しく使えるようになったもの

  • EditorStyles.linkLabel
  • EditorStyles.foldoutHeader
  • EditorStyles.foldoutHeaderIcon
  • EditorStyles.toolbarSearchField

hacchi-man.hatenablog.com

廃止(Obsolete)

UnityでSteamVRPluginとTobiiXRSDKを使ったプロジェクト開発でのトラブルシューティング【備忘録】

ViveProEyeの視線トラッキングを使ったUnityアプリケーションの開発をするためにはViveEyeTrackingSDK(SRanipal)が必要である

Tobii社はこれをいい感じに使えるようにするためにTobiiXRSDKを開発した

VRアプリケーション開発でよく用いられるSteamVRPluginを使用したプロジェクトで
これを使用した際にいくつかの問題が発生したので、その内容と解決方法を残しておく

新しい問題が発生したら随時更新予定

開発環境

  • Unity 2019.4.4f1
  • SteamVRPlugin 2.6.1 (sdk 1.13.10)
  • ViveEyeTrackingSDK(SRanipal) v1.3.1.0
  • TobiiXRSDK v2.0.0.174

動作プロジェクトの構築

おおまかには以下のリンク先の手順に沿って作成した

https://vr.tobii.com/sdk/develop/unity/getting-started/vive-pro-eye/

最小設計としてはシーン内に

  • [CameraRig] (SteamVRPluginに同封されたPrefab)
  • TobiiXR Initializer (TobiiXRSDKに同封されたPrefab)

があれば動く

ViveEyeTrackingSDKに含まれるSRanipal_Eye_Framework.prefabはなくても動くようである

発生した内容と解決策

Valve.VRに既に存在するみたいなエラーが発生する

openvr_api.csというファイルがSteamVRPluginとTobiiXRSDKの両方に存在するため発生している

HMD Specific Information - Cognitive3D - Documentation

上記リンク先の内容に従って片方のopenvr_api.csを削除すると発生しなくなった

TobiiXRSDK v2.0.0.174ではAssets/Examples/Utilities/Controller/Pluginsの中にopenvr_api.csがあったため、これを削除した

DllNotFoundException: openvr_apiというエラーが発生する

上記ツイートにあるようにUnityのPackageManagerでOpenVR DesktopというものをインストールしてUnityを再起動すると発生しなくなった

これ自体は本環境に関わらずUnityでのVRアプリケーション開発において発生する可能性がある

アイトラッキングがうまくいかない

  • 起動時にActiveなカメラが複数あると別のものを参照しているのかうまくいかないことが多い
  • TobiiXR.FocusedObjectsの配列に入るものはIGazeFocusableを持つコンポーネントがついたものだけ

[VRChat] Avatars2.0からAvatars3.0へ簡単に移行するためのEditor拡張を作成した

はじめに

VRChatにAvatars3.0がきました。
これはアバターをセットアップするための新しい仕組みです。

従来のAvatars2.0に比べて、細かなアバターの表現を実現できるようになりました。
実際どんな感じに変わったかは記事にまとめたのでこちらを見てみてください。

[VRChat] Avatars3.0のVRCAvatarDescriptor - がとーしょこらの技術録

まだ従来のAvatars2.0も使うことができるので、無理にAvatars3.0に移行しなくても良いですが、
何かとAvatars3.0へ移行する必要がある要因が出てきたりします。
たとえば...

  • AFKのポーズを変えたい
  • アクションメニューに○○って項目を追加したい
  • EmoteSwitchを後から来た人にも同期するようにしたい

ここらへんをやろうとするとAvatars3.0でアバターをセットアップする必要があります。
しかし、VRCAvatarDescriptorが違ったり、CustomOverrideEmptyが使えなくなっていたりしているので
一からセットアップし直しになります。

これを解決するために
「Avatars2.0用のアバターの設定をいい感じにAvatars3.0用に変換するEditor拡張」を作ったので、
これを使った移行を紹介します。

gatosyocora.booth.pm

また、Avatars2.0のプロジェクトからアバターをunitypackageで取り出すときに
普通にやると間違えそうになるのでそれ用のEditor拡張も作成しました。
これも使っていきます。

gatosyocora.booth.pm

Avatars2.0から3.0への移行手順

移行手順を段階に沿って紹介していきます。

既にあるAvatars3.0用のプロジェクトに変換後のAvatars3.0のアバターを追加する場合は1の手順は不要です。
また、BoothなどでダウンロードしてきたAvatars2.0のアバターを変換する場合は2の手順は不要です。

1. Avatars3.0用のプロジェクトを用意

Avatars2.0と3.0ではVRCSDKが全くの別物なので、
VRChat公式ページからAvatars3.0用のVRCSDKをダウンロードしてきます。
https://www.vrchat.com/home/download

f:id:gatosyocora:20200818211703p:plain

VRChat SDK3はワールド用とアバター用に分かれているので、
アバター用のほうをダウンロードします。

UnityでAvatars3.0用の新しいプロジェクトを作成します。
これはAvatars2.0と変わらず、Unity2019.4.31f1で作成してください。
(下の画像はUnityHubでの画像)

f:id:gatosyocora:20200818223852p:plain

そこに先ほどダウンロードしてきたAvatars3.0用のVRCSDKをインポートします。

f:id:gatosyocora:20200818224552p:plain

2. Avatars2.0のアバターの荷造り

移行したいアバターがあるAvatars2.0のUnityプロジェクトを開きます。
ここに上で紹介したGameObjectExporterをインポートします。
Hierarchyにある移行したいアバターを右クリックして、「Export UnityPackage」を選択します。
そのあと、「Default」などが表示されます。

f:id:gatosyocora:20200818223455p:plain

  • Default : アバターに関連するアセットすべてを含みます。
  • ignore Shader : シェーダーを除いたアバターに関連するアセットすべてを含みます。
  • ignore DynamicBone : ダイナミックボーンを除いたアバターに関するアセットをすべて含みます。
  • ignore Shader and DynamicBone : シェーダーとダイナミックボーンを除いたアバターに関するアセットをすべて含みます。

配布するときなどはシェーダーとダイナミックボーンを除いたほうがよいときがありますが、
自分のプロジェクト間で移動させるときはDefaultで良いと思います。
「Export Unitypackage > Default」と選択することでアバターのunitypackageがDesktop上に作成されます。
(アバターの名前.unitypackageという名前で出力されています)

f:id:gatosyocora:20200818223713p:plain

3. Avatars3.0のセットアップ

1で作成したAvatars3.0用のプロジェクトに上で紹介したVRCAvatars3Toolsをインポートします。
さらに2で作成したアバターのunitypackageもインポートします。

Unity上部のメニューからVRCAvatars3Tools>VRCAvatarConverterTo3を押して、変換用ツールのウィンドウを表示します。

f:id:gatosyocora:20200819005909p:plain

f:id:gatosyocora:20200819005927p:plain

2.0 Avatar Prefabの右にある二重丸を選択して、Avatars2.0アバターのPrafabを選択します。

f:id:gatosyocora:20200819010041p:plain

いろいろ情報が表示されます。
一応一通り目を通して「Convert Avatar To 3.0」を押してください。

f:id:gatosyocora:20200819010453p:plain

HierarchyとSceneViewに変換されたアバターが表示されます。 f:id:gatosyocora:20200819010611p:plain

Inspectorを見ると変換後のアバターには

  • MissingになったScript
  • PipelineManager
  • VRCAvatarDescriptor

がついていると思います。

f:id:gatosyocora:20200819010808p:plain

それぞれ

  • MissingになったScript : Avatars2.0のVRCAvatarDescriptorだったもの
  • PipelineManager : アバターIDがついているもの
  • VRCAvatarDescriptor : Avatars3.0のVRCAvatarDescriptor

です。

MissingになったScriptは(Script)あたりを右クリックして
RemoveComponentで削除しておいてください。
残しておくとアップロード時にエラーでアップロードできないです。
f:id:gatosyocora:20200819011044p:plain

また、一度アップロードしたことがあるアバターなら、
PipelineMangerにAvatars2.0のときのBlueprint IDが残っています。
このままアップロードするとAvatars2.0のアバターが3.0に上書きされてしまうので
上書きされてほしくない場合は「Detach」を押して、idを削除しておいてください。

f:id:gatosyocora:20200819011451p:plain

これで変換はすべて完了しました。
このままアップロードすることでAvatars3.0のアバターとして使用できます。

それでは良いAvatars3.0ライフを!

関連リンク

[VRChat] Avatars3.0で表情切り替え時のまばたき干渉防止を実装する

はじめに

EyeLookの設定によって自動まばたきが有効になっている場合、
目を動かす表情変更をおこなうと干渉して目が意図しない見た目になることがあります。

f:id:gatosyocora:20200809091024p:plain
自動まばたきが有効になっている

本記事ではこれを防止する方法を解説していきます。

動作確認環境

  • Unity 2018.4.20f1
  • VRCSDK3-AVATAR-2020.08.06.16.30_Public.unitypackage

実装する手順

Avatars3.0のVRCSDKで追加されたVRCAnimatorTrackingControlを使います。
これはHeadやLeftHandなどの動きを

を切り替えることができるBehaivourです。
Humanoidのボーンだけでなく, 目や口の動きも切り替えることができるようになっています。
このBehaivourと呼ばれるものはGameObjectにつけるComponentみたいなものでAnimatorControllerのStateにつけるスクリプトです。

本記事では表情切り替えギミックのよくある実装方法であるVRCSDKに同封されたvrc_AvatarV3HandsLayer.controllerを複製して実装したとして説明していきます。
まばたき干渉防止の実装の考え方としては他の実装方法でも使えると思うので各自読み替えてください。

まず, 表情切り替えのギミックが設定されたAnimatorControllerのLayerを表示します。
よくある方法で実装されている場合は、
VRCAvatarDescriptorのFXに設定されたAnimatorControllerのLeftHand, RIghtHandがこれにあたるかと思います。
FXの設定されている部分をダブルクリックするとAnimatorウィンドウに表示されると思います。

f:id:gatosyocora:20200809091650p:plain

f:id:gatosyocora:20200809092203p:plain

実装の方針としては

  • 表情切り替えしていないIdle状態 : スクリプトによって目が操作される
  • 表情切り替えしている状態 : Animationによって目が操作される

のようにしていきます。

LeftHandでは橙色のStateがIdleが表情切り替えしていないIdle状態にあたります。

f:id:gatosyocora:20200809092502p:plain

また、Fistなどの灰色のStateが表情切り替えしている状態にあたります。

f:id:gatosyocora:20200809092516p:plain

まず, IdleをクリックしてInspectorに詳細を表示します。

f:id:gatosyocora:20200809092727p:plain

Add Behaivourを選択して、VRCAnimatorTrackingControlを追加します。

f:id:gatosyocora:20200809092832p:plain

Eyes & EyelidsのTrackingチェックをいれるようにします。
これでこのIdleのStateにきてから変更されるまでは目の動きはスクリプトによって操作されるようになりました。

f:id:gatosyocora:20200809093009p:plain

次に同じ手順でFistなどの表情切り替えしている状態のStateにもVRCAnimatorTrackingControlを追加します。
ここではEyes & EyelidsのAnimationチェックをいれるようにします。
これでこのStateにきてから変更されるまでは目の動きはAnimationによって操作されるようになりました。

f:id:gatosyocora:20200809093127p:plain

同様にOpenやGunなどの表情切り替えしているStateにも同じ設定をしてください。

これでまばたき干渉防止を実装することができました。

発展(リップシンク干渉防止)

発展として表情切り替えとリップシンクが干渉してしまう問題も同じような方法で防ぐことができます。
これはまばたき干渉防止と両立することができます。

表情切り替えしていないStateにつけたVRCAnimatorTrackingControlでMouth & JawのTrackingチェックをいれます。

f:id:gatosyocora:20200809093539p:plain

また、表情切り替えしているStateではMouth & JawのAnimationチェックをいれます。

f:id:gatosyocora:20200809093730p:plain

これでリップシンク干渉防止を実装することができました。

参考

[VRChat] Avatars3.0で物を出し入れする (EmoteSwitchみたいなもの)

この記事は以下に移行しました。今後の更新は以下でおこなわれます

https://gatosyocora.net/posts/vrchat_avatars3_action_switch/

はじめに

これまでのアバター(Avatars2.0)では
Emote(エモート)機能でオブジェクトを出したり、消したりするギミック(通称:EmoteSwitch)がありました。

Avatars 3.0ではアクションメニューを拡張してボタンを追加することで、
そのボタンの操作によってオブジェクトを出したり、消したりできるようになりました。

これはEmoteSwitch(エモートスイッチ)に比べて、

  • 単純な設計で実装できる
  • 後からインスタンスに来た人にもオブジェクトの状態が同期する
  • 多くのオブジェクトの出し入れを管理できる
  • ワールドを移動してもオブジェクトの状態が維持されるようにできる

などメリットがいくつもあります。

この記事ではAvatars3.0のアクションメニューのToggleボタン操作によって、
後から来た人にも同期するようにオブジェクトを出し入れするギミック(以下、ActionSwitch)を実装する方法を解説します。

[2020/8/31]
2つ以上の物を入れ替えるときに一瞬同時に出てしまう問題を解消する方法を追記しました。

[2021/1/10]
WriteDefaultsの注意について追記しました。

[2021/3/26]
ギミックに使用するParameterの種類をIntからBoolに変更しました。
WriteDefaultsがオフを想定した内容に変更しました。

動作確認環境

  • Unity 2018.4.20f1
  • VRCSDK3-AVATAR-2021.03.22.18.27_Public.unitypackage

実装する手順

この記事では実装手順の紹介なのでCubeを使ってオブジェクトの出し入れを紹介します。
他のもの(服や武器など)の出し入れの場合は本記事のCubeの部分を置き換えて実装してみてください。

【注意】(2021/1/10, 3/26追記)
以下は各StateのWriteDefaultsがオフ(チェックが入っていない)を想定しています。
オンとオフが混在している場合、ギミックがうまく動作しないことがあるので注意してください。

f:id:gatosyocora:20210110193645p:plain

大まかな手順

  1. FXに設定されたAnimatorControllerに新しいLayerを追加する
    (これに対してStateを追加したりしていく)
    • weightが1になっているか確認
  2. 初めから存在するEntry, AnyState, Endに加えて、新しく以下のStateを追加する
    • CubeOFF : Cubeが出ていない状態(デフォルト状態)
    • CubeON : Cubeが出ている状態(アクティブ状態)
  3. 各StateのWriteDefaultsをオフ(チェックが入っていない状態)にする
  4. Entry->CubeOFF->CubeON->Endとなるように遷移の矢印を追加する
  5. AnimationParameterにBool型の「ActiveCube」というパラメータを追加する(初期値false)
  6. 遷移の矢印に以下の設定をする
    • CubeOFF -> CubeON
      • Conditions : ActiveCube true
      • Has Exit Time : false
      • Transition Duration(s) : 0 [2020/8/31追記]
    • CubeON -> End
      • Conditions : ActiveCube false
      • Has Exit Time : false
      • Transition Duration(s) : 0 [2020/8/31追記]
  7. CubeONに以下のようなAnimationClipを設定する
    • CubeのActiveをtrue (表示) にする
    • 0フレーム目にのみキーを持つ
  8. CubeOFFに以下のようなAnimationClipを設定する
    • CubeのActiveをfalse (表示) にする
    • 0フレーム目にのみキーを持つ
  9. CubeのデフォルトのActiveはfalse (非表示) にしておく
  10. Expression ParametersにBool型の「ActiveCube」というパラメータを追加する
  11. Expressions Menuに以下のようなControlを追加する
    • Type : Toggle
    • Parameter : ActiveCube

1. ActionSwitchの実装の準備

VRCAvatarDescriptorのPlayable LayersのFXに設定されたAnimatorControllerをダブルクリックして選択します。
(まだ設定されていない場合、Assets/VRCSDK/Examples3/Animation/Controllersにあるvrc_AvatarV3HandsLayerを複製してここに設定してください。)

次に、選択された状態でAnimatorウィンドウを開きます。
(Unity上部のWindow>Animation>Animatorで開けます。) f:id:gatosyocora:20200807161328p:plain

左上にある「+」を押して新しいLayerを作成します。
Layerには分かりやすい名前をつけてください。
今回はCubeを出すのでCubeという名前をつけました。
Debugメニューで文字化けしてしまうため、日本語ではなく英語の名前にしたほうがよいです。

f:id:gatosyocora:20200807224551p:plain

次に右のほうにある歯車のマークをクリックして、
以下の画像のようなLayerの設定画面を開きます。

f:id:gatosyocora:20200807225633p:plain

Weightの項目を0から1に変更してください。
このようにLayerのWeightを1にしないと、
そのLayerでの変更はアバターに反映されないので注意が必要です。(よく忘れがち)

f:id:gatosyocora:20200807225651p:plain

これで新しいギミックを作成する準備は完了です。
この流れは今回紹介するActionSwitchだけでなく、
多くのギミックを新しく実装する手順に含まれる操作です。

2. ActionSwitchの実装

今回はActionSwitchを使って、
Cubeを出したり、消したりしていきます。
以下の画像が完成したときのStateとParameterです。
これを目指して作っていきます。
f:id:gatosyocora:20210326002316p:plain

2.1 Stateの作成と設定

このギミックはCubeが出ている状態と出ていない状態の2つの状態でできています。
先ほどの画像では

  • 橙色のStateがCubeが出ていない状態(デフォルト状態)
  • 灰色のStateがCubeが出ている状態(アクティブ状態)

のようになっています。

まず、まだCubeを出していないデフォルト状態を作成します。
何もない場所で右クリックして、
Create State>Emptyで新しいStateを作成します。

f:id:gatosyocora:20200807225857p:plain

f:id:gatosyocora:20200807225913p:plain

同じ手順でCubeが出ているアクティブ状態のStateも作成します。

f:id:gatosyocora:20200807225937p:plain

それぞれのStateをクリックするとInspectorに詳細が表示されます。

f:id:gatosyocora:20200807230236p:plain

ここの名前部分を選択して、それぞれのStateを分かりやすい名前にしておきましょう。
Debugメニューで文字化けしてしまうため、日本語ではなく英語の名前にしたほうがよいです。

CubeOFF : Cubeが出ていない状態(デフォルト状態)橙色
CubeON:Cubeが出ている状態(アクティブ状態)灰色

f:id:gatosyocora:20200808110742p:plain

また、VRChat公式ではWriteDefaultsはオフを推奨しているのでこちらもチェックを外しておきましょう

f:id:gatosyocora:20210326010627p:plain

次にState同士を矢印でつないでいきます。
CubeOFFのStateを右クリックして、Make Transitionを選択します。

f:id:gatosyocora:20200808111633p:plain

すると矢印がついた白線がマウスに追従するのでその状態でCubeONのStateをクリックします。
これでCubeOFFからCubeONへの矢印(遷移, Transition)が追加されました。

f:id:gatosyocora:20200808111912p:plain

同じように今度はCubeONからExit(赤色のState)に向けて矢印を追加します。

f:id:gatosyocora:20200808111958p:plain

2.2 Parameterの作成と設定

次にStateから別のStateへの移動の条件を設定するためにParameterを設定します。

Layersの横にあるParametersをクリックして、
そのAnimatorControllerに設定されたAnimationParameterの一覧を表示します。

f:id:gatosyocora:20200808113502p:plain

左上にある「+」をクリックして新しいParameterを追加します。
今回はオブジェクトを出し入れするのでBoolを選択します。

f:id:gatosyocora:20210326002543p:plain

名前はActiveCubeにしました。
特にこれでないといけないわけではないですが、
以降でActiveCubeを選択・設定するときに同じ名称になるようにしてください。
また、日本語ではなく英語の名前にしたほうがよいです。

f:id:gatosyocora:20210326002712p:plain

次にLayersを押してLayer一覧に戻り、記事序盤で作成した「Cube」レイヤーを選択します。

f:id:gatosyocora:20200808113803p:plain

f:id:gatosyocora:20200808113911p:plain

CubeOFFとCubeONの間にある矢印をクリックします。
するとInspectorに矢印の詳細が表示されます。

f:id:gatosyocora:20200808123332p:plain

f:id:gatosyocora:20200808123349p:plain

Conditionsの「+」をクリックして新しい項目を追加します。
f:id:gatosyocora:20200808123439p:plain

左から順にActiveCube, trueに変更します。
これでCubeOFFにいるときにActiveCubeというParameterがtrue(チェックが入った状態)になったらCubeONに移動します。

f:id:gatosyocora:20210326002859p:plain

さらにHas Exit Timeのチェックを外します。

f:id:gatosyocora:20200808124115p:plain

[2020/8/31追記]
また、SettingsにあるTransition Duration (s) を0にします。
これはStateの遷移にかける時間で、0より大きい場合、State間の状態が補完されながら遷移されます。

f:id:gatosyocora:20200831155438p:plain

これでCubeが出ていないデフォルト状態からCubeが出ているアクティブ状態にするギミック部分はできました。

次にCubeが出ているアクティブ状態からCubeが出ていないデフォルト状態に戻す部分を作っていきます。

CubeONのStateとExitのStateの間にある矢印を選択します。
f:id:gatosyocora:20200808125231p:plain

先ほどと同じような手順でConditionsとTransition Duration, Has Exit Timeを以下のように設定します。

Has Exit Time : チェックを外す
Transition Duration (s) : 0
Conditions : ActiveCube false

f:id:gatosyocora:20210326003250p:plain

2.3 Animationの作成と設定

アバターにCubeを追加します
(説明用にCubeを追加しているので、
このCubeが今回出し入れしたいものだと考えてもらって大丈夫です)

Cubeの代わりにするオブジェクトにAnimatorがついている場合には削除してください。

f:id:gatosyocora:20200808133831p:plain f:id:gatosyocora:20200808133850p:plain

2.3.1 表示状態にするAnimation(CubeOn)の作成

まず、Projectウィンドウで右クリックをして、
Create>AnimationでAnimationClipを作成します。
Cubeを出すアニメーションなのでCubeOnという名前にしました。

f:id:gatosyocora:20200808142950p:plain f:id:gatosyocora:20200808143014p:plain

次に先ほど触っていたAnimatorControllerに戻って、 CubeONのStateを選択します。
f:id:gatosyocora:20200808143213p:plain

CubeONのmotionに先ほど作成したCubeOnというAnimationClipを設定します。

f:id:gatosyocora:20200808143307p:plain

Animationの設定のために一時的に
アバターのルートにあるAnimatorのController
FXに設定されているAnimatorControllerを設定します。

f:id:gatosyocora:20200808145041p:plain

VRCAvatarDescriptorが設定されたオブジェクトを選択している状態で
Animationウィンドウを開きます。

f:id:gatosyocora:20200808145526p:plain

AnimationウィンドウはUnity上部のWindow>Animation>Animationで開けます。

f:id:gatosyocora:20200807162509p:plain

左側にあるPreviewの下をクリックすると、
先ほどAnimatorに設定したAnimatorControllerが持つAnimationClipの一覧が表示されます。
先ほど設定したCubeOnを選択してください。

f:id:gatosyocora:20200808145807p:plain

Previewの横の録画ボタンをクリックすると、録画モードが開始されます。

f:id:gatosyocora:20200808145946p:plain

この状態で出現させたいオブジェクト(本記事ではCube)を選択します。

f:id:gatosyocora:20200808150023p:plain

そしてInspectorの左上にあるチェックマークを入っている状態にします。
最初から入っている場合はチェックボックスを一度押して再度押して入っている状態にしてください。
下の画像のようになれば大丈夫です。

f:id:gatosyocora:20200808150210p:plain

すると先ほどのAnimationウィンドウにCubeのIs Activeを操作するキーが0:00のところに追加されました。 これがチェックマークが入っている状態になっていることを確認してください。

f:id:gatosyocora:20200808150331p:plain

これで録画は完了なので、Previewボタンを一度押して録画モードを停止してください。

f:id:gatosyocora:20200808150426p:plain

これでAnimationの準備は完了なので、AnimatorからAnimatorControllerを外しておきましょう。
Controllerの右の方にある二重丸を選択して一番上にあるNoneを選択すると外すことができます。

f:id:gatosyocora:20200808150641p:plain f:id:gatosyocora:20200808150731p:plain

Cubeは最初は消えている状態にするのでチェックを外して消しておきましょう。

f:id:gatosyocora:20200808150513p:plain

2.3.2 非表示状態にするAnimation(CubeOff)の作成

次にCubeを初期状態の非表示状態にするAnimationを作成します。
先ほど作成したCubeOn.animを選択した状態でCtrl+Dを押すと複製されます。

f:id:gatosyocora:20210326012213p:plain

複製されたCubeOn 1を右クリックしてRenameCubeOffという名前に変更します。

f:id:gatosyocora:20210326012347p:plain

Animatorウィンドウを開いて、CubeOFFステートのMotionに複製したCubeOffを設定します。

f:id:gatosyocora:20210326012552p:plain

CubeOff.animを選択した状態でAnimationウィンドウを開くとその内容が見れます。

f:id:gatosyocora:20210326012724p:plain

Cube : Game Object.Is Active 1のようになっているので、1のところをクリックし、0に変更します。
これでCubeを非表示状態にするAnimationファイルになりました。

f:id:gatosyocora:20210326012817p:plain f:id:gatosyocora:20210326012833p:plain

これでギミック部分は完成しました。

2.4 ExMenuの設定

最後にメニュー操作でオブジェクトを出し入れできるようにします。

VRCAvatarDescriptorのExpressionsのParametersに設定しているExpressionParametersをダブルクリックして選択します。

f:id:gatosyocora:20200808151143p:plain

設定されていない場合はCreate>VRChat>Avatars>Expression Parametersで新しく作成して設定してください。

f:id:gatosyocora:20200808151429p:plain

左上のAddを押すと新しい項目が増えるのでNameにActiveCubeと入力してTypeはBoolを選択してください。
ここの名称はAnimatorControllerのParametersで新しく設定した名称と同じにしてください。
(大文字小文字も同じになるように)

DefaultはCubeが最初出ていない状態なのでチェックがない状態にします。
Savedは別のワールドやVRChatの再起動でもCubeが出ている状態を維持するためにチェックがある状態にします。(ここはお好みでどちらでも良いです)

f:id:gatosyocora:20210326003940p:plain f:id:gatosyocora:20210326002712p:plain

次にVRCAvatarDescriptorのExpressionsのMenuに設定しているExpressionsMenuをダブルクリックして選択します。

f:id:gatosyocora:20200808151711p:plain

設定されていない場合はCreate>VRChat>Avatars>Expressions Menuで新しく作成して設定してください。

f:id:gatosyocora:20200808151749p:plain

Add Controlを押して新しい項目を増やします。
既に項目が8個ある場合は追加できないので、
ExpressionMenuを新しくしてSubMenuとして追加することを検討してください。

f:id:gatosyocora:20200808151840p:plain

NameとIconは分かりやすいように設定してください。
TypeはToggle, ParameterはActiveCube, Boolに設定してください。

f:id:gatosyocora:20210326004554p:plain

これですべての設定が完了です。
VRChatにアップロードしてCubeを出してみましょう。

f:id:gatosyocora:20200808160215g:plain

3. 注意点(おさらい)

  • 新しく作成したLayerはweightが0になっているので1にする
  • オブジェクトの出し入れのギミックはFX Layerに設定したAnimatorControllerに追加する
  • Expression ParametersとAnimatorControllerのParameterの名称は完全に同じにする
  • AnimatorControllerにあるStateのWriteDefaultsはオフ(チェックが入っていない状態)にする

4.応用編

デフォルトで表示されているものを消す

本記事で紹介したものは「消えているものを表示する」でしたが、
その逆も紹介した方法の応用で実現できます。
おおまかな設定手順は同じで以下のものを変更します。

  • 出し入れするオブジェクトの左上のチェックを入れて表示されている状態にしておく(工程)
  • 設定するAnimationClipでIs Activeにチェックをはずす(工程)
  • 1を0に変更ではなく、0になっているので1に変更する(工程)

初期状態と変更後にどういう状態にするかを変えただけです。
これで「表示されているものを消す」というギミックになります。

さいごに

今回紹介した方法は個人的に最小構成でActionSwitchを実装する方法だと思います。
Expression Parametersの節約や初期状態でオブジェクトが出ているようにする方法など、応用する方法がいろいろあります。

また、これだけ長い手順なので毎回設定するのは大変です。
同じようなことを実現する方法としてこのようなツールも出ているので使ってみてもいいかもしれないです。
いろんな方が作っておられるので用途と自分にあったツールを選ぶのが良いと思います。

booth.pm

github.com

Avatars3.0のAFKのポーズを変更する

はじめに

VRChatのAvatars3.0でAFKモードが追加されました。
HMDを外すかEndキーを押すことでAFKモードになって、
デフォルトだとアバターが座禅を組んで浮いている状態になります。(なぜ...)

本記事ではこのAFKモードでアバターがとるポーズを変更する方法を書きます。

手順を概要的にまとめて、その後詳細に書いています。
自分に合ったほうを見ていただけると良いかと思います。

ねここやさんが配布されているポーズアニメーションを例に説明していきます。
オススメの商品です。 necocoya.booth.pm

動作確認環境

  • Unity 2018.4.20f1
  • VRCSDK3-AVATAR-2020.08.06.16.30_Public.unitypackage

変更する手順

  1. vrc_AvatarV3ActionLayer.controllerを複製する。
  2. 1で複製したAnimatorControllerのAfk Init, AFK, BlendOutのStateのMotionに以下のようなAFKアニメーションのAnimationClipを設定する.
    • LoopTimeがtrue
    • 0フレーム目にのみAFKのポーズをしたHumanoidのアニメーションキーを持つ
  3. VRCAvatarDescriptorのPlayable LayersのActionに1で複製したAnimatorControllerを設定する

変更する手順(詳細版)

1. AnimatorControllerの複製と設定

Assets/VRCSDK/Examples3/Animation/Controllersのvrc_AvatarV3ActionLayerを複製します。
選択した状態でCtrl+Dで複製できます。

f:id:gatosyocora:20200807160755p:plain

そのアバター用であることがわかる名前に変更して、別のフォルダに移動しておきましょう。

f:id:gatosyocora:20200807160938p:plain

次に複製したものをVRCAvatarDescriptorのPlayable LayersのActionに設定します。

f:id:gatosyocora:20200807124936p:plain

次に設定したAnimatorControllerをダブルクリックして選択状態にします。
そして、Animatorタブを開きます。
AnimatorタブはWindow>Animation>Animatorで開けます。

f:id:gatosyocora:20200807161328p:plain

Animatorタブには選択したAnimatorControllerの内容が表示されていると思います。

f:id:gatosyocora:20200807161213p:plain

2. AFKアニメーションの選択と設定

AnimatorControllerにあるAfk Init, AFK, BlendOutというStateに設定したいAFKアニメーションを設定します。
どのAFKアニメーションを使うか決めるときにプレビューを見ると良いです(詳細)。

f:id:gatosyocora:20200807161623p:plain

それぞれクリックするとInspectorがそのStateの詳細が表示されます。
Motionに設定したいAFKアニメーションのAnimationClipを設定します。 Afk Init, AFK, BlendOutすべてのMotionに同じAnimationClipを設定してください。

f:id:gatosyocora:20200807161756p:plain

設定したMotionをダブルクリックして設定したAnimationClipを選択状態にします。
すると, InspectorにAnimationClipの詳細が表示されます。
Loop Timeにチェックがない場合、チェックを入れます。

f:id:gatosyocora:20200807162106p:plain

AnimationClipが選択された状態でAnimationタブを開きます。
Window>Animation>Animationで開けます。

f:id:gatosyocora:20200807162449p:plain

f:id:gatosyocora:20200807162509p:plain

60:00のほうにある一番上のひし形を選択して、60:00のひし形すべてを選択します。
Deleteキーを押して選択したひし形をすべて削除してください。

f:id:gatosyocora:20200807162428p:plain

0:00のみにAnimationキー(ひし形)がある状態にします。

f:id:gatosyocora:20200807162651p:plain

これで変更が完了しました。
実際にアップロードしてAFKを試してみましょう。

番外:AFKアニメーションを選ぶ

Humanoidボーンを変更するAnimationClipを選択すると,
Inspectorの下部に実際のモーションが表示されます。

f:id:gatosyocora:20200807205442p:plain

こうなっている場合は灰色部分にカーソルを合わせて上に持ち上げると,
実際のモーションのプレビューが表示されます。

f:id:gatosyocora:20200807205705p:plain

ここにHierarchyにあるアバターのモデルをドラッグ&ドロップすると
プレビューされている3Dモデルがそのアバターになるので選ぶときにいい感じになります。

f:id:gatosyocora:20200807205949p:plain

[VRChat] Avatars3.0のVRCAvatarDescriptor

Avatars3.0では従来のもの(Avatars2.0)と比べてVRCAvatarDescriptorの項目が大幅に変更されました。
本記事ではAvatars2.0とAvatars3.0のVRCAvatarDescriptorを比較しながらその内容を紹介していきます。

内容は以下に基づいています。

Avatars3.0のVRCAvatarDescriptor

Avatars3.0でのVRCAvatarDescriptorが持つ大まかな設定項目です

f:id:gatosyocora:20200805084206p:plain

Avatars2.0に比べ, Eye Look, Playable Layers, Lower Body, Expressionsが追加されました。

Eye LookはAvatars2.0で自動的に設定されていた目の動き(通称: EyeTracking)を設定できるようにしたものです。
Playable LayersはAvatars2.0におけるAnimatorOverrideController(通称: CustomOverrideEmpty)に代わるものです。
Lower Bodyはトラッキングされていない体の部位の動きに関するAvatars2.0にはなかった新しい設定項目です。
ExpressionsはAvatars3.0から利用可能になったドーナッツ型のメニュー(アクションメニュー)を拡張するための項目です。

InspectorにEditまたはPreviewボタンがある項目がありますが,
これは一度押すとボタンの文字が「Return」になり,
プレビュー&編集状態(勝手にこう呼んでいるだけ)になります。
この状態のときにSceneViewに表示されるGizmoを操作することで設定内容を変更できます。

f:id:gatosyocora:20200805082756p:plain
3Dモデル : 京狐

View

視点に関する設定項目です。

f:id:gatosyocora:20200801025118p:plain

  • View Position
    アバターの視点位置です。Avatars2.0にあったViewPositionと同じですが,
    Editボタンを押すことでScene上でGizmoを使って自由に動かして設定できるようになりました。

LipSync

話したときの口の動きに関する設定項目です。

f:id:gatosyocora:20200801025237p:plain f:id:gatosyocora:20200801025313p:plain

  • Mode
    口の動きを制御する方法を複数の中から選択できます。
    Avatars2.0に比べ, Viseme Parameter Onlyが追加されました。
〇 Jaw Flap Bone

顎のボーンを使って口を開閉する方法です。

f:id:gatosyocora:20200801025333p:plain

  • Jaw Bone
    顎のボーンです。

  • Rotation States
    口を開閉したときの顎ボーンの回転です。
    Previewボタンを押すと設定した回転が反映されます。
    Scene上に回転Gizmoが表示されるのでそれを操作することで設定を変更できます。

    • Closed
      口を閉じたときの顎ボーンの回転です。
    • Open
      口を開いたときの顎ボーンの回転です。
〇 Jaw Flap Blend Shape

顎を動かすBlendShape(シェイプキー)を使って口を開閉する方法です。

f:id:gatosyocora:20200801025411p:plain

  • Face Mesh
    顎を動かすBlendShapeを持つオブジェクトです。

  • Jaw Flap Blend Shape
    顎を動かすBlendShapeです。

〇 Viseme Blend Shape

口を様々な形に変更するBlendShape(シェイプキー)を使って口を動かす方法です。
Boothで販売される3Dモデルの大半はこれを使用すると良いです。

f:id:gatosyocora:20200801025455p:plain

  • Face Mesh
    口を様々な形に変更するBlendShapeを持つオブジェクトです。

  • Viseme: ○○
    口を特定の形に変更するBlendShapeです。
    それぞれの名称と口の形はOVRLipSyncに対応しています。

〇 Viseme Parameter Only

音声に対応した0~14の数値をAnimatorで使用して口の動きを制御する方法です?(未検証)

f:id:gatosyocora:20200801025516p:plain

Eye Look

目の動きに関する設定項目です。
Avatars2.0で自動的に設定されていた目の動き(通称: EyeTracking)を設定できるようにしたものです。

f:id:gatosyocora:20200801025553p:plain

デフォルトではEnableボタンだけが表示されており,
Enableボタンを押すことで設定項目が出てきます。
目の動きを設定しない場合はこのままで良いです。

f:id:gatosyocora:20200805120153p:plain

General

目の動きの全体に関連する設定項目です。

  • Eye Movements

    • Calm (穏やか) <---> Excited (興奮)
      瞬きの頻度

    • Shy (恥ずかしがり) <---> Confident (自信)
      他のプレーヤーを見る頻度、および目をそらすまで他のプレーヤーの顔に視線が留まる時間

Eyes

目の部分に関連する設定項目です。

  • Transforms

    • Left Eye Bone
      左目を動かすボーンです。
      Avatars2.0のLeftEyeという名称のボーンに対応するものです。
    • Right Eye Bone
      右目を動かすボーンです。
      Avatars2.0のRightEyeという名称のボーンに対応するものです。
  • Rotation States
    目のボーンの回転を設定します。

    • Looking Straight
      前を見ているときの目のボーンの回転

    • Looking Up
      上を見ているときの目のボーンの回転

    • Looking Down
      下を見ているときの目のボーンの回転

    • Looking Left
      左を見ているときの目のボーンの回転

    • Looking Right
      右を見ているときの目のボーンの回転

  • Eyelids
    まぶたに関する設定項目です。

    • Eyelid Type
      まぶたを動かす方法を選択できます。

f:id:gatosyocora:20200801025627p:plain

Bones

まぶたの動きにボーンを使った方法です。

f:id:gatosyocora:20200801025657p:plain

  • Transforms
    まぶたのボーンの回転を設定します。

    • Upper Left Eyelid
      左上まぶたを動かすボーンです。

    • Upper Right Eyelid
      右上まぶたを動かすボーンです。

    • Lower Left Eyelid
      左下まぶたを動かすボーンです。

    • Lower Right Eyelid
      右下まぶたを動かすボーンです。

  • Rotation States
    LeftとRightがひとつの項目にまとまっており,
    Upper EyelidsとLower Eyelidsを設定できます。

    • Default
      通常時のまぶたのボーンの回転です。

    • Closed
      目を閉じている時のまぶたのボーンの回転です。

    • Looking Up
      上を見ている時のまぶたのボーンの回転です。

    • Looking Down
      下を見ている時のまぶたのボーンの回転です。

〇 Blend Shapes

まぶたの動きにBlendShape(シェイプキー)を使った方法です。

f:id:gatosyocora:20200801025732p:plain

  • Eyelids Mesh
    目の動きに関するBlendShapeを持つオブジェクトです。
    Avatars2.0におけるBodyという名称のオブジェクトに対応するものです。

  • Blendshape States

    • Blink
      両目でまばたきするBlendShapeです。
      Avatars2.0におけるvrc.blink_leftとvrc.blink_rightに対応するものです。

    • Looking Up
      上を見るときにまぶたを動かすBlendShapeです。
      Avatars2.0におけるvrc.lowerlid_leftとvrc.lowerlid_rightに対応するものです。

    • Looking Down 下を見るときにまぶたを動かすBlendShapeです。
      Avatars2.0におけるvrc.lowerlid_leftとvrc.lowerlid_rightに対応するものです。

Playable Layers

Avatars2.0におけるAnimatorOverrideController(通称: CustomOverrideEmpty)に代わるものです。

f:id:gatosyocora:20200801025807p:plain

各ボタンを押すと, 自分で用意したAnimatorControllerを設定できるようになります。

f:id:gatosyocora:20200805113621p:plain

Base

  • Base
    Idle, 移動, 落下やジャンプなどの基本となるアニメーション(Humanoidのボーンを操作)
    Avatars2.0のCustomOverrideEmptyにおけるIDLEなどを設定します。

  • Additive
    呼吸などの付加的なアニメーション(Humanoidのボーンを操作)

  • Gesture
    手の動きなどのHumanoidの一部ボーンや耳や尻尾などのHumanoidのボーン以外の操作
    Avatars2.0のCustomOverrideEmptyにおけるHANDOPENなどの手の形の変更などを設定します。

  • Action
    Emoteなどの他のPlayableLayerでの変更を無視したTransformの操作
    Avatars2.0のCustomOverrideEmptyにおけるEMOTEなどを設定します。

  • FX
    Transform以外の操作。
    表情やゲームオブジェクトのアクティブ化, マテリアルやシェーダープロパティの変更など
    Avatars2.0のCustomOverrideEmptyにおけるHANDOPENなどで設定した多くの変更を設定します。
    これを最も変更することになると思います。

Special

  • Sitting
    座る位置に関する計算をするときの補正に使う?

  • TPose
    視点に関する計算をする時の補正に使う?

  • IKPose
    IKの計算をするときの補正に使う?

Lower Body

ラッキングされていない体の部位の動きに関する設定項目 Avatars2.0にはなかった新しい設定項目です。

f:id:gatosyocora:20200805085319p:plain

  • Use Auto-Footsteps for 3 and 4 point tracking
    オフにするとルームスケールの動きに対して, 下半身のアニメーションを無効化します。
    3点もしくは4点トラッキングの時に適用されます。

  • Force Locomotion animations for 6 point tracking
    オンのとき, Locomoting(ジョイスティックの移動など)はWalking/Runningアニメーションを再生します。
    オフのとき, これらを再生しません。
    また, オフのときはデフォルトのBaseLayerとAdditiveLayerを使用してはいけない。
    6点トラッキング(フルトラッキング)の時に適用されます。

Expressions

Avatars3.0から利用可能になったドーナッツ型のメニュー(アクションメニュー)を拡張するための項目です。

f:id:gatosyocora:20200801041206p:plain

  • Menu
    アクションメニューのボタンの種類と効果を設定するVRCExpressionsMenuです。

  • Parameters
    アクションメニューのボタン操作によって変更されるAnimatorParameterを定義するVRCExpressionsParametersです。

さいごに

Avatars2.0からAvatars3.0のアバターへ変換するEditor拡張「VRCAvatarConverterTo3」を作成しました。
こちらもあわせてお使いください。

gatosyocora.booth.pm

また、Avatars3.0に関する情報を共有するDiscordチャンネルもあるので、興味がある方は入ってみてください

discord.com

参考文献