VRC Player Modsの Run , Walk speed の単位は m/s
概要
フォトグラメトリを行い、地元の環境を撮影し、VRChatにアップロードしたが
歩行、走る速度が早すぎて違和感が生じた。このため適切な設定値を知りたくなった。
せっかくだからUdonSharpの勉強がてら歩行速度を測ることにした。
設定項目
Packages/com.vrchat.worlds/Samples/UdonExampleScene/Prefabsに存在する
VRCWorldの中に UdonBehaviour があり、 Public Variablesの中に歩行、走るスピードの設定項目がある。
個人的なおすすめは以下の便利ツールセットを使うこと。
VRCWorldInfo_Advancedがおすすめ。
結論
- VRChatのワールドにおける歩く、走るスピードの単位は m/sec
- 例: Run Speed = 4 の場合は 4 m/s = 14.4 km/h
- 成人の歩行速度は 1m/s ~ 1.6m/s くらい(根拠薄)
- kayanomicha(現実)は 25m において 20 sec で歩く = 1.25 m/s = 4.5 km/h
- Walkspeed = 1.25にすると現実的な歩行速度
- 走るスピードは2~4倍だそうだが、個人差が大きいので割愛
- VRユーザの場合、走るスピードがMAXでコントローラーのスティック傾け量で無段階変化してる気がするので歩くスピードは無意味かも
検証内容
スタート地点、ゴール地点にBox Colliderを設置し、UdonSharpをそれぞれ書く。
背景に時間を表示し、Start通過でカウント開始、Goal通過で終了させる。
コードは以下の通り。ネットでUnity関連の記事+VRChatの記事でなんとかした。
1つ目はStartさせる用のスクリプト。タイマーの起動、カウントダウンの表示変更と停止用の関数を用意してある。
using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; using UnityEngine.UI; using TMPro; public class StartCollider : UdonSharpBehaviour { public bool TimerOn; [SerializeField] private float seconds; [SerializeField] private TextMeshProUGUI timerText; void Start() { seconds = 0.0f; TimerOn = false; } void Update () { if (!TimerOn){ return; } seconds += Time.deltaTime; timerText.text = seconds.ToString("00.00"); } public override void OnPlayerTriggerEnter(VRCPlayerApi player) { if (player != Networking.LocalPlayer) return; TimerOn = true; seconds = 0; } public void StopTimer(){ TimerOn = false; } }
もう一つはGoal、停止用のもの。
using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; using UnityEngine.UI; public class GoalCollider : UdonSharpBehaviour { [SerializeField] UdonBehaviour StartCollider; void Start() { StartCollider = (UdonBehaviour) StartCollider.GetComponent(typeof(UdonBehaviour)); } public override void OnPlayerTriggerEnter(VRCPlayerApi player) { if (player != Networking.LocalPlayer) return; StartCollider.SendCustomEvent("StopTimer"); } }
いろいろ雑だが、こんな感じ。
SendCustomEventで他の関数を呼び出せるところがなるほどな、と思った。
検証結果
25mの距離のワールドをPoly Builderで作成し、RunSpeed=25に設定した結果。
1秒で終わったので、25m/s だったわけで単位は一目瞭然だった。