아래 게이가 꼬여서 다시 만들었다길레
생각나서 간만에 좆같은 윾니티 켜서 내가 만들어 쓰는 템 하나 뽑아 옴.
개발 내용이 많아지고 신파일에 오브젝트가 많아질수록
없던 버그도 생기고 원인도 잘 모르겠지???
다양한 이유가 있겠지만, 흔하게 발생하는 이슈는 스크립트 디펜던시 문제일 가능성이 커
특정 메소드 호출할 때 가장 쉬운 방법은 인스펙터에 변수 노출시키고, 다른 게임 오브젝트의 스크립트 인스턴스 걸고 쓰는 건데
마구 남발하면 전체 플로우가 꼬이는 것뿐만 아니라 문제가 발생했을 때 대처하기도 어려워
나중에 수정하려고 할 때 스크립트의 소스코드도 봐야 하고, 스크립트에 걸린 오브젝트도 따라가서 봐야 하지
한두 개 정도면 모르겠는 이런 디펜던시 이슈들이 많아지면 재사용이 어려워지고,
벌레 하나 잡으려고 초가삼간을 다 태우는 아찔한 상황이 오는 거지
뭐 하나 고쳤는데 사이드 이펙트 팡팡 터지면 노답 아오.. ㅅㅂ 윾니티
그래서 난 글로벌메시지 만들어서 스크립트의 메소드를 호출해
이런 방법이 가장 좋은 방법이라고 말할 수는 없지만
초보 게이에겐 한번 생각해볼 내용이라 공유함
최대한 오브젝트 디펜던시를 줄이고, 윾파게티 코드가 되지 않도록 하기 위해서지
빈 프로젝트 만들고 요거 받아서 임포트 해봐
Demo 신파일에 사용 예제를 넣었어
이건 Demo 신파일의 내용인데
Message Sample 1 오브젝트에는 Attribute 예제 콤포넌트가 발라져 있고,
Message Sample 2 오브젝트에는 Mono 예제 콤포넌트가 발라져 있어
Global Message Manager는 GlobalMessageManager 콤포넌트가 발라져 있는데 이 녀석이 신 파일의 메시지를 수집해서 등록하고 관리함. 꼭 필요한 녀석
Tester에는 테스트 코드가 들어가 있어
신을 플레이하면 이런 버튼이 나오는데
버튼을 눌러보면 콘솔창에 로그가 찍힐 거야. 암튼 메소드를 어떻게 등록하느냐~~ 하면
우선 먼저 Message Sample 2 오브젝트를 보면 하위에 10개의 오브젝트가 만들어져 있는데
이름만 다르고 모두 같은 콤포넌트로 구성되어 있어
MonoBehaviourSample 콤포넌트에 Name이라는 메소드가 있고, 그 메소를 호출할 별명으로 NAME을 설정하고, 타겟 오브젝트를 걸면 됨
어디서든 저 Name이라는 메소드를 호출할 수 있어 호출하는 방법은
이렇게만 쓰면 저 오브젝트 10개의 콤포넌트가 동시에 호출됨. 메소드의 반환 값을 받을 수 있고
파라미터 넘기면서 호출하려면 이렇게~
호출 방법은 Tester.cs 참고
이것뿐만 아니라 코드 레벨에서 직접 설정할 수도 있어.
메시지를 등록하고 싶은 메소드 위에 애트리뷰트를 설정하면 됨. AttributeSample.cs 참고
메소드 위에 애트리뷰트만 걸어주면, GlobalMessageManager 가 알아서 수집해줘
애트리뷰트의 첫번째는 호출할 이름이고, 두번째는 파라미터를 안 넣었을 때 호출하는 기본값이야. 파라미터와 파라미터 사이는 '|' 로 구분해야 하고,
기본 값은 안 넣어도 되지만, 디폴드 설정 안 되어 있는 메시지를 파라미터 없이 호출하면 에러남.
주의할 것은 같은 콤포넌트 안에는 이름이 중복되면 안 돼. 다른 콤포넌트에 같은 이름을 등록해도 상관없음. 이름도 같고, 파라미터 형식도 같으면 동시에 호출함.
이름이(매소드 이름 말고 메시지 이름) 같아도 형식이 다르면 호출 안 됨.
잘 알겠지만, 직접 인스턴스 접근해서 메소드 호출하는 것보다. 많은 비용이 발생하고, 실행속도도 느려
빈번하고 빠르게 호출해야 하는 메소드에 사용하면 답답할 거야. 그러나~~
UI같이 서로 복잡하게 엮여 있으면서 신속한 실행이 아닌 호출 개념으로 러프한 요소에 사용하면 좋아.
대략적인 설명은 이렇고, 함 둘러봐
초보 게이들 좆같은 윾 때문에 고생하는 거 같아서 이런 방식도 있으니 한번 시험해봤으면 해서 공유해.
맘대로 고쳐쓰고, 커스텀해서 사용해도 되는데
이거 사용해서 발생한 문제에 대한 책임은 각자에게 있다는 것만 알고 있으면 됨. (웃음)
닥추+와드!! : 메세지 관리자
나도 메시지 기반 방식 좋아함. 객체들간에 커플링 줄이는데 한몫해주거든. 물론 장점만 있냐하면 같은 이벤트를 수신하고 있는 애들간에 처리 순서가 정리될 필요가 있는데 이거 관리하는게 좀 까다로움. A,B둘다 동일한 이벤트를 수신 중인데 그 다음 로직에서는 B가 A의 갱신된 정보를 기준으로 움직여야 한다던지
델리게이트가 편하지 않냐 - dc App