내가 일하며 알게 된 프로그래밍
article thumbnail
Published 2023. 11. 3. 09:46
Unity - SendMessage 프로그래밍/Unity3D

유니티 개발을 하다보면 다른 스크립트의 함수 호출을 필요로 할 때가 있다.

유니티 Doc를 확인하면 SendMessage를 통해서 다른 함수를 호출 할 수 있다. 라고 말해주지만

 

Unity - Scripting API: GameObject.SendMessage

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

일단 결론을 말하자면 SendMessage는 사용하지 않는게 좋다.

 

왜?

 

SendMessage 함수는 UnityEngine.Component 클래스의 기능으로 함수 호출을 할 수 있는 기능이다

SendMessage의 오버로딩

SendMessage의 특징 중 하나는 호출할 함수명을 문자열(string)로 지정한다는 것이다.

SendMessage("MethodName", value);

하지만 이 방법은 함수명에 오타를 내도 컴파일 에러를 발생시키지 않기때문에  버그를 유발하기 쉽다.

 

추가로 응답을 받는 Component 객체(GameObject)에 연결된 모든 스크립트 컴포넌트를 검색하고

Reflection을 사용해서 SendMessage에서 지정한 이름과 일치하는 함수를 찾을 수 있지만

오버헤드를 발생 시킬 수 있다.

 

**Reflection(리플렉션)의 주요 기능: 

  • 타입 정보 확인 : 클래스, 구조체, 인터페이스 등 타입을 체크 할 수 있다.
  • 인스턴스 생성 : 특정 타입의 인스턴스를 동적으로 생성할 수 있다.
  • 메서드 호출 : 특정 메서드를 동적으로 호출할 수 있다.
  • 속성 및 필드 조작 : 클래스의 속성과 필드 값을 읽기, 쓰기 할 수 있다.

리플렉션은 필요한 경우엔 매우 유용하지만 오버헤드를 발생시킬 수 있기때문에

최적화를 생각한다면

  • 타입 정보를 미리 캐싱
  • GetComponent를 사용하여 함수 호출

등 여러가지 방법을 사용하는 것을 권장한다.

profile

내가 일하며 알게 된 프로그래밍

@CtrlVGames