남용하지 않아야 한다는 말은 보통 Update 함수처럼 매프레임 호출되는 로직에서 사용하지 말라는 의미라고 보시면 됩니다. 그리고 필요한 오브젝트를 찾아서 사용하는 방법은 상황에 따라서 계속 달라질 수 있습니다. 물리적인 상황이라면 레이캐스트나, 콜라이더, 트리거의 충돌을 통해서 찾는 방법이 있을 수도 있고, 찾아놓고 계속해서 사용해야 되는 상황이라면 필요할 때마다 Find로 찾아서 쓰는게 아니라 처음에 한 번 찾을 때는 Find를 이용해서 찾은 다음 내부 변수에 저장해두고 계속해서 사용하는 방법등이 있을 수 있습니다.
UnityAction으로도 UnityEvent를 대체할 수 있는데 굳이 UnityEvent에 인자로서 넣어주는 이유는 무엇인가요? 단순히 직렬화되어 인스펙터 상에 노출될 수 있는 UnityEvent로 변환하기 위해서 인가요?? 그렇다면 애초에 UnityEvent를 선언하고 인자로 콜백메서드들을 넣어주면 되는 것이 아닌지요.. 왜 굳이 UnityAction을 한번 거쳐서 UnityEvent로 가야하는지 이해가되질 않습니다.
우선 UnityEvent를 사용하는 이유는 말씀하신대로 인스펙터에 직렬화되어 노출되게 하기 위해서 사용하는 것입니다. 만약 인스펙터에 노출할 필요가 없다면 UnityAction만 사용해도 충분하죠. UnityAction을 한번 거쳐서 UnityEvent로 넣은 이유는 직렬화를 위해서 코드에서 직접 등록해줄 때 사용되는 AddListener 함수의 기본 인자의 타입이 UnityAction이라 영상에서는 일부러 변환해서 보여드렸습니다 말씀하신대로 그냥 메서드를 곧바로 넣어주셔도 문제는 없습니다.
기본적인 기능은 같지만 차이점이 있습니다. Action은 System 네임스페이스에 속하며 기본 C#에서 제공되는 것이고 UnityAction은 UnityEngine.Events 네임스페이스에 속하며 유니티에서 제공되는 것입니다. 그리고 UnityAction은 UnityEvent의 AddListener 함수의 매개변수로 넣을 수 있지만 Action은 불가능하죠. UnityAction이 유니티 기능들과 함께 사용하기에는 더 좋습니다.
군더더기 없는 이 깔끔함은 대체 무엇?
정말 감사합니다 베르님
쉽고 핵심적인 강의 영상 감사합니다! 혹시 유료 가입하면 더 디테일한 강의도 볼 수 있을까요?
멤버십은 후원 용도라 더 디테일한 유료 강의는 따로 없습니다.
원하시는 내용의 강좌가 있다면 아래의 디스코드 채널의 강의요청 방에서 신청하실 수 있습니다.
문제라면 대기중인 강좌 요청이 180개 정도 된다는 것 뿐입니다. ㅎㅎ
discord.gg/tqmRTy4pgk
이 영상이 정말 도움이 많이 됩니다
베르형. 델리게이트나 액션에서 호출할때
1. 델리게이트명 or 액션명() /////
2. 델리게이트명 or 액션명.Invoke() ////
1번하고 2번하고 똑같은거임?? invoke 생략가능한거임??? 아님 성질이 다른거임?
베르형 사랑행
1번이 2번의 생략 형태라고 보면 될 듯 합니다.
베르님 유니티 이벤트를 사용해서 플레이어가 죽으면 몬스터 애니메이션 상태가 대기로 변하게 하려하는데
유니티 이벤트에 몬스터를 등록하면 해당 객체만 실행되는것 같은데, 이럴때는 어떻게 하나요?
매니저 객체를 만들어서 플레이어를 등록해두고 몬스터의 객체가 그것을 통해 접근해서 플레이어의 상태를 감시하는 것은 어떨까요?
@@wergia 게임 매니저 객체를 만들어서 플레이어가 죽을시 유니티 이벤트를 사용해, 게임 매니저의 함수를 호출하고 해당 함수에서 FindObjectsOfType로 모든 몬스터 객체들을 찾아 State를 idle로 변환 시키는걸로 하기는 했는데 별로일까요?
@@GalaxySquareRoot 몬스터 객체가 너무 많지 않다면 나쁘지 않을 것 같습니다. 어차피 플레이어가 죽을 때만 한 번 발동되는 기능이라...
하지만 최적화를 따지자면 몬스터들도 매니저에 등록시켜서 호출하는게 좋을 듯합니다.
@@wergia 몬스터들을 매니저에 등록시킨 다는게, 어떻게 하는건지 설명해주실수 있나요?
@@GalaxySquareRoot 매니저에서 몬스터 리스트를 만들어두고 몬스터가 생성되면 Start 함수에서 매니저를 찾아서 그 리스트에 자기 자신을 넣어주면 됩니다.
Find 함수들을 남용하지 않아야 하는데 사용해야 한다면 find함수말고 다른 방법은 없을까요?
남용하지 않아야 한다는 말은 보통 Update 함수처럼 매프레임 호출되는 로직에서 사용하지 말라는 의미라고 보시면 됩니다.
그리고 필요한 오브젝트를 찾아서 사용하는 방법은 상황에 따라서 계속 달라질 수 있습니다.
물리적인 상황이라면 레이캐스트나, 콜라이더, 트리거의 충돌을 통해서 찾는 방법이 있을 수도 있고,
찾아놓고 계속해서 사용해야 되는 상황이라면 필요할 때마다 Find로 찾아서 쓰는게 아니라 처음에 한 번 찾을 때는 Find를 이용해서 찾은 다음 내부 변수에 저장해두고 계속해서 사용하는 방법등이 있을 수 있습니다.
@@wergia그렇군요 자세히 알려주셔서 감사합니다
FindObjectOfType 안쓰면 어떤방식으로 해야 되나요??
미리 캐싱해두고 사용하는 것이 좋습니다.
함수 관리자라 봐도 무방하네요 ㅇㅁㅇ ! 감사합니다~
와 이거 찾고있었는데 감사합니다!
UnityAction으로도 UnityEvent를 대체할 수 있는데 굳이 UnityEvent에 인자로서 넣어주는 이유는 무엇인가요?
단순히 직렬화되어 인스펙터 상에 노출될 수 있는 UnityEvent로 변환하기 위해서 인가요??
그렇다면 애초에 UnityEvent를 선언하고 인자로 콜백메서드들을 넣어주면 되는 것이 아닌지요..
왜 굳이 UnityAction을 한번 거쳐서 UnityEvent로 가야하는지 이해가되질 않습니다.
지금 다시 생각해봤는데, 매개변수에 메서드를 넣어주려면 애초에 매개변수 타입이 delegate 여야 하기 때문에 여러 delegate 중 UnityAction을 쓴 것 뿐인가요??
우선 UnityEvent를 사용하는 이유는 말씀하신대로 인스펙터에 직렬화되어 노출되게 하기 위해서 사용하는 것입니다.
만약 인스펙터에 노출할 필요가 없다면 UnityAction만 사용해도 충분하죠.
UnityAction을 한번 거쳐서 UnityEvent로 넣은 이유는 직렬화를 위해서 코드에서 직접 등록해줄 때 사용되는 AddListener 함수의 기본 인자의 타입이 UnityAction이라 영상에서는 일부러 변환해서 보여드렸습니다
말씀하신대로 그냥 메서드를 곧바로 넣어주셔도 문제는 없습니다.
@@wergia 최고입니다
인스펙터가 깔끔해지네요!
와우
와 찾던 정보인데 . 고맙습니다`
귀에 쏙쏙
Action과 UnityAction이 어떻게 다른건지 좀 알려주시면 감사하겠습니다
보기엔 같아 보이는데 차이점을 모르겠네요
기본적인 기능은 같지만 차이점이 있습니다.
Action은 System 네임스페이스에 속하며 기본 C#에서 제공되는 것이고
UnityAction은 UnityEngine.Events 네임스페이스에 속하며 유니티에서 제공되는 것입니다.
그리고 UnityAction은 UnityEvent의 AddListener 함수의 매개변수로 넣을 수 있지만 Action은 불가능하죠.
UnityAction이 유니티 기능들과 함께 사용하기에는 더 좋습니다.
@@wergia 요근래 질문이 많았는데 답변을 잘해주셔서 도움이 많이 됬습니다
잘 봤어요~!