ぶつかると開くドアを作ってみましょう。
Cubeを操作し、ドアに触れたタイミングで、扉が開きます。
1秒間だけ開いた後、扉は閉まります。
関連記事:
自動ドアのしくみ
パスワード付きドアの作成
HingeJointを使ってドアを作成
ドア側のスクリプト
PlaneとCubeを作成し、Cubeの位置とサイズを変更します。
Cubeの名前をDoorに変更し、色をつけます。
シーンビューではこのように配置されています。
空のオブジェクトを作成します。
GameObjectをDoorManageという名前に変更。
位置を1にして、Doorに右端まで持ってきます。
DoorManageの位置は、このように右端に配置されています。
DoorManageの中にDoorを入れて、親子関係をつくります。
DoorOpen.csを作成し、DoorManageに追加します。
DoorOpen.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DoorOpen : MonoBehaviour { public void DoorMove() { StartCoroutine("DoorRotate"); } IEnumerator DoorRotate() { for (int turn=0; turn<90; turn++) { transform.Rotate(0,1,0); yield return new WaitForSeconds(0.01f); } yield return new WaitForSeconds(1.0f); for (int turn=0; turn<90; turn++) { transform.Rotate(0,-1,0); yield return new WaitForSeconds(0.01f); } } } |
プレーヤー側のスクリプト
次に、プレーヤーとしてCubeを作成して、位置を変更します。
判別しやすいように、Cubeに色をつけます。
Cubeにリジッドボディを追加します。
CubeMove.csを作成し、Cubeに追加します。
CubeMove.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeMove : MonoBehaviour { public GameObject door; void Start() { door = GameObject.Find("DoorManage"); } void Update() { float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f; float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f; transform.position = new Vector3 ( transform.position.x + dx, transform.position.y, transform.position.z + dz ); } private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "Door" ) { door.GetComponent<DoorOpen>().DoorMove(); } } } |
ゲームプレイして、ドアに触れてみましょう。
ドアに接触すれば開き、1秒後に元に閉まります。
OnCollisionEnterを使ってドアの当たり判定つけ、当たったタイミングで、ドア側のDoorMove()を実行。
コルーチンを使用し、ゆっくり90°回転した後、1秒待ってから再び-90°回転していきます。