Programming in VRChat

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

ActivateTrigger

OnTriggerEnter をきっかけとして指定した動作を行う Standard Assets 中のスクリプト

f:id:naqtn:20190812132552j:plain

Standard Assets/Utility/ActivateTrigger

パラメタ

動作の種類(Mode)

行える動作の種類 Mode は以下。いずれかを選ぶ。

名称 動作内容
Trigger 他の ActivateTrigger へトリガーを送る
Replace 対象 GameObject を別の新規作成したもので置き換える
Activate 対象 GameObject を active にする
Enable 対象 Component(正確には Behaviour) を enable にする
Animate 対象 GameObject の Animation を Play する
Deactivate 対象 GameObject を 非 active にする

OnTriggerEnter に対する動作の実行条件

  • デフォルトでは、「OnTriggerEnterを検出した時に一回限り」実行する
  • triggerCount に値を入れると、「その回数の OnTriggerEnter を受けた時に一回限り」実行する、になる
  • repeatTrigger が有効であると、「OnTriggerEnter を受けた時に毎回」実行する、になる。(triggerCount は無視される)

対象 (target)

  • 対象は target に指定する
  • None にした場合は、この ActivateTrigger が置かれている GameObject が対象になる
  • 指定した対象がどのように扱われるかは Mode による。
  • いろいろなものが指定できてしまうが、動作の意味内容からして無効なものは無視される

NOTE:

  • target に Component を指定しているが Mode で指定された動作が GameObject を必要とする場合は、Component が置かれている GameObject が対象になる。
  • 型が UnityEngine.Object であるため無意味なものも含め色々なものが指定できてしまうが、実行時に無視される。

各 Mode について補足

Mode Trigger 補足

  • 対象 GameObject 以下に置かれている ActivateTrigger でそれぞれ OnTriggerEnter が起きたことと同じになる。

NOTE: BroadcastMessage("DoActivateTrigger") を行っている。 つまり対象を含み、全ての子孫 GameObject 上の ActivateTrigger に働きかける。

Mode Replace 補足

  • 対象 GameObjectを他の新規のGameObjectに置き換える
  • 新規作成する GameObject は source でコピー元を指定する
  • source はシーン上のオブジェクトであっても、プレハブであっても構わない
  • position と rotation だけが新しいオブジェクトに引き継がれる。scale は引き継がれない

NOTE: 内部的には Instantiate と DestroyObject の実行。

Mode Enable 補足

  • 対象となるコンポーネントは Inspector で名前部分をドラッグすることで設定できる
    • Inspector を二つ表示して、片方をロックしてからドラッグする
  • 対象の型は UnityEngine.Component ではなくて UnityEngine.Behaviour になっている
  • よって全てのコンポーネントが指定できるわけではない
    • 例えば AudioSource, Light, StandardAssets 中の C# スクリプト は指定可
    • 例えば MeshRenderer, 各種 Collider は指定不可

NOTE: 継承構造をおさらいすると Behaviour extends Component 、MonoBehaviour extends Behaviour である。 ここは Component でいいはずなのになぜか必要以上に限定して Behaviour にしている。 作者は「C# スクリプトの動作を開始させる」という意図だったのかもしれない。

内部 API

  • DoActivateTrigger() が OnTriggerEnter で実行されるメソッドである
  • BroadcastMessage や Button などから実行できる
  • (private であるため Button の UI Event から実行する設定には特殊な方法が必要)

メモ

  • 名前が実態を表していなくて分かりにくい。
  • ActivateTrigger という名前は「何かを active にする trigger」あるいは「trigger を activate するもの」だと読めるが、実態はそうではない。 「trigger によって何かの動作を activate するもの」である。(歴史的に Mode Activate の動作が先にあって、それに命名が引きずられたのかも)
  • VRC_Trigger の OnEnterTrigger の代替になりうる。万能ではないが。
  • Mode Replace は VRChat ワールド開発において貴重な Instantiate を行う手の一つ。