Programming in VRChat

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

Timer

  • VRC_Trigger で扱うトリガーの一つに OnTimer がある
  • API: https://docs.vrchat.com/docs/ontimer
  • タイマーを仕掛けるのも、それに応答するのもその VRC_Trigger 自身。
    • (通常のオブジェクト指向的タイマー実装を見慣れた少々奇妙にも思える設計だが OnTimer を発生させる要素はその OnTimer ハンドラを備えている VRC_Trigger 自身)
    • よって、OnTimer を設定するだけでタイマーが使えるようになる
  • 発火するタイミングは Low Period TimeHigh Period Time の間の時間からランダムに決まる。
    • 確定した値にするには両方を同じ値にする。
    • 単位は秒(らしい)

One-shot timer の作り方

  • FIXME 下記の記述間違っているのでは?無効化→有効化はコンポーネントではなく、オブジェクトなのでは?要再検証。(アイディアとしてはあっているはず)
  • GameObject を保持したままタイマーをリセットする方法(つまり現在時刻から所定の時間後にアクションを発動する方法)は、 Reset On Enable 設定を有効にして、その VRC_Trigger コンポーネントを無効化→有効化するしかない模様。
    • API ドキュメントの "If true the timer will be reset when the Game Object the VRC_Trigger is on is enabled" は少々文が分かりにくいが、そういうことだと思う。(「VRC_Trigger が乗っているゲームオブジェクトが enable された時」と読むということ)
  • よってワンショットタイマーを作る一つの方法は以下
    1. タイマー用の GameObject を用意する
    2. VRC_Trigger コンポーネントを追加
    3. OnTimer trigger を追加
    4. その action にタイマーで実行したい action を記述
    5. action 艇後の最後に SetComponentActive action で、このオブジェクト自身の VRC_Trigger を指定し Enable 設定を False にする
    6. 初期状態として VRC_Trigger コンポーネントを無効化しておく
    7. このタイマーを起動するには、このオブジェクトに対して SetComponentActive action で VRC_Trigger を enable にする。
      • 指定時間後にアクションが一回だけ実行される
      • enable 状態で enable にしても何も起きないので先勝ち方式
  • 別の方法は Repeat を無効にして、その GameObject 全体を必要に応じて Spawn や Destroy するもの。
    • 同時並行にセットする必要があるならこっちを使うことになるだろう。