👻

[Unity][コスプレZ]キャラを追従するカメラ

2022/04/08に公開

はじめに

はじめまして、コスプレZのプログラム担当のしげるです。
主にプレイヤー周りの実装を行いました。
記念すべき第1回目は、コスプレZのカメラの実装のお話をします。

持ち帰れるもの

  • プレイヤーからの角度や距離に応じてカメラの座標を決定する手法

コスプレZってどんなゲーム?

こんなゲーム

steamで絶賛発売中!モバイル版もあるよ!なんとモバイル版は無料だよ!
https://store.steampowered.com/app/1779630/Cosmo_Player_Z/

カメラの座標を決めるために必要な数値

コスプレ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