リジッドボディを追加したプレーヤーが、ひっくり返らないようにしましょう。
とくにSphereColliderやCapsuleColliderなど、足元が不安定なコライダーでは、他のオブジェクトにぶつかれば倒れてしまうことがあります。
Constraintsをスクリプトから制御する方法で、このような転倒を防ぎます。
関連記事:
Colliderを使った接触判定
触れた相手のコライダーを削除(無効にする)
OnCollisionEnterとOnTriggerEnterの違い
Constraintsをスクリプトで制御する
Plane、Cube、Capsuleを作成し、このように配置します。
今回はCapsuleをプレーヤーとして操作します。
Capsuleにリジッドボディを追加しましょう。
このままCapsuleを動かした場合、Cubeにぶつかると倒れてしまいます。
通常はこのように、XとZを軸として回転する物理挙動になっています。
リジッドボディのConstraints、「回転を固定」のX軸とZ軸にチェックを入れると解決するのですが、これをスクリプトから行えるようにしましょう。
PlayerMove.csを作成し、Capsuleに追加します。
PlayerMove.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { private float speed = 3.0f; Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); rb.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ; } void Update() { 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 ); } } |
FreezeRotationXと書けば、X軸の回転をロックできます。
今回は、X軸とZ軸という特定の2つをロックしたい場合、間に「|」を入れて書きます。
ゲームプレイしてみましょう。
スタートすると、Constraintsの回転を固定にある、XとZにチェックが入ります。
Cubeにぶつかっても、ひっくり返らずに移動できるようになりました。
関連記事:
Colliderを使った接触判定
触れた相手のコライダーを削除(無効にする)
OnCollisionEnterとOnTriggerEnterの違い