わかゲームスタジオ

ゲーム制作初心者専門学生の備忘録

Unity カメラ操作がしたい

前回はキャラクターの動かし方をやったので、今回はプレイヤーに追従する操作可能なカメラを実装してみます。

↓前回↓
wakagamestudio.hatenablog.jp

↓今回できること↓

Unity Var.2019.3.4f1

①カメラにスクリプトを追加する

f:id:WakaiGames:20200903173303p:plain

  • 前回の続きでやっている方は、Playerの小構造から出しておきます。

②InputManagerの設定をする

f:id:WakaiGames:20200903175310p:plain

  • LStickでカメラの操作をするため、Inputの設定をします。

スクリプトの中身を書く

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraAction : MonoBehaviour
{
    [Header("カメラが向くターゲット")]
    [SerializeField]
    private GameObject target; //ターゲット

    [Header("回転するスピード")]
    [SerializeField]
    private Vector2 rotateSpeed;
    [Header("回転できる上限")]
    [SerializeField]
    private float rotateCeiling;//回転できる上限
    [Header("回転できる下限")]
    [SerializeField]
    private float rotateLower;  //回転できる下限
    [Header("スティックの入力制限")]
    [SerializeField]
    private float inputLimit;   //スティックの入力制限

    [Header("左右反転")]
    public bool LROpposite; //trueで反転
    [Header("上下反転")]
    public bool UDOpposite; //trueで反転

    private Vector3 beforePos;  //ターゲットの前位置

    private void Start()
    {
        //beforePosを初期化
        beforePos = target.transform.position;
    }

    private void Update()
    {
        //ターゲットが動いた分移動
        transform.position += target.transform.position - beforePos;

        //入力値を判定
        Vector3 angle = new Vector3(Input.GetAxis("HorizontalR") * rotateSpeed.x, Input.GetAxis("VerticalR") * rotateSpeed.y, 0) * Time.deltaTime;

        //カメラを回転させる
        //横回転
        if (LROpposite)
        {
            transform.RotateAround(target.transform.position, Vector3.down, angle.x);
        }
        else
        {
            transform.RotateAround(target.transform.position, Vector3.up, angle.x);
        }

        //縦回転
        if (UDOpposite)
        {
            if ((transform.localEulerAngles.x <= rotateCeiling || transform.localEulerAngles.x >= 360 + rotateLower)
                || (Input.GetAxis("VerticalR") >= inputLimit && transform.localEulerAngles.x < 360 + rotateLower && 180 <= transform.localEulerAngles.x)
                || (Input.GetAxis("VerticalR") <= -inputLimit && transform.localEulerAngles.x < 180 && rotateCeiling < transform.localEulerAngles.x))
            {
                transform.RotateAround(target.transform.position, transform.right, angle.y);
            }
        }
        else
        {
            if ((transform.localEulerAngles.x <= rotateCeiling || transform.localEulerAngles.x >= 360 + rotateLower)
                || (Input.GetAxis("VerticalR") <= -inputLimit && transform.localEulerAngles.x < 360 + rotateLower && 180 <= transform.localEulerAngles.x)
                || (Input.GetAxis("VerticalR") >= inputLimit && transform.localEulerAngles.x < 180 && rotateCeiling < transform.localEulerAngles.x))
            {
                transform.RotateAround(target.transform.position, -transform.right, angle.y);
            }
        }

        //beforePosを更新
        beforePos = target.transform.position;
    }
}

以上です。
次回はこれの拡張をしていこうと思います。