範囲に侵入して、しばらくすると移動不能になり、数秒経てば再び動かせるようにしてみましょう。
今回の例では、BoxColliderに入ってから2秒後に動けなくなり、さらに2秒経過すれば動けるようにします。
非表示にしたBoxColliderを、エリア外に出れば、再び表示できるようにしています。
関連記事:
エリア内にn秒間滞在すれば実行
特定エリアに近づくと追いかけてくる
エリアに入れば自動で移動(ムービングウォーク)
特定エリアに入った時は実行不可にする
エリアに入れば飛び上がる
領域に入っている間と離れたときに発生
触れた相手のコライダーを削除(無効にする)
オブジェクトの半分まで入れば実行
エリア内でランダム移動する
エリアに入れば音量を上げる
オブジェクトの用意
PlaneとSphereを作成して、色をつけます。
Sphereにはリジッドボディを追加し、中心からずらして地上に配置します。
シーンビューではこのように見えています。
続いて、空のオブジェクトを2つ作成します。
一つを「StayArea」、もう一つを「ExitArea」という名前に変更。
StayArea、ExitAreaともにボックスコライダーを追加し、トリガーにするにチェックを入れて、サイズを3倍にします。
同じ場所、同じサイズで、2つのボックスコライダーが重なっている状態です。
エリア内に留まっている時のスクリプト
まずは、ボックスコライダー内で2秒後に動けなくなり、さらに2秒経過すれば動けるように、プログラムを作成します。
SphereMove.csを作成し、Sphereに追加します。
SphereMove.csを記述します。
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereMove : MonoBehaviour { private float speed = 1.0f; private float time; private BoxCollider boxCol; public bool canMove; public static SphereMove instance; public void Awake() { if(instance == null) { instance = this; } } void Start() { canMove = true; time = 2.0f; } void Update() { if(canMove) { float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed; float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed; transform.position = new Vector3 ( transform.position.x + moveX, transform.position.y, transform.position.z + moveZ ); } } void OnTriggerStay(Collider other) { if (other.gameObject.name == "StayArea") { time -= Time.deltaTime; if(time <= 0) { canMove = false; Invoke("MoveOn", 2.0f); boxCol = other.gameObject.GetComponent<BoxCollider>(); boxCol.enabled = false; } } } void MoveOn() { canMove = true; time = 2.0f; } public void AreaON() { boxCol.enabled = true; } } |
一番最後のAreaOn()は、エリア外に出たとき、再びボックスコライダー(StayArea)を表示させるために作成しました。
無効にしたColliderを再び有効に
StayAreaに入ってから2秒後に、ボックスコライダーは非表示になっています。
そのため、エリアの外に出たタイミングで、再びボックスコライダー(StayArea)をアクティブにしましょう。
AreaScript.csを作成して、ExitAreaに追加します。
AreaScript.csを記述します。
AreaScript.cs側から、SphereMove.csのAreaOn()を実行させるスクリプトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AreaScript : MonoBehaviour { void OnTriggerExit(Collider other) { if (other.gameObject.name == "Sphere") { SphereMove.instance.AreaON(); } } } |
それでは、ゲームプレイして動きを確認しましょう。
エリアに侵入して2秒経過すれば、2秒間動かせなくなります。
動けるようになってエリア外に出れば、またボックスコライダーが表示。
再度エリアに侵入すれば、また移動不能になります。
関連記事:
エリア内にn秒間滞在すれば実行
特定エリアに近づくと追いかけてくる
エリアに入れば自動で移動(ムービングウォーク)
特定エリアに入った時は実行不可にする
エリアに入れば飛び上がる
領域に入っている間と離れたときに発生
触れた相手のコライダーを削除(無効にする)
オブジェクトの半分まで入れば実行
エリア内でランダム移動する
エリアに入れば音量を上げる