Unityでカメラの向きを基準に移動する方法と、追従して回転できるカメラの実装


3D空間でキャラクターに追従するカメラの実装


以下の機能を満たすカメラを実装しました。

方向キーによるオブジェクトの移動方向は、カメラの正面方向を基準にする。
カメラはオブジェクトに追従し、右クリック&マウス移動によってプレイヤーの周りを公転する。

unity_skill_5
© Unity Technologies Japan/UCL

サンプルが落ちてないかなと探してみましたが、個々の実装例は見つかるものの、複合的なものは見つからず。
標準アセットを探せば似たような機能のカメラスクリプトがある気がしなくもないですが、「作れるものは作る!」の考えで実装してみました。

※使用しているUnityのバージョンは5.5.0f3です。

カメラの正面方向を基準に、オブジェクトを移動させる方法


移動させたいオブジェクトにアタッチするスクリプトです。

	float inputHorizontal;
	float inputVertical;
	Rigidbody rb;

	float moveSpeed = 3f;

	void Start() {
		rb = GetComponent<Rigidbody>();
	}

	void Update() {
		inputHorizontal = Input.GetAxisRaw("Horizontal");
		inputVertical = Input.GetAxisRaw("Vertical");
	}

	void FixedUpdate() {
		// カメラの方向から、X-Z平面の単位ベクトルを取得
		Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;

		// 方向キーの入力値とカメラの向きから、移動方向を決定
		Vector3 moveForward = cameraForward * inputVertical	+ Camera.main.transform.right * inputHorizontal;

		// 移動方向にスピードを掛ける。ジャンプや落下がある場合は、別途Y軸方向の速度ベクトルを足す。
		rb.velocity = moveForward * moveSpeed + new Vector3(0, rb.velocity.y, 0);

		// キャラクターの向きを進行方向に
		if (moveForward != Vector3.zero) {
			transform.rotation = Quaternion.LookRotation(moveForward);
		}
	}

カメラはCamera.mainでメインカメラタグのついたカメラを指定していますが、任意のカメラに変更可能です。
カメラのローカル方向を取得することがポイントですね。

移動するオブジェクトに追従し、回転するカメラの設定


ターゲットの周囲を回転するカメラにアタッチするスクリプトです。

	GameObject targetObj;
	Vector3 targetPos;

	void Start () {
		targetObj = GameObject.Find("TargetGameObject");
		targetPos = targetObj.transform.position;
	}

	void Update() {
		// targetの移動量分、自分(カメラ)も移動する
		transform.position += targetObj.transform.position - targetPos;
		targetPos = targetObj.transform.position;

		// マウスの右クリックを押している間
		if (Input.GetMouseButton(1)) {
			// マウスの移動量
			float mouseInputX = Input.GetAxis("Mouse X");
			// targetの位置のY軸を中心に、回転(公転)する
			transform.RotateAround(targetPos, Vector3.up, mouseInputX * Time.deltaTime * 200f);
		}
	}	

カメラの回転処理はtransform.RotateAroundを使用しています。
第1引数に中心にしたいオブジェクト、第2引数に回転軸の向き、第3引数に移動量を渡します。
追従に関しては、ターゲットのフレーム間での移動量を取得し、自らの移動量としています。

最近よく読まれている記事

【初学者必見】Unityの実行時エラーの9割はNullReferenceExceptionだよね ★新着★
【Unity】スマブラっぽくダブルクリックで床を抜ける処理を作ってみた
【Unity】Unite 2017 Tokyo セッションスライド一覧
【Unity】SE兼ITスクールの講師がUnite2017の気になる講演をピックアップしてみた
【Unity】Physic MaterialのFrictionを1より大きくしたらどうなるのか検証してみた

Unityの記事一覧にもどる

  • このエントリーをはてなブックマークに追加

PAGE TOP