VRChat雑記

かやのみちゃのVRChat関連の雑記ブログです

VRC Player Modsの Run , Walk speed の単位は m/s

 

概要

測定用ワールド

フォトグラメトリを行い、地元の環境を撮影し、VRChatにアップロードしたが
歩行、走る速度が早すぎて違和感が生じた。このため適切な設定値を知りたくなった。
せっかくだからUdonSharpの勉強がてら歩行速度を測ることにした。

 

設定項目

Packages/com.vrchat.worlds/Samples/UdonExampleScene/Prefabsに存在する
VRCWorldの中に UdonBehaviour があり、 Public Variablesの中に歩行、走るスピードの設定項目がある。

たぶんこれ

個人的なおすすめは以下の便利ツールセットを使うこと。
VRCWorldInfo_Advancedがおすすめ。

booth.pm

 

結論

  • 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 だったわけで単位は一目瞭然だった。