本ドキュメントには開発中の情報が含まれるため、GameObjectの名称等が実際とは異なる場合があります。
本抜刀システムでは接触判定+ハンドサイン(ジェスチャー)による抜刀/納刀とExpressionメニューによる抜刀/納刀を行うことができます。
Expressionメニューからの抜刀/納刀は同梱しているモーションを使用します。
接触判定による抜刀/納刀はトラッキングを使用しているユーザー向けです。
接触判定+ハンドサインでは鞘を腰や背中など好きな位置に装備させ、これを左手に掴むこともできます。
本抜刀システムはModular Avatarがインストールされていることを前提としています。
Modular Avatar自体は本パッケージには含まれていませんので、下記URLより事前にインストールを行ってください。
BladeSystemRootプレハブをアバタールートの直下に配置してください。
位置合わせを除けばセットアップは以上です。
一部のアバターについては位置調整済みのプレハブが同梱されていますので、こちらもご利用ください。
実行モードに入りGestureManager等を使用してExpressionメニューから抜刀/納刀をクリックすると
抜刀モーションが再生されて抜刀状態になります。もう一度クリックすると納刀モーションが再生されて納刀状態に戻ります。
GestureManager等では少し長めにボタンを押さないと反応が悪い場合があります。
実際のVRChat環境ではそのような問題はありません。
BladeSystemRootプレハブの名前は原則として変更しないで下さい。
変更する場合は刀と鞘のMA BoneProxyも編集してSubPathの先頭とプレハブルート名を一致させてください。
抜刀/納刀
商品に同梱されいてるアニメーションを用いて抜刀と納刀を行います。
エフェクトON
エフェクトの有無を切り替えます。
自動で鞘を隠す
抜刀後、自動で鞘を非表示にします。
メニューからの抜刀時にのみ機能します。
鞘の非表示
鞘を非表示にします。抜刀状態でのみ機能します。
鞘が非表示の時は接触判定による納刀は行えません。
メニューから納刀を行うと強制的に表示状態に戻ります。
表示/非表示
剣と鞘の表示/非表示を切り替えます。
抜刀状態での刀の握り位置は BladeSystemRoot > Locators > BladeHandR というGameObjectで設定します。
編集モードでBladeHandRを動かすと刀のモデルも追随して動きますので、アバターの右手に合わせて位置を調整してください。
Expressionメニューからの抜刀/納刀モーションに合うように鞘の位置を調整します。
メニューからの抜刀/納刀を使用しない場合はこの位置調整は不要です。
実行モードに入り、GestureManager等を用いてzkBladeUnsheath というIntパラメータを1に変更してください。刀が右手に移動するはずです。
続いてアバターの左手ボーン(Hand.L)の下にあるSheath_AnimHomeを選択し、その中にあるVRC Parent Constraintコンポーネントを有効化してください。これにより鞘が刀側に移動するはずです。
再びGestureManagerに戻り、zkBladeActionというパラメータを99に変更します。
これにより抜刀モーションの刀の柄を掴んだところでアバターが静止します。
ここで鞘が左手からずれてしまっているようであれば、刀の握り位置調整に戻って鞘が左手に合うように刀側の位置を再調整してください。
抜刀状態になった瞬間に鞘から刀が少しズレることを許容するのであれば、ここでの鞘と左手の位置合わせは正確でなくて構いません。
後述の手順で拘束位置を設定した後に左手に合うようSheath_AnimHomeを調整してください。
鞘が左手に合うようになったら、以下の手順で鞘の拘束位置を設定します。
実行モードのまま
BladeSystemRoot > Proxies > BladeProxyRoot > BladeProxy > SheathPositionGuide を
アバターの左手ボーンの直下の階層に移動させます。(fig.1)
移動させたSheathPositionGuideのTransformコンポーネントをコピーします。
実行モードを終了します。以降は全て編集モードでの作業です。
アバターの左手ボーンの直下に空のGameObjectを作成し、2でコピーしたTransformの値を貼り付けます。(fig.2)
4で追加した空のGameObjectをシーンルート階層に移動させ(fig.3)、Transformの値をコピーします。
BladeSystemRoot > Locators > Sheath_AnimHomeのTransformに5でコピーした値を貼り付けます。
追加した空のGameObjectを削除します。
これで抜刀/納刀モーション用の鞘の位置調整は完了です。
実行モードに入りExpressionメニューから抜刀/納刀を行ってアニメーションと位置が合っていることを確認してください。
この手順で設定したSheath_AnimHomeはモーションと正確に一致するはずです。
ここからさらにSheath_AnimHomeの位置を調整して鞘の握り位置を調整することもできますが、
その場合は抜刀した瞬間に刀が鞘から少しズレることになります。
fig.1
fig.2
fig.3
接触判定 + ハンドサインによる抜刀/納刀を使用しない場合、この調整は不要です。
トラッキングで右腕を動かして抜刀/納刀を行う場合、鞘は任意の位置に装備することができます。
この位置を調整するにはまずSheathProxyRootのParentConstraintでElement0のWeightを1に、それ以外のWeightを0に変更します。
次にSheath_UserHomeにあるMA Bone Proxyのターゲットを鞘の装備位置に合わせた適切なボーンに変更します。
腰にさす場合はHipsが、背中に背負う場合はSpineが適切でしょう。
後はSheath_UserHomeをSceneViewで動かして鞘を望みの位置に配置してください。
接触判定 + ハンドサインで鞘を掴む機能を使用しない場合、この調整は不要です。
ホーム位置にある鞘を左手で掴んで手に持たせることができます。
このときの鞘の持ち位置の調整方法です。
これはアニメーションによる納刀/抜刀の鞘の持ち位置とは独立して設定します。
調整に先立ち、まずはSheasProxyRootのParentConstraintでElement1のWeightを1に、それ以外のWeightを0に変更します。
後はSheath_HandLをSceneViewで動かして鞘を望みの位置に配置してください。
右手を刀の柄に接触させてハンドサインをFist以外からFistに変更すると抜刀状態になります。
先にFistにしてから接触させても抜刀にはなりません。
接触を維持したままFist以外からFistに変更してください。
抜刀の接触判定はBladeProxyRoot > ContactGrabR と Blade_HandR > Senderで行っています。
判定の大きさを調整する場合はこれらを編集してください。
刀の根元と鞘の入り口を接触させた状態でハンドサインを
NeutralまたはOpen以外からNeutralまたはOpenに変更すると納刀します。
納刀の接触判定はBladeProxyRoot > ContactBladeToSheathと
SheathProxyRoot > ContactSheathFromBladeで行っています。
判定の大きさを調整する場合はこれらを編集してください。
左手を鞘に接触させてハンドサインをFist以外からFistに変更すると鞘を左手に持つことができます。
この接触判定はSheathProxyRoot > ContactSheathGrabLと
Sheath_HandL > Senderで行っています。
判定の大きさを調整する場合はこれらを編集してください。
左手に持った鞘をユーザーが設定した鞘の装備位置近くにもっていき
ジェスチャーをNeutralまたはOpen以外からNeutralまたはOpenに変更すると
鞘を左手から装備位置に戻すことができます。
この接触判定はSheathProxyRoot > SenderToHomeと
Sheath_UserHome > ContactSheathToHomeで行っています。
判定の大きさを調整する場合はこれらを編集してください。
デフォルトでは以下の初期状態になっています。
刀表示
納刀状態
鞘は抜刀/納刀アニメーション用の位置
これを変更する場合、例えば初期状態で抜刀させたいなどはBladeSystemRootのMA Parametersで設定します。
zkBladeEnable
刀の表示/非表示です。
ON : 表示 (デフォルト)
OFF : 非表示
zkSheathLocator
鞘の位置です。
0 : ユーザー設定の装備位置
1 : 左手で掴んだ状態
2 : 抜刀/納刀アニメーション用の位置 (デフォルト)
商品によっては0がデフォルト値の場合があります。
zkBladeUnsheath
抜刀/納刀の状態です。
0 : 納刀 (デフォルト)
1 : 抜刀
本抜刀システムでは、BladeSystemRootにあるMA MergeAnimatorによりBladeSystemAnimatorAction.controllerを
アバターのPlayableLayer Action に統合させています。
このため、抜刀/納刀モーション中に他のエモートを再生したりすると予期せぬ挙動を起こす場合があります。
AFKやsit中は抜刀/納刀に遷移しないような制御は含めてありますが、より完全な排他制御が必要な場合は
アバター本体のActionレイヤー内に抜刀システムのActionレイヤーを取り込んでユーザー様ご自身での改修が必要になります。