【Unity】3dカメラを良い感じに移動する方法
3Dゲームを作る際に、カメラを良い感じの位置から、横方向にはキャラクターを旋回し、縦の回転は制限付きのようなカメラを実装する事とした。
これが正しい動きかわからないが、メモに記録する。カメラオブジェクトに以下のスクリプトを入れる。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraScript : MonoBehaviour {
[SerializeField] GameObject targetObj;
Vector3 targetPos;
Vector3 roteuler;
//回転の制限
[SerializeField] float ANGLE_LIMIT_UP = 45f;
[SerializeField] float ANGLE_LIMIT_DOWN = -45f;
void Start() {
targetPos = targetObj.transform.position;
roteuler = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0f);
}
void Update() {
rotateCameraAngle();
}
//カメラの回転制御
private void rotateCameraAngle() {
// targetの移動量分、自分(カメラ)も移動する
transform.position += targetObj.transform.position - targetPos;
targetPos = targetObj.transform.position;
// マウスの右クリックを押している間
// if (Input.GetMouseButton(2)) {
// マウスの移動量
float mouseInputX = Input.GetAxis("Mouse X");
float mouseInputY = Input.GetAxis("Mouse Y");
// targetの位置のY軸を中心に、回転(公転)する
transform.RotateAround(targetPos, Vector3.up, mouseInputX * Time.deltaTime * 300f);
// カメラの垂直移動(※角度制限なし)
//transform.RotateAround(targetPos, transform.right, mouseInputY * Time.deltaTime * 300f);
//カメラの垂直移動(角度制限あり)
roteuler = new Vector3(Mathf.Clamp(roteuler.x - mouseInputY * Time.deltaTime * 200f,
ANGLE_LIMIT_DOWN, ANGLE_LIMIT_UP),
transform.localEulerAngles.y, 0f);
transform.localEulerAngles = roteuler;
//}
}
}
ターゲットの位置には注目点となるプレイヤーの位置を。
縦の回転できる角度を編集しやすくしてある。
ターゲットを中心に、カメラの位置を移動したい場合は
transform.RotateAround(ターゲットの位置、向き、移動量);
カメラの角度を変更したい場合は
transform.localEulerAngles
と憶えておく。