본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 21일차

by LemongO 2024. 1. 22.

 

★[경] 우수 TIL  선정 [축]★ 

 

 

기회는 준비된 자에게 오는 법...

남은 캠프 기간도 열심히 해야겠지???

 

그런데 캠프가 12시간인데 사실 12시간 안 쉬고 풀 집중해도 시간이 모자란게 팩트...

 

 


DeltaTime / FixedDeltaTime / Update / LateUpdate / FixedUpdate

 

이걸 주제로 쓰는데 아직 뭔가 찜찜한 기분이다...

암튼 바로 가보자

 

 

먼저 겪은 문제이다.

드드드드듣드듣드드드드

 

카메라가 플레이어를 따라올 때, 스무스 효과를 주려고 했다.

결과적으로 따라오는건 잘 되는데 문제는 따라올 때 드드드드 거리는게 문제가 되었다.

잘 보이려나?

 

왜 문제일까???

 

곰곰히 생각해봐도 도저히 답이 나오질 않았다. 그래서 구글링을 해보았고

FixedUpdate를 쓰면 해결된다는 글을 보았다.

나는 LateUpdate를 쓰고 있었다.

 

아래는 사용된 코드

private void LateUpdate()
{        
    transform.position = Vector3.Lerp(transform.position, _playerTransform.position + Vector3.forward * -10, Time.deltaTime * _cameraSpeed);

    float limitX = Mathf.Clamp(transform.position.x, _borderLeftDown.x, _borderRightUp.x);
    float limitY = Mathf.Clamp(transform.position.y, _borderLeftDown.y, _borderRightUp.y);

    transform.position = new Vector3(limitX, limitY, -10);
}

 

 

그리고 바꾼 결과..

 

private void FixedUpdate()
{        
    transform.position = Vector3.Lerp(transform.position, _playerTransform.position + Vector3.forward * -10, Time.deltaTime * _cameraSpeed);

    float limitX = Mathf.Clamp(transform.position.x, _borderLeftDown.x, _borderRightUp.x);
    float limitY = Mathf.Clamp(transform.position.y, _borderLeftDown.y, _borderRightUp.y);

    transform.position = new Vector3(limitX, limitY, -10);
}

 

깔끔~

 

그렇다면 이것이 왜 그럴까~ 라는걸 생각해봤다.

참고로 플레이어 움직임은 FixedUpdate다.

 

카메라는 캐릭터 위치가 변경된 후니까 LateUpdate지!


문제를 겪기 전엔 아무생각없이 이렇게 생각했다.

실제로 부드러운 효과를 주지 않고 + 움직임이 Update에 들어가 있으면 이 방법이 맞다.

1. 캐릭터를 움직인다.

2. 카메라가 따라간다.

이렇게 해야 순차적으로 하기때문에 부드러운 연출이 가능하니까.

둘 다 Update 함수에 넣으면 둘 중 누가 먼저 호출될지 모르니 드드드 거림이 똑같이 일어난다.

 

그렇다면 부드러운 효과에서만 드드드 거리는 것인데, 왜 그럴까?

 

 

그냥 물리적인건 Fixed임 ㅋ


구글에서 찾은 글에 따르면 물리적 효과를 적용할 땐 FixedUpdate를 쓴다며 이렇게 쓰라고 했었는데

 

사실 난 물리적인걸 하는게 아니라 transform의 position만 변경시키는거라 그게 크게 의미가 있나? 싶었다.

 

그렇다면 좀 더 자세하게 파고 들어보자.

 

 

라이프사이클???


내가 처음에 생각했던건 유니티 라이프사이클이었다.

https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html#UpdateOrder

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

 

그와 동시에 "아니 그럼 LateUpdate 랑 별 상관 없는거 아냐?" 라고 생각했다.

 

그래서 이것 저것 마구마구 시도했다. 중요한건 정작 놓친채...

문제는 내가 Fixed 라는 것의 정의를 잘 모르고 있었던 건데 이상한곳에 포인트가 자꾸 잡혀있던 것이다.

 

Fixed

 

FixedUpdate 이던 FixedDeltaTime 이던 결국 Fixed, 고정된 간격이라는 것인데

이건 PlayerSetting - Time에 나와있다.

기본값이 0.02초 이다.

 

FixedUpdate는 0.02초 마다 실행되고, FixedDeltaTime은 뽑아보면 0.02초 이다.

FixedUpdate 함수 내부에서 DeltaTime은 FixedDeltaTime과 동일하게 0.02가 뽑히게 된다.

그렇다면 Update나 LateUpdate에서 FixedDeltaTime을 쓰면 되는걸까???

 

그건 또 아니다.

왜???

 

함수가 0.02초마다 호출 되는것과 0.02라는 고정된 값을 가지는것은 엄연히 다르다.

A 와 B 사이의 값을 일정하게 뽑아준다 한들, A의 움직임이 일정하게 달라질지라도

간격이 일정하지 않은 매 프레임 간 A 와 B 사이의 값을 뽑으면 어지러울거 같다.

그림으로 말하면 이런 느낌이 아닐까?

 

 

뭔가 표현이 이상한데 아무튼 이런 느낌인거 같다.

 

 

즉, 고정된 물체는 부드럽게 표현되는 것에는 변함 없지만

이동중인 물체에 대해선 그 다음 위치가 너무 일정치 않기 때문에 드드드 거림이 있는 것이다.