👻
[Unity][コスプレZ]キャラを追従するカメラ
はじめに
はじめまして、コスプレZのプログラム担当のしげるです。
主にプレイヤー周りの実装を行いました。
記念すべき第1回目は、コスプレZのカメラの実装のお話をします。
持ち帰れるもの
- プレイヤーからの角度や距離に応じてカメラの座標を決定する手法
コスプレZってどんなゲーム?
こんなゲーム
steamで絶賛発売中!モバイル版もあるよ!なんとモバイル版は無料だよ!
カメラの座標を決めるために必要な数値
コスプレZのカメラは以下のような特徴があります
- ユーザーが任意に回転、移動できない
- 常にキャラからの距離が固定
- 俯瞰
以上から、以下の変数があればカメラの座標が求まると考えました
- プレイヤーの座標(transform.position)
- プレイヤーからの距離(distance)
- プレイヤーとカメラの角度(angle)
- カメラのX軸の回転量(cameraRotateX)
図にしてみました(絵心)
これら変数をScerializeFieldなどで出しておいて、アートの担当がカメラを決めてくれた感じです。
ソースコード
以下のコードをカメラに貼り付けて、distance, angle, cameraRotateX などを調整してみてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// カメラ制御クラス
/// </summary>
public class CameraController : MonoBehaviour
{
[SerializeField] private Camera _mainCamera = null;
[SerializeField] private Transform _cameraRoot = null; //カメラと同じでおk
[SerializeField] private float _distance = 15;
[SerializeField] private float _angle = 25.0f; //degree
[SerializeField] private float _cameraRotateX = 32.5f; //degree
[SerializeField] private Transform _target = null; //追従対象
private void Update()
{
var sin = Mathf.Sin(_angle * Mathf.PI / 180.0f);
var cos = Mathf.Cos(_angle * Mathf.PI / 180.0f);
var charaPosition = _target.position;
_cameraRoot.position = new Vector3(
charaPosition.x,
(_distance * sin),
charaPosition.z + (_distance * cos * -1));
var cameraRotate = _mainCamera.transform.localRotation.eulerAngles;
cameraRotate.x = _cameraRotateX;
_mainCamera.transform.localRotation = Quaternion.Euler(cameraRotate);
}
}
Discussion