유니티 생명주기 중 UPdate부분을 더 살펴보자.
Update의 종류로는 크게 3가지가 있다.
Update, FixedUpdate, LateUpdate 이 세 가지의 특징을 알아보자.
Update
업데이트의 특징은 매 프레임 호출 되며, 프레임 당 1번 호출 된다는 것이다.
사용자의 컴퓨터 사양에 따라 더 많이 호출될 수도 적게 호출될 수도 있다.
FixedUpdate
업데이트와 다르게 일정한 시간(0.02초가 기본값)마다 호출되는 특징이 있다.
고정 된 시간 간격으로 호출되기 때문에, 프레임 레이트와 상관없이 일정한 속도로 동작한다.
그래서 물리 연산에 사용된다.
LateUpdate
Update가 모두 호출된 후에 호출 된다는 특징이 있다.
다음으로는 Float와 int의 표현 가능한 수의 범위가 다른 이유에 대해 알아보자.
int의 표현 방식
int는 정수형 데이터를 표현하며, 모든 비트를 숫자를 정확히 표현하는데 사용한다.
32비트 정수형의 경우 부호를 위해 1비트를 사용하고, 남은 31비트로 값을 표현한다.
범위는 -2^31 ~ 2^31-1 이다. 이진법으로 수를 정확히 표현한다.
float은 부동소수점 형식으로, 실수를 저장하기 위해 사용한다.
마찬가지로 32비트 float의 경우 부호를 위해 1비트 사용하고, 8비트는 지수를 위해, 23비트는 가수를 위해 사용된다.
가수는 1.23같은(소숫점 이하의 요효숫자), 지수는 3 같은 형식으로 저장한다.
이진수로 정확히 표현할 수 없는 소수는 근사값으로 저장한다. 일부값은 반올림.
ui 띄우기
public abstract class ActiveUITrigger : MonoBehaviour
{
[SerializeField] protected LayerMask playerLayer;
protected virtual void OnTriggerStay(Collider other) { }
protected bool IsCollisionWithLayer(GameObject obj)
{
return ((1 << obj.layer) & playerLayer) != 0;
}
}
추상 클래스로 플레이어 레이어가 닿는지 확인 하는 함수를 만들어준다.
public class SelectStageTrigger : ActiveUITrigger
{
protected override void OnTriggerStay(Collider other)
{
if (IsCollisionWithLayer(other.gameObject))
{
UIManager.Instance.Show<UIPopupSelectStage>();
Cursor.lockState = CursorLockMode.None;
}
}
}
이런식으로 공통적인 로직(playerLayer와 IsCollisionWithLayer)을 추상 클래스에 정의하고, 이를 상속받아 구체적인 트리거 동작을 구현하였다.