衝突判定にはOnTriggerEnterやOnCollisionEnterなどがありますが、キャラクターコントローラーを用いて動かす場合は、OnControllerColliderHitを使います。
前回の続きで、ボールにぶつかるとパーティクルが発生するようにしましょう。
今回の制作は、【Unity C#】CharacterController.Moveによるジャンプ移動 を完成させてから進めてください。
前回記事:【Unity C#】CharacterController.Moveによるジャンプ移動
ボールとパーティクルの準備
Sphereオブジェクトを作成し、グリーンに着色。
プレーヤーから少し離れたところに配置しました。
パーティクルシステムを新規作成します。
ヒエラルキー > エフェクト > パーティクルシステム
移動ツールを使い、ParticleSystemを、Sphereと同じ位置に動かします。
ParticleSystemのインスペクターから、パーティクルの色を変更しましょう。
ParticleSystemを、Sphereにドラッグ&ドロップし、親子関係を取るようにします。
OnControllerColliderHitを使ったスクリプト
続いて、キャラクターコントローラーで動かしているオブジェクトの衝突判定をつくります。
CapsuleMove.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CapsuleMove : MonoBehaviour { public float speed = 6.0f; public float jumpSpeed = 8.0f; public float gravity = 20.0f; GameObject ball; //Sphereを入れるための変数 ParticleSystem particle; //パーティクルシステムを入れるための変数 private Vector3 moveDirection = Vector3.zero; private CharacterController controller; void Start() { controller = GetComponent<CharacterController>(); //Sphereにアクセスして情報をballに格納 ball = GameObject.Find("Sphere"); //Sphereの子であるParticleSystemを取得してpsに格納 particle = ball.GetComponentInChildren<ParticleSystem>(); //スタート時はパーティクルを止める particle.Stop(); } //キャラクターコントローラーの衝突処理 private void OnControllerColliderHit(ControllerColliderHit hit) { //Sphereにぶつかれば、パーティクルを発生させる if(hit.gameObject.name == "Sphere") { particle.Play(); } } void Update() { if (controller.isGrounded) { moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection = moveDirection * speed; if (Input.GetButton("Jump")) { moveDirection.y = jumpSpeed; } } moveDirection.y = moveDirection.y - (gravity * Time.deltaTime); controller.Move(moveDirection * Time.deltaTime); } } |
ゲームプレイして、表示を見てみましょう。
Sphereにぶつかって、パーティクルが発生すればOKです。
このように、キャラクターコントローラー(CharacterController)では、コライダーによる衝突判定は使えないため、OnControllerColliderHitを使って制御します。