自動ドアの制御(3) Trigger Collision Detection
Unity勉強会用の資料として。
自動ドアの制御の3つのやり方、その3。
—————————————————
3つの衝突判定
・Collision Detection [detecting]:コライダーがぶつかっているかどうかで判定。
・Ray Casting [drawing]:コライダーがぶつかる前に、ベクターで対象を検知。
・Trigger Collision Detection [detecting]:コライダーの領域内にもう1つのコライダーが重なっているかどうかで判定。
—————————————————
Approach 3 : Trigger collision detection
デモはこちら。
コライダーの領域内にもう1つのコライダーが重なっているかどうかで判定。
特徴:一定の距離に近づくとドアが開く。
欠点:特になし。
—————————————————
小屋に Box Collider で衝突領域を指定し、以下のスクリプト TriggerZone を適用する。
1 2 3 4 5 6 7 8 9 10 11 |
using UnityEngine; using System.Collections; public class TriggerZone : MonoBehaviour { void OnTriggerEnter(Collider col){ // トリガーとなる Box Collider の衝突を監視. if(col.gameObject.tag == "Player"){ // 衝突した GameObject がプレイヤーだった場合. transform.FindChild("door").SendMessage("DoorCheck"); // 衝突対象の GameObject の子、'door' の関数 'DoorCheck' を呼び出す. } } } |
—————————————————
ドアにスクリプト DoorManager を適用する。(自動ドアの制御(2) Ray Casting と同様)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using UnityEngine; using System.Collections; public class DoorManager : MonoBehaviour { bool doorIsOpen = false; float doorTimer = 0.0f; public float doorOpenTime = 3.0f; public AudioClip doorOpenSound; public AudioClip doorShutSound; // Use this for initialization. void Start () { doorTimer = 0.0f; // タイマーをリセット. } // Update is called once per frame. void Update () { if(doorIsOpen){ // ドアが開いていた場合. doorTimer += Time.deltaTime; // タイマーを更新. if(doorTimer > doorOpenTime){ // 規定値に到達した場合. Door (doorShutSound, false, "doorshut"); // ドアを閉める. doorTimer = 0.0f; // タイマーをリセット。 } } } void DoorCheck(){ if(!doorIsOpen){ // ドアが閉まっている場合. Door (doorOpenSound, true, "dooropen"); // ドアを開く. } } void Door(AudioClip aClip, bool openCheck, string animName){ // ここでは閉める場合にしか使用せず. audio.PlayOneShot(aClip); doorIsOpen = openCheck; transform.parent.gameObject.animation.Play(animName); } } |