2017-11-16 1 views
2

Unity에는 Start, Awake, Update과 같은 동작을 구현하는 데 사용할 수있는 메서드 집합이 있습니다.이 메서드에는 액세스 수정자가 없으므로 C# 클래스에서는 비공개입니다.unity3D의 액세스 한정자 문제가 없습니다

저는 C#에서 리플렉션을 사용하지 않고 다른 클래스의 개인 메서드를 호출 할 방법이 없다는 것을 알고 있습니다.

public class TestClass : MonoBehaviour { 
    private void Start() { 
     // How is unity able to call this method if it's private and I'm not calling it anywhere 
    } 

    void Update() {  
    } 
} 

그래서 내 개인적인 질문에 어떻게 화합 할 수 있습니까? 그리고 그들은 단지 protected virtual이 아니므로 override을 사용할 수 있습니까?

+3

[이 블로그 게시물] (https://blogs.unity3d.com/2015/12/23/1k-update-calls/)에 질문에 대한 답변이 있습니까? – Milster

+0

@mjwills 이것이 90 %의 경우에 적용된다는 것에 동의하지만이 경우에는 아무런 차이가 없다고 생각합니다. – trebor

+0

@ Milster 정말 좋은 블로그 게시물 정확히 내가 뭘 찾고 있었는지 – trebor

답변

4

Unity 자체는 C++로 작성되었으며 사용자가 만든 스크립트에만 C#을 사용합니다. 문서의 어딘가에이 모든 "마법"메서드 (예 : Start(), Update() 등은 C++ 측에서이 "마법"메서드가있는 스크립트를 등록하여 호출됩니다.)이 메서드는 수정 된 액세스가 공개 또는

이러한 메서드가 보호되지 않는 이유는 내가 갖고있는 메서드가 적다는 것입니다. 성능은 향상됩니다. 스크립트에 Update() 메서드가 없으면 Unity는 ' 이 스크립트를 스크립팅 시스템에 등록해야하고 각 프레임을 호출 할 필요가 없습니다.

MonoBehaviour에서 파생 된 스크립트는 일반 C# 클래스와 비교할 때 엄청난 오버 헤드가 있습니다. C# 메모리를 제외한 모든 리소스 (그래픽, 게임 객체, 물리 등) 자체 (이 목적으로 모노 가비지 컬렉션 사용) 따라서 MonoBahaviour에서 파생 된 클래스를 가능한 적은 수의 일반 C# 클래스보다 선호하는 것이 좋습니다.

업데이트 : here은 의견에서 좋은 설명입니다.