프로젝트뷰에 스크립트를 하나만들고 이름을 FollowCam으로 변경한다.

다음 코드를 입력한다.

[Range(2.0f,20.f)]는 다음줄의 퍼블릭 변수의 범위를 지정해준다.

LateUpdate()는 모든 Update()함수가 실행되고 난 후에 호출되는 함수다. 이 함수는 주인공캐릭터가 이동을 완료한후 카메라를 이동시키기위해 사용된다.

Camera의 위치를 Player의 뒤쪽으로 이동시킨다. 이때 카메라의 높이도 약간 올려준다.

LootAt()이라는 함수로 Camera를 Rotate시킨다. 이때 시선을 약간 위로하기 위해 조정이 필요해서 Vector3.up을 더해 줬다

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

public class FollowCam : MonoBehaviour
{
    // Start is called before the first frame update
    public Transform targetTr;
    private Transform camTr;
    [Range(2.0f, 20.0f)]  //따라갈 대상으로 부터 떨어질 거리
    public float distance = 4.0f;
    [Range(0f, 10.0f)] // Y축으로 이동할 높이
    public float height = 2.0f;
    void Start()
    {
        camTr= GetComponent<Transform>();  // 자신의 Transform참조를 camTr에 저장
    }

    // Update is called once per frame
    void LateUpdate()
    {   //추적해야할 대상의 뒤쪽+위쪽 으로 이동
        camTr.position = targetTr.position + -targetTr.forward * distance + Vector3.up* height;
        camTr.LookAt(targetTr.position+Vector3.up);  //Camera를 피봇 좌표를 향해 회전
    }
}

코드를 하이라키의 Main Camera에 적용하고. Main Camera의 Inspector>FollowCam Scriptor컴포넌트에 Palyer를 끌어다 놓는다.

오 카메라가 캐릭터 뒤에서를 잘따라 다닌다. 점도 부드럽게 이동시키기 위해 시간간격을 추가해 보겠다.

 

Vector3.Lerp, Vector3.Slerp

선형보간(Linear Interpolation)과 구면 선형보간(Spherical Linear Interpolatoin)은 시작점과 끝점 사이의 특정 위치의 값을 추정할 때 사용한다.이러한 보간 함수는 현재 값을 목표값으로 변경할 때 갑자기 변경하지 않고 부드럽게 변경시키는 로직에 많이 활용된다.

Lerp는 선형보간 함수를 제공하며 Vector3, Mathf, Quaternion, Color구조체에서 사용할 수 있다.

Vector3.Lerp(시작좌표, 종료좌표, t);
Mathf.Lerp(시작좌표, 종료좌표, t);
Quaternion.Lerp(시작좌표, 종료좌표, t);

Slerp는 구형 선형 보간함수를 제공하며 Vector Quaternion에서 사용할수 있다.

 

FollowCam 스크립트를 Slerp를 사용하는 방식으로 수정한다.

        Vector3 pos = targetTr.position + -targetTr.forward * distance + Vector3.up* height;
        camTr.position = Vector3.Slerp(camTr.position, pos, Time.deltaTime*damping);

이전에는 Player의Position을 직접Camera에 넣어 무조건 따라붙게 만들었는데 이번에는 Vector3.Slerp(camTr.position, pos, Time.deltaTime*damping);가 천천히 따라 붙게 만든다 서있으면 카메라가 천천히 따라오다 서는 걸 느낄수 있다.

실제 실행시켜보면 Slerp는 Lerp에 비해 시작과 끝에서 좀더 반응속도가 빠르다.

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

public class FollowCam : MonoBehaviour
{
    // Start is called before the first frame update
    public Transform targetTr;
    private Transform camTr;
    [Range(2.0f, 20.0f)]  //따라갈 대상으로 부터 떨어질 거리
    public float distance = 4.0f;
    [Range(0f, 10.0f)] // Y축으로 이동할 높이
    public float height = 2.0f;
    public float damping = 10.0f;
        void Start()
    {
        camTr= GetComponent<Transform>();  // 자신의 Transform참조를 camTr에 저장
    }

    // Update is called once per frame
    void LateUpdate()
    {   //추적해야할 대상의 뒤쪽+위쪽 으로 이동
        Vector3 pos = targetTr.position + -targetTr.forward * distance + Vector3.up* height;
        camTr.position = Vector3.Slerp(camTr.position, pos, Time.deltaTime*damping);
        camTr.LookAt(targetTr.position+Vector3.up);  //Camera를 피봇 좌표를 향해 회전
    }
}

 

Vector3.SmoothDamp

부드럽게 이동하는 방법중 Vector3.SmoothDamp도 있다. 많이 사용된다. 가까워질수록 느려진다.

SmoothDamp(시작벡터, 목표벡터, 현재속도, 도달시간)

소스를 다음과 같이 고쳐보자 플레이해보면 엄청 늦게 따라간다. Slerp의 시간은 진행시간이고 smoothDamp의 시간은 이동에 걸리는 시간이라 작아야 빨라진다. 인스펙트뷰 에서 bumping 변수를 0.1로 하면 빨라진다. 1정도로 해도 멋진 장면이 연출된다.

velocity 는 ref 키워드로 참조를 전달하는데, Debug.Log 로 값을 찍어보면 지속적으로 갱신되는 속도값을 얻고, 다음 프레임에 다시 전달하고 있다는 걸 알 수 있습니다.

 

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

public class FollowCam : MonoBehaviour
{
    // Start is called before the first frame update
    public Transform targetTr;
    private Transform camTr;
    [Range(2.0f, 20.0f)]  //따라갈 대상으로 부터 떨어질 거리
    public float distance = 4.0f;
    [Range(0f, 10.0f)] // Y축으로 이동할 높이
    public float height = 2.0f;
    public float damping = 10.0f;
    private Vector3 velocity = Vector3.zero;
        void Start()
    {
        camTr= GetComponent<Transform>();  // 자신의 Transform참조를 camTr에 저장
    }

    // Update is called once per frame
    void LateUpdate()
    {   //추적해야할 대상의 뒤쪽+위쪽 으로 이동
        Vector3 pos = targetTr.position + -targetTr.forward * distance + Vector3.up* height;
        //camTr.position = Vector3.Slerp(camTr.position, pos, Time.deltaTime*damping);
        camTr.position = Vector3.SmoothDamp(camTr.position, pos, ref velocity, damping);
        camTr.LookAt(targetTr.position+Vector3.up);  //Camera를 피봇 좌표를 향해 회전
    }
}

보간

Unity의 보간 함수를 사용하면 주어진 두 점 사이의 값을 계산할 수 있습니다. 이러한 각 함수는 상황에 맞게 다른 방식으로 작동합니다. 자세한 내용은 각각의 예제를 참조하십시오.

+ Recent posts