ActivateTrigger
OnTriggerEnter をきっかけとして指定した動作を行う Standard Assets 中のスクリプト。
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
になっている - よって全てのコンポーネントが指定できるわけではない
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 を行う手の一つ。