プレイヤーを動かす(Rigidbody)

キーボードイベントを取得してRigidbodyを操作しよう

カメラが固定の場合

Rigidbodyに力を加えて移動させる方法です。 カメラが固定されている場合には、画面に対して水平か垂直に力を加えるだけで良いので、Input.GetAxisから値を取得した値をそのまま AddForce で力を加えて移動させます。 移動させるものが進行方向を向くものの場合、回転させるスクリプトを書く必要があります。

public class PlayerRb : MonoBehaviour {

	[Range(1f, 20f)] public float speed = 10.0f;

	void FixedUpdate () {
		//キーボードの操作を取得する
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		//Rigidbodyを取得する
		Rigidbody rb = gameObject.GetComponent<Rigidbody> ();

		//取得した値をもとにRigidbodyにX,Z軸の力を加える
		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
		rb.AddForce (movement * speed);
	}

	//進行方向に回転させる
	Vector3 prev;
	void Update(){
		Vector3 diff = transform.position - prev;
		if (diff.magnitude > 0.01) {
			transform.rotation = Quaternion.LookRotation(diff);
		}
		prev = transform.position;
	}
}

カメラが移動する場合

FPS視点やTPS視点など、画面に対してカメラの方向が変わる場合にはAddTorqueで方向を変更し、AddForceで向いている方向に移動させる事も可能です。

回転、移動のスピードはpublicの変数にしておいて、エディタから編集できるようにしておくと便利です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerRb : MonoBehaviour {

	[Range(0.01f, 1f)] public float rotateSpeed = 0.02f;
	[Range(1f, 30f)] public float walkSpeed = 15.0f;

	void FixedUpdate () {
		//キー操作を取得する
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		//Rigidbodyを取得する
		Rigidbody rb = gameObject.GetComponent<Rigidbody> ();

		//回転
		rb.AddTorque(new Vector3(0.0f, moveHorizontal*rotateSpeed, 0.0f));

		//キャラの向いている方向に移動
		rb.AddForce (transform.forward * moveVertical * walkSpeed);
	}
}

Rigidbodyやコライダーを調整しよう

Rigidbodyで物体を動かす場合、地面との摩擦で思い通りの動きができないことがあるので、 コライダーは摩擦が少ないCapsuleかSphereを使用します。

また、Rigidbodyをデフォルトのままの設定で動かすと意図しない回転をしてしまったりするので、Constrationsなどの値も合わせて調整しましょう。

インスペクタウィンドウで各種コンポーネントを適切な値に変更して、目的の挙動になるように調整しましょう。

RigidBodyでキャラクタを動かすと、振り返りや歩行の際に慣性の法則が働いたり、物理演算の世界に力を加える事によって動かす事になるので、調整が若干難しくなります。 ゲームのコンセプトやキャラの用途などに応じて摩擦などの値を調整したり、TransformNavMeshなどの移動手段と使い分けるなどしましょう。