Engine/Unity

[Unity] SendMessage(), BroadcastMessage() 안 쓰는 이유

VirtualDever 2022. 9. 15. 22:03

유니티 공식 스크립팅 API에 따르면, 아래와 같은 코드로 SendMessage()를 활용하고 있다.

무척 유용해 보이지만 성능 상의 이유로 잘 쓰지 않는다.

 

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        // Calls the function ApplyDamage with a value of 5
        // Every script attached to the game object
        // that has an ApplyDamage function will be called.
        gameObject.SendMessage("ApplyDamage", 5.0);
    }
}

public class Example2 : MonoBehaviour
{
    public void ApplyDamage(float damage)
    {
        print(damage);
    }
}

https://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html

 

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

공식 문서에는 이런 성능 문제에 대한 언급은 없다.

책 [유니티 C# 스크립팅 마스터하기]에 따르면,

내부적으로 C#의 리플렉션(reflection)이라는 기능에 의존한다. 문자열을 이용해 함수를 부르면, 애플리케이션은 실행 중에 스스로를 살펴보고 실행할 코드를 찾는다. 이런 과정은 일반적인 방법으로 함수를 실행할 때보다 무거운 연산을 필요로 한다. 그렇기 때문에 SendMessage와 BroadcastMessage의 사용을 최소화하도록 한다.