【Unity】Virtual Camera의 시점 조작을 스크립트로 실시한다 【Cinemachine】


이 문서는 유니티 찬 라이센스 조항에서 제공됩니다.

유니티 찬 1.2.1
Unity2019.3.1

하고 싶은 일



게임패드의 왼쪽 아날로그 스틱으로 캐릭터를 움직여 오른쪽 아날로그 스틱으로 카메라의 시점(비추는 방향)을 조작하고 싶다(액션 게임 등이기도 하다).


거친 흐름



추종:Virtual Camera의 Follow와 LookAt에 대상의 오브젝트를 첨부하면 마음대로 추종해 준다.
시점 조작 : Virtual Camera의 Bias와 Follow Offset의 값을 스크립트로 변경함으로써 실현.
※시점을 조작함으로써 플레이어가 의식하는 좌표계와 월드 좌표계가 다르기 때문에 보정을 해야 한다.

Virtual Camera 설정



1. Virtual Camera를 Hierarchy에 추가



Window > Package Manager에서 Cinemachine을 가져온 후 Cinemachine > Create Virtual Camera를 선택합니다.

2. Virtual Camera가 캐릭터를 따라가도록 설정



Follow(쫓는 대상)와 LookAt(주시하는 대상)에 객체를 첨부.


3. Body 설정




Input Axis Name을 비우는 것으로 마우스로 마음대로 시점 조작되지 않게 한다.

4. 시점의 각도 등을 좋은 느낌으로 설정





5. Bias와 Follow Offset



Body의 Bias와 Follow Offset을 만나면 카메라의 시점이 캐릭터를 중심으로 변화하고 있는 것을 알 수 있습니다.
[비아스]

[Follow Offset]


이 Bias와 Follow Offset을 스크립트에서 조작합니다.

스크립트에서 Virtual Camera를 조작하여 시점 회전


using Cinemachine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class test : MonoBehaviour
{
    [SerializeField] private Animator _animator;
    private float moveSpeed = 7f;

    private CharacterController _characterController;
    [SerializeField] private CinemachineVirtualCamera _camera; //エディタでVirtual Cameraをアタッチ
    private CinemachineOrbitalTransposer _transposer;
    private Transform _transform;

    private Vector3 _moveVelocity;
    private Vector3 world_moveVelocity;
    private Vector3 _cameraRotation;

    void Start()
    {
        _characterController = GetComponent<CharacterController>();
        _transposer = _camera.GetCinemachineComponent<CinemachineOrbitalTransposer>();
        _transform = transform;

        _moveVelocity = Vector3.zero;
        world_moveVelocity = Vector3.zero;
        _cameraRotation = Vector3.zero;
    }

    void Update()
    {
        world_moveVelocity = Vector3.zero;
        _moveVelocity = Vector3.zero;

        _cameraRotation.x = Input.GetAxisRaw("Horizontal2");
        _cameraRotation.z = Input.GetAxisRaw("Vertical2");

        if (_cameraRotation.magnitude >= 0.1)
        {
            _transposer.m_Heading.m_Bias += _cameraRotation.x * 3f; //Biasを操作
            _transposer.m_FollowOffset.y -= _cameraRotation.z / 8f; //Follow Offsetを操作

        }

        _moveVelocity.x = Input.GetAxisRaw("Horizontal1") * moveSpeed;
        _moveVelocity.z = Input.GetAxisRaw("Vertical1") * moveSpeed;

        if (_moveVelocity.magnitude >= 0.01)
        {
            //座標系の補正
            world_moveVelocity = Quaternion.AngleAxis(_transposer.m_Heading.m_Bias, Vector3.up) * _moveVelocity;

            Vector3 targetPositon = _transform.position + world_moveVelocity;
            //向かせたい方向
            Quaternion targetRotation = Quaternion.LookRotation(targetPositon - _transform.position);

            _transform.rotation = Quaternion.Slerp(_transform.rotation, targetRotation, 0.2f);
        }

        _characterController.Move(world_moveVelocity * Time.deltaTime);

        _animator.SetFloat("Speed", new Vector3(_moveVelocity.x, 0, _moveVelocity.z).magnitude);

    }
}

Horizontal1과 Vertical1은 왼쪽 아날로그 스틱(이동)의 축으로, Horizontal2와 Vertical2는 오른쪽 아날로그 스틱(시점)의 축.

1. Bias와 Follow Offset



Bias와 Follow Offset은 다음과 같이 조작할 수 있습니다.
[SerializeField] private CinemachineVirtualCamera _camera;
_transposer = _camera.GetCinemachineComponent<CinemachineOrbitalTransposer>();
_transposer.m_Heading.m_Bias += _cameraRotation.x * 3f; //Biasを操作
_transposer.m_FollowOffset.y -= _cameraRotation.z / 8f; //Follow Offsetを操作

2. 좌표계 보정



Bias를 조작하여 수평 방향으로 시점을 회전시키면, 플레이어가 의식하는 좌표계와 월드 좌표계에 Bias분의 각도의 차이가 생깁니다.

플레이어가 오른쪽 이동을 입력했을 때, 상정하는 거동은 적색의 화살표 방향으로의 이동인데,
우상의 월드 좌표계의 x축(적) 방향으로의 이동이 되어 버린다.

이동 입력 벡터를 y축 주위에 Bias분만큼 회전시킴으로써 해결할 수 있다.
//座標系の補正
world_moveVelocity = Quaternion.AngleAxis(_transposer.m_Heading.m_Bias, Vector3.up) * _moveVelocity;

참고 링크



Cinemachine 공식 참조

좋은 웹페이지 즐겨찾기