주녘공부일지

[Unity3D] Camera 본문

GameEngine/UnityEngine - Class

[Unity3D] Camera

주녘 2022. 3. 1. 19:01
728x90

Camera

엔진 상의 Main Camera 오브젝트의 컴포넌트로 존재하는 class CameraController

에디터에서 설정한 _player 오브젝트를 카메라가 따라가게 만드는 로직

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

public class CameraController : MonoBehaviour
{
    [SerializeField] Define.CameraMode _mode = Define.CameraMode.QuaterView;
    [SerializeField] Vector3 _delta = new Vector3(0f, 6f, -5f); // 초기값
    [SerializeField] GameObject _player = null;

    void LateUpdate()
    {
        if (_mode == Define.CameraMode.QuaterView)
        {
            transform.position = _player.transform.position + _delta; // 위치 셋팅
            transform.LookAt(_player.transform); // 회전 셋팅 (플레이어 좌표 주시)
        }
    }
}

카메라를 이동시키는 로직이 Update()에 들어가면 Input값에 따른 플레이어 이동도 Update()에서 실행되기 때문에 호출되는 순서가 랜덤으로 실행되어 매 프레임마다 플레이어가 이동하면 카메라가 따라가야 하는데, 플레이어가 이동하기 전에 카메라가 이동하고 플레이어를 이동시키는 경우 (호출 순서) 덜덜 떨리는 현상이 발생 -> 이를 해결하기 위해서 LateUpdate()문으로 선언

 

즉, LateUpdate()문은 Update()문 실행 이후에 실행되는 Update()문임

https://psh50zmfhtm.tistory.com/13

 

[Unity] Monobehaviour Life Cycle 파헤치기

유니티에서 하나의 스크립트는 그 자체로 하나의 클래스(Class)를 뜻하며, 그 중 Behaviour는 활성화(Enable), 비활성화(Disable) 할 수 있는 Component를 의미합니다. 유니티에서 흔히 볼 수 있는 MonoBehaviour.

psh50zmfhtm.tistory.com

 

 


CameraController 확장

플레이어가 다른 물체(ex.벽)에 의해 안 보이면 보이는 위치까지 카메라가 플레이어에게 가까워짐

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

public class CameraController : MonoBehaviour
{
    [SerializeField] Define.CameraMode _mode = Define.CameraMode.QuaterView;
    [SerializeField] Vector3 _delta = new Vector3(0f, 6f, -5f); // 초기값
    [SerializeField] GameObject _player = null;

    void LateUpdate()
    {
        if (_mode == Define.CameraMode.QuaterView)
        {
            RaycastHit hit;
            if (Physics.Raycast(_player.transform.position, _delta, out hit, _delta.magnitude, LayerMask.GetMask("Wall")))
            {
                float dist = (hit.point - _player.transform.position).magnitude * 0.8f;
                transform.position = _player.transform.position + _delta.normalized * dist;
            }
            else
            {
                transform.position = _player.transform.position + _delta; // 위치 셋팅
                transform.LookAt(_player.transform); // 회전 셋팅 (플레이어 좌표 주시)
            }
        }
    }
}

 

Tip) 메인 카메라 오브젝트를 선택하고 단축키 Ctrl+Shift+F를 누르면  씬에서 보고있는 화면을 메인 카메라가 비추게 만듬

728x90

'GameEngine > UnityEngine - Class' 카테고리의 다른 글

[Unity] Animation Blending  (0) 2022.03.23
[Unity] StateMachineBehaviour  (0) 2022.03.23
[Unity3D] Physics.Raycast (+LayerMask)  (0) 2022.02.24
[Unity3D] Collision (충돌)  (0) 2022.02.23
[Unity3D] Rotation (회전)  (0) 2022.02.21