아래 게이가 꼬여서 다시 만들었다길레


생각나서 간만에 좆같은 윾니티 켜서 내가 만들어 쓰는 템 하나 뽑아 옴.




개발 내용이 많아지고 신파일에 오브젝트가 많아질수록


없던 버그도 생기고 원인도 잘 모르겠지???


다양한 이유가 있겠지만, 흔하게 발생하는 이슈는 스크립트 디펜던시 문제일 가능성이 커


특정 메소드 호출할 때 가장 쉬운 방법은 인스펙터에 변수 노출시키고, 다른 게임 오브젝트의 스크립트 인스턴스 걸고 쓰는 건데


마구 남발하면 전체 플로우가 꼬이는 것뿐만 아니라 문제가 발생했을 때 대처하기도 어려워


나중에 수정하려고 할 때 스크립트의 소스코드도 봐야 하고, 스크립트에 걸린 오브젝트도 따라가서 봐야 하지


한두 개 정도면 모르겠는 이런 디펜던시 이슈들이 많아지면 재사용이 어려워지고,


벌레 하나 잡으려고 초가삼간을 다 태우는 아찔한 상황이 오는 거지



뭐 하나 고쳤는데 사이드 이펙트 팡팡 터지면 노답 아오.. ㅅㅂ 윾니티



그래서 난 글로벌메시지 만들어서 스크립트의 메소드를 호출해


이런 방법이 가장 좋은 방법이라고 말할 수는 없지만


초보 게이에겐 한번 생각해볼 내용이라 공유함


최대한 오브젝트 디펜던시를 줄이고, 윾파게티 코드가 되지 않도록 하기 위해서지


빈 프로젝트 만들고 요거 받아서 임포트 해봐


Demo 신파일에 사용 예제를 넣었어



a04424ad2c06782ab47e5a67ee91766dc289f1ecd7acc7c9bf13d0c359d2d121b6aee422bd1450a1d96c9e282e

이건 Demo 신파일의 내용인데


Message Sample 1 오브젝트에는 Attribute 예제 콤포넌트가 발라져 있고,

Message Sample 2 오브젝트에는 Mono 예제 콤포넌트가 발라져 있어

Global Message Manager는 GlobalMessageManager 콤포넌트가 발라져 있는데 이 녀석이 신 파일의 메시지를 수집해서 등록하고 관리함. 꼭 필요한 녀석

Tester에는 테스트 코드가 들어가 있어


신을 플레이하면 이런 버튼이 나오는데


a04424ad2c06782ab47e5a67ee91766dc289f1ecd7acc7c9bf13d0c353d0de2162f9ea9e46b415700a4f7cb24f


버튼을 눌러보면 콘솔창에 로그가 찍힐 거야. 암튼 메소드를 어떻게 등록하느냐~~ 하면


우선 먼저 Message Sample 2 오브젝트를 보면 하위에 10개의 오브젝트가 만들어져 있는데

a04424ad2c06782ab47e5a67ee91766dc289f1ecd7acc7c9bf13d0c15ad1df214120317cc72448626dbf59a176

이름만 다르고 모두 같은 콤포넌트로 구성되어 있어



a04424ad2c06782ab47e5a67ee91766dc289f1ecd7acc7c9bf13d0c15ad2d0215a43cdf1adac23b54aa4faf86d36


MonoBehaviourSample 콤포넌트에 Name이라는 메소드가 있고, 그 메소를 호출할 별명으로 NAME을 설정하고, 타겟 오브젝트를 걸면 됨


어디서든 저 Name이라는 메소드를 호출할 수 있어 호출하는 방법은


GlobalMessage.Send("NAME")


이렇게만 쓰면 저 오브젝트 10개의 콤포넌트가 동시에 호출됨. 메소드의 반환 값을 받을 수 있고


파라미터 넘기면서 호출하려면 이렇게~


GlobalMessage.Send("CALC_ADD1", new object[]{10, 100, 10});


호출 방법은 Tester.cs 참고




이것뿐만 아니라 코드 레벨에서 직접 설정할 수도 있어.


메시지를 등록하고 싶은 메소드 위에 애트리뷰트를 설정하면 됨. AttributeSample.cs 참고


[MessageAttribute("CALC_ADD1", "1|1|1")]
public int IntegerAdd(int _param1, int _param2, int _param3)
{
return _param1 + _param2 + _param3;
}


메소드 위에 애트리뷰트만 걸어주면, GlobalMessageManager 가 알아서 수집해줘


애트리뷰트의 첫번째는 호출할 이름이고, 두번째는 파라미터를 안 넣었을 때 호출하는 기본값이야. 파라미터와 파라미터 사이는 '|' 로 구분해야 하고,


기본 값은 안 넣어도 되지만, 디폴드 설정 안 되어 있는 메시지를 파라미터 없이 호출하면 에러남.





주의할 것은 같은 콤포넌트 안에는 이름이 중복되면 안 돼. 다른 콤포넌트에 같은 이름을 등록해도 상관없음. 이름도 같고, 파라미터 형식도 같으면 동시에 호출함.


이름이(매소드 이름 말고 메시지 이름) 같아도 형식이 다르면 호출 안 됨.




잘 알겠지만, 직접 인스턴스 접근해서 메소드 호출하는 것보다. 많은 비용이 발생하고, 실행속도도 느려


빈번하고 빠르게 호출해야 하는 메소드에 사용하면 답답할 거야. 그러나~~


UI같이 서로 복잡하게 엮여 있으면서 신속한 실행이 아닌 호출 개념으로 러프한 요소에 사용하면 좋아.




대략적인 설명은 이렇고, 함 둘러봐


초보 게이들 좆같은 윾 때문에 고생하는 거 같아서 이런 방식도 있으니 한번 시험해봤으면 해서 공유해.


맘대로 고쳐쓰고, 커스텀해서 사용해도 되는데


이거 사용해서 발생한 문제에 대한 책임은 각자에게 있다는 것만 알고 있으면 됨. (웃음)