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


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


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

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

カメラ関連記事
【スナイパーライフル】カメラのズームと倍率の制御について
【接写】マウスホイールでカメラの向きにドリーイン・ドリーアウトさせる
【FPS向け】主観カメラへの切り替えと、プレイヤーの移動方法について

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");
			float mouseInputY = Input.GetAxis("Mouse Y");
			// targetの位置のY軸を中心に、回転(公転)する
			transform.RotateAround(targetPos, Vector3.up, mouseInputX * Time.deltaTime * 200f);
			// カメラの垂直移動(※角度制限なし、必要が無ければコメントアウト)
			transform.RotateAround(targetPos, transform.right, mouseInputY * Time.deltaTime * 200f);
		}
	}	

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

カメラの垂直移動は、プレイヤーを中心に上下に移動します。必要がなければコメントアウトしてください。

以上です。

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

【認定試験対策予想問題】Unity 練習問題 9
【Unityプログラミング力向上】C# 練習問題 6
【Unityワークショップ作品紹介】Elemental Swords
【Unity2017対応】UnityのEvent Triggerの種類と用途と使い方【保存版】
Event Trigger

記事一覧にもどる

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

PAGE TOP