★[경] 우수 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
그와 동시에 "아니 그럼 LateUpdate 랑 별 상관 없는거 아냐?" 라고 생각했다.
그래서 이것 저것 마구마구 시도했다. 중요한건 정작 놓친채...
문제는 내가 Fixed 라는 것의 정의를 잘 모르고 있었던 건데 이상한곳에 포인트가 자꾸 잡혀있던 것이다.
Fixed
FixedUpdate 이던 FixedDeltaTime 이던 결국 Fixed, 고정된 간격이라는 것인데
이건 PlayerSetting - Time에 나와있다.
FixedUpdate는 0.02초 마다 실행되고, FixedDeltaTime은 뽑아보면 0.02초 이다.
FixedUpdate 함수 내부에서 DeltaTime은 FixedDeltaTime과 동일하게 0.02가 뽑히게 된다.
그렇다면 Update나 LateUpdate에서 FixedDeltaTime을 쓰면 되는걸까???
그건 또 아니다.
왜???
함수가 0.02초마다 호출 되는것과 0.02라는 고정된 값을 가지는것은 엄연히 다르다.
A 와 B 사이의 값을 일정하게 뽑아준다 한들, A의 움직임이 일정하게 달라질지라도
간격이 일정하지 않은 매 프레임 간 A 와 B 사이의 값을 뽑으면 어지러울거 같다.
그림으로 말하면 이런 느낌이 아닐까?
즉, 고정된 물체는 부드럽게 표현되는 것에는 변함 없지만
이동중인 물체에 대해선 그 다음 위치가 너무 일정치 않기 때문에 드드드 거림이 있는 것이다.
'스파르타 내배캠' 카테고리의 다른 글
스파르타 내배캠 Unity 3기 23일차 (2) | 2024.01.25 |
---|---|
스파르타 내배캠 Unity 3기 22일차 (2) | 2024.01.23 |
스파르타 내배캠 Unity 3기 20일차 (0) | 2024.01.19 |
스파르타 내배캠 Unity 3기 19일차 (0) | 2024.01.18 |
스파르타 내배캠 Unity 3기 18일차 (0) | 2024.01.17 |