답변:
업데이트 호출 방법
아니요, Unity는 System.Reflection을 사용하여 호출 할 때마다 마법 메서드를 찾지 않습니다.
대신, 주어진 유형의 MonoBehaviour에 처음 액세스 할 때 스크립트 방법 (Mono 또는 IL2CPP)을 통해 기본 스크립트를 검사하여 매직 메소드가 정의되어 있고이 정보가 캐시되는지 여부를 검사합니다. MonoBehaviour에 특정 메소드가있는 경우 적절한 메소드에 추가됩니다. 예를 들어 스크립트에 Update 메소드가 정의되어 있으면 매 프레임마다 업데이트해야하는 스크립트리스트에 추가됩니다.
게임 중에 Unity는 이러한 목록을 반복하고 간단한 목록에서 메소드를 실행합니다. 또한 이것이 Update 메소드가 공용인지 개인용인지 중요하지 않은 이유입니다.
이 방법으로 수행 되는 이유 에 대해서는 DMGregory의 답변 을 크게 참조 할 것입니다.이 두 가지 경쟁 항목의 균형으로 요약됩니다.
새로운 개발자는 그냥 작동하기를 원하고 "이벤트 시스템에 어떻게 연결합니까?"를 알아 내고 싶지 않습니다. 그러나 최소한의 오버 헤드로 여전히 빠르게 실행됩니다.
이 두 가지 제약 조건에서 달성 할 수있는 최상의 솔루션 일 것입니다 . 또는 적어도 Unity 개발자 팀이 그 당시에 생각해 낸 최고의 능력. 우리는 알지 못할 수도 있습니다.
MonoBehaviour 기본 클래스에서 메소드를 추상으로 정의하고 서브 클래스가 강제로 구현하도록 할 수 있습니다.
Unity가 사용하는 시스템의 장점 중 하나는 모든 MonoBehaviour 메시지를 구현할 필요가 없으며 60 개가 넘는 메시지 가 있습니다 .
일반적으로 이러한 방법 중 하나 또는 소수만 필요합니다. 일부는 카메라 또는 파티클 시스템에 고유 한 2D / 3D 물리에 고유하기 때문에 스크립트 하나에 모두 필요한 것은 거의 없습니다.
필요하지 않은 메시지를 구현되지 않은 상태로두면 런타임에 "이 객체에서 OnCollisionStay2D를 호출하는 것을 귀찮게하지 않아도됩니다"라는 신호를 명확하게 알릴 수 있습니다.
이것은 실질적인 효율성 승리 일 수 있습니다. 이제 엔진은 모든 장면을 구성하거나 물리 이벤트에만 반응하는 ~ 200 개의 오브젝트가 아니라 내 프레임에서 ~ 20 개의 오브젝트에만 커스텀 업데이트 로직이 필요한 오브젝트에서만 Update를 호출하도록리스트를 필터링 할 수 있습니다.