今回はコライダーの設定を行い、プレイヤーが侵入したかどうかを検知する
〇目次
プレイヤーの検知用のコライダーを作成する
扉のオブジェクト自体にコライダーを設定してもよいが、それだと扉の開閉に合わせてコライダーも移動してしまうので、扉の状態ごとに検知範囲が変わってしまう。
そこで、空のゲームオブジェクトを作成し(上記はDoorMainとしている)、扉のオブジェクトを子オブジェクトとすることにより、上記が回避できる
コライダーについてはBox Colliderを選択
大きさについてEdit Colliderを使ってちょうどよい大きさに調整
Inspctorウインドウ上で、Is Triggerにチェックを入れる(上の図の黄色の箇所)
これは、コライダー同士が衝突した場合にTrigger(≒きっかけ)としてのみ使用する場合にチェックを入れる
チェックを入れないと物理演算の作用が発生し、反発しあったりする
2 スクリプト作成
〇概要
スクリプトでは下記の二つの制御を行っている
ア プレイヤーがコライダー内に入ったかどうかで扉を開け閉め
イ 扉の開閉動作に合わせて音声を出力
ア プレイヤーがコライダー内に入ったかどうかで扉を開け閉め
7行
Inspentor上で割り当てるため、GameObjectをpublicにて定義
14行
スクリプト自体は親オブジェクトに割り当てられており、Animator自体は扉のオブジェクトに設定されているため、goについてはInspentor上で扉オブジェクトを割り付け、これからAnimatorコンポーネントを取得
18~26行
OnTriggerEnter関数は、設定したコライダー内に他のオブジェクトが入った際に呼び出され、今回は侵入したオブジェクトがPlayerのタグのついているものかを確認し、一致した場合にAnimatorに設定しているパラメーターをSetBool関数を使いtrueに変化させている
これにより扉が開くアニメーションが再生される
ただし、その前にDoorOpenの状態を確認し、すでに扉が開いている場合は何もしないようにしている
28~37行
OnTriggerStay関数は、コライダー内にオブジェクトがとどまっているときに呼び出される
なぜこの処理が必要かというとと、OnTriggerEnterは、オブジェクトが侵入した場合に1回のみ呼び出され、オブジェクトが扉の前に居続けた場合を感知はしない
通常だとこの後は一定時間後に扉を閉めることになるが、それではオブジェクトが居続けた場合にも扉が閉まってしまうことになるため、この制御が必要なとる
中身はEnterの時と同じ
39~44行
OnTriggerExit関数は、コライダー内からオブジェクトが出た時に呼び出されるため、このタイミングで扉を閉じるようにする
ただし、念のため一定時間後に閉じるようにするためInvoke関数を使用している
47~51行
Invoke関数から呼び出される関数となっており、SetBoolにてfalseをセットして扉を閉じるアニメーションを再生している
イ 扉の開閉動作に合わせて音声を出力
アニメーションに連動したサウンドの出力については、やはりアニメーションの途中の良いタイミングで出力できるのがよい
Unityでは、Animatorウインドウにてタイミングをイベントとして追加し、割り付けた関数を呼び出すことができるので、これを活用する
扉のゲームオブジェクトには上記のスクリプトを追加
サウンドファイルについては、Inspentor上で割り当てられるようにpublicにて定義
18行、24行については、Animatorウインドウにて設定したイベントのタイミングで呼び出される関数を用意
イベントを発生させたいタイミングで、タイムライン上のフレーム数が表示されているすぐ下を右クリックするとAdd Animation Eventと表示されるのでこれをクリック
イベントのマークを選択し、InspectorウインドウのFunctionの箇所に、このイベントが発生したタイミングで呼び出したい関数名を入力する
扉を閉じるアニメーションについても同様に設定する
完成するとこんなイメージになるはず・・・・
以上、今回はコライダーの設定、侵入、退出の検出、Animatorでのイベント、呼び出し関数設定の紹介をした
どちらも使う頻度は高いと思われるので、いろいろ実験してみてほしい