[면접대비] Unity(2)
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
Rigidbody는 중력, 힘, 속도 등 물리 연산을 적용하기 위한 컴포넌트이고, Collider는 객체의 충돌 영역을 정의하는 컴포넌트입니다.
Rigidbody는 Unity의 3D 물리 시스템, Rigidbody2D는 2D 물리 시스템에서 사용합니다. 두 시스템은 별도로 동작하기 때문에 2D와 3D 물리 컴포넌트를 혼용해 충돌시킬 수 없습니다.
Collision은 실제 물리 충돌과 반응이 발생하지만, Trigger는 물리적으로 막지 않고 객체가 영역에 들어오거나 나가는 이벤트만 감지합니다.
OnCollisionEnter는 일반 Collider끼리 물리적으로 충돌했을 때 호출되고, OnTriggerEnter는 Is Trigger가 설정된 Collider 영역에 다른 Collider가 들어왔을 때 호출됩니다.
isKinematic을 활성화하면 Rigidbody가 힘이나 중력에 의해 움직이지 않고 스크립트나 애니메이션 등을 통해 제어됩니다. 다만 Collider를 통한 충돌 감지는 활용할 수 있습니다.
transform.position을 직접 변경하면 물리 시스템을 거치지 않고 위치를 변경하는 반면, Rigidbody.MovePosition은 Rigidbody의 이동으로 처리됩니다. 물리 객체를 이동시킬 때는 보통 FixedUpdate에서 MovePosition을 사용합니다.
FixedUpdate는 프레임 속도와 관계없이 고정된 시간 간격을 기준으로 실행되므로 물리 연산을 일정한 주기로 처리할 수 있습니다. Unity의 물리 시뮬레이션도 이 고정 시간 간격을 기준으로 동작합니다.
특정 위치에서 특정 방향으로 가상의 광선을 발사해 Collider와 충돌하는지 검사하는 기능입니다. 사격 판정, 바닥 감지, 상호작용 등에 사용할 수 있습니다.
Raycast가 검사할 Layer를 제한하여 원하는 객체만 충돌 검사할 수 있도록 합니다. 불필요한 Collider 검사를 줄이고 정확한 판정을 만드는 데 사용합니다.
총알처럼 빠르게 움직이는 객체가 한 프레임 사이에 Collider를 통과하는 터널링 현상을 방지해야 할 때 사용합니다.
Coroutine은 작업을 한 번에 끝내지 않고 yield를 통해 실행을 중단했다가 이후 프레임이나 특정 조건 이후에 이어서 실행할 수 있도록 Unity에서 제공하는 기능입니다.
아닙니다. Coroutine은 별도의 스레드를 생성하는 것이 아니라 일반적으로 Unity의 메인 스레드에서 실행되며, yield를 통해 작업을 여러 프레임에 나누어 처리하는 방식입니다.
현재 Coroutine의 실행을 중단하고 다음 프레임에 이어서 실행하겠다는 의미입니다.
WaitForSeconds는 Time.timeScale의 영향을 받는 게임 시간을 기준으로 기다리고, WaitForSecondsRealtime은 timeScale의 영향을 받지 않는 실제 시간을 기준으로 기다립니다.
StopCoroutine이나 StopAllCoroutines를 호출하거나 Coroutine을 실행한 GameObject가 비활성화되거나 파괴되면 중단됩니다. 해당 MonoBehaviour의 enabled만 false로 바꾸는 것으로는 Coroutine이 중단되지 않습니다.
Coroutine을 시작한 방식과 맞는 방식으로 중단해야 합니다. 관리가 필요한 Coroutine은 반환된 Coroutine 객체를 저장해 두고 StopCoroutine에 전달하는 방식이 명확합니다.
Update는 매 프레임 직접 상태와 시간을 검사해야 하지만, Coroutine은 yield를 이용해 특정 시간이나 조건까지 실행을 중단할 수 있어 순차적인 시간 기반 로직을 표현하기 편합니다.
Coroutine은 Unity의 프레임 흐름에 맞춰 작업을 나눠 실행하는 데 적합하고, async/await는 비동기 작업의 완료를 기다리는 C# 기능입니다. 둘 다 기다림을 표현할 수 있지만 별도 스레드를 자동으로 생성하는 것은 아닙니다.
ScriptableObject는 GameObject에 붙이지 않고 독립적인 Asset으로 데이터를 저장할 수 있는 Unity 클래스입니다. 주로 아이템, 스킬, 몬스터 같은 게임 데이터를 관리할 때 사용합니다.
MonoBehaviour는 GameObject에 Component로 붙어서 생명주기와 동작을 담당하지만, ScriptableObject는 GameObject 없이 Asset으로 존재하며 주로 데이터 저장과 공유에 사용됩니다.
여러 GameObject가 동일한 데이터를 참조할 수 있어 데이터 중복을 줄이고, 데이터를 코드나 Scene과 분리해 Inspector에서 쉽게 관리할 수 있다는 장점이 있습니다.
아이템이나 스킬 등의 데이터를 Asset 단위로 관리할 수 있어 코드 수정 없이 Inspector에서 값을 조정할 수 있습니다. 또한 여러 객체가 같은 데이터를 공유할 수 있어 유지보수에도 유리합니다.
[SerializeField]는 private 필드도 Unity의 직렬화 대상에 포함시켜 Inspector에 노출할 수 있도록 하는 Attribute입니다. 외부 코드의 접근은 제한하면서 Inspector에서 값을 설정할 수 있습니다.
둘 다 Inspector에 표시될 수 있지만 public은 다른 클래스에서도 접근할 수 있습니다. [SerializeField] private은 외부 접근을 제한하면서 Inspector에서 설정할 수 있어 캡슐화를 유지할 수 있습니다.
Unity는 직렬화할 수 있는 타입에 제한이 있으며 일반적인 프로퍼티나 지원되지 않는 타입은 기본적으로 직렬화되지 않습니다. 사용자 정의 클래스도 [Serializable] 등의 조건을 만족해야 직렬화할 수 있습니다.
Unity 면접 대비 입력, 카메라/이동/AI, 에셋/빌드
Unity 면접 대비 렌더링/그래픽, 메모리/최적화
Unity 면접 대비 애니메이션, UI