CharacterControllerによる移動について、前回記事ではSimpleMoveを使用しました。
SimpleMoveは左右キーで回転でき、重力が備わっていますが、ジャンプができません。
今回は、Unityスクリプトリファレンスに掲載されているMoveを使って、動作にジャンプを付けてみましょう。
リジッドボディを用いたジャンプについては、こちらを参照ください。
キャラクターをジャンプさせるしくみ
関連記事:
進行方向へ回転するプレーヤー操作1
進行方向へ回転するプレーヤー操作2
キャラクターコントローラーに発射機能
ダブルジャンプの仕組み
徐々に加速、減速する自然な動き
CharacterControllerの衝突判定
オブジェクトの用意
前回記事と同じように、まずはオブジェクトを用意しましょう。
平面オブジェクト、2つのキューブを新規作成します。
1つ目のキューブの位置はXYZすべて0にしました。
2つ目のキューブの位置は、Yを0.5、Zを1に変更。
わかりやすいように、床をグレーに、階段を黒に着色しました。
CharacterControllerを使う
続いて、カプセルを作成し、階段の前に配置します。
カプセルに、CharacterControllerを追加します。
コンポーネントを追加 > 物理 > キャラクターコントローラー
次に、方向をわかりやすくするために、Sphereを取り付けます。
Sphereを作成してから、Capsuleの中にドラッグ&ドロップしましょう。
Sphereのスケールをすべて0.5にします。
カプセルのZ方向に、Sphereを埋め込みます。
これでカプセルの前面が確認しやすくなりました。
階段は0.5の高さがあるので、このままでは階段を上れません。
CharacterControllerの「ステップオフセット」を0.5に変更しましょう。
Moveを使ったスクリプト
Caplsuleを動かすために、スクリプトを作成します。
CapsuleMove.csを作成し、Capsuleに追加しましょう。
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 |
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; private Vector3 moveDirection = Vector3.zero; private CharacterController controller; void Start() { controller = GetComponent<CharacterController>(); } 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); } } |
ゲームプレイしてみましょう。
十字キー(WASDキー)で移動し、スペースキーでジャンプ。
階段も上ることができます。
isGroundedによって、着地している間のみ移動可能。
CharacterController.Moveには、重力が備わっていないため、gravityをつくって重力の機能を記述しています。
関連記事:
進行方向へ回転するプレーヤー操作1
進行方向へ回転するプレーヤー操作2
キャラクターコントローラーに発射機能
ダブルジャンプの仕組み
徐々に加速、減速する自然な動き
CharacterControllerの衝突判定