Programming in VRChat

VRChat でのプログラミングについて調べたことの書き溜め

ThirdPersonCharacter の構成

Unity Standard Assets の Characters/ThirdPersonCharacter は、アバターで表現されるキャラクターの物理演算を伴う移動処理を行い、その結果をアバターのアニメーションに反映させる機構です。

ThirdPersonCharacter を駆動する2つの方式(人がキー入力する ThirdPersonUserControl 、現在地と目的地と地形から経路を見つけ出す AICharacterControl)が提供されていて、それぞれに例示としてアバターまでをセットアップしたプレハブが含まれています。

なお、ここでの「Third Person」は、三人称視点シューティングゲーム(TPS)での自プレイヤーキャラクタ、および、それと構成要素が同じになる NPC(Non-player character)の両方を含むキャラクターの実装を意味しています。「Third」の意味にあまりとらわれずに、Standard Assets 中に別途用意されている「FirstPersonCharacter ではない」ぐらいの意味でとらえておいた方が理解しやすいでしょう。

以下、詳細を図解します:

f:id:naqtn:20180430165316p:plain

VRChat での活用のポイント

  • 結局のところはこれは次のようなものである。
    1. 希望速度が入力によって与えられる
    2. 障害物などを考慮し、可能な速度が Rigidbody に反映される
    3. 移動に伴う状況変化が animator controller にパラメタ値として伝わる
    4. Rigidbody と CapsuleCollider で物理シミュレーションされ、移動結果が Transform に反映される
  • ThirdPersonCharacter という名称であるが「キャラクタ」である必要はない。 上述のような仕組みに基づき「移動する何か」である。
  • Animation controller は差し替え可能である。この部分にだけは組み換えの自由がある。
    • 同名のパラメータを受ける独自のものに置き換えて、 Humanoid ではない全く異なったものを駆動できる
    • Animation Event を活用するとそこからさらに別の機構を駆動できる
  • 前後および左右の移動である "Vertical" と "Horizontal" は、Unity の Input Manager が定義するものである。
    • VR コントローラでのアサインは Unity マニュアル OpenVRControllers に示されている。 (Horizontal Movement, Vertical Movement の部分。)
    • Vive の場合は、左のパッドを(押し込まずに)タッチしている中心からの相対の位置が、ちょうどジョイスティックを中立位置から傾けたのと同じように扱われる。
  • VRモードでの "Jump" のアサインは存在しないようである。(ver 2018.1.1 現在)
    • ("Jump" は Input Manager の Unity のデフォルトで "joystick button 3" に割当たっており、 それは上記の表でアサインが存在しない。 ちなみに最新のを見ると Valve Knuckles でのみアサインがある)
    • 以前のバージョンでは "Jump" 操作が可能だったらしいが詳細不明

付録:図よりデータ部分を抜き出し

キーアサイ

入力経路 種類 名称 機能
Standard Assets/CrossPlatformInput
ButtonDown "Jump" ジャンプ
Axis "Horizontal" 前後移動
Axis "Vertical" 左右移動
UnityEngine.Input
KeyCode C しゃがみ
KeyCode LeftShift 移動速度半減

Animation のパラメータ

名称
Float "Forward"
Float "Turn"
Bool "Crouch"
Bool "OnGround"
Float "Jump"
Float "JumpLeg"