1. GameObject.SetActive = false는
해당 컴포넌트와 자식 오브젝트를 모두 비활성시킴과 동시에 더 이상 업데이트나, 다른 유니티 이벤트를 받지 않게 된다.
이는 렉시컬 스코프 내에서 코드의 물리적 위치와 무관하게 적용되는 것으로 (추정. setActive = false가 되면서 기존의 상호작용 메시지를 끊어버리는 건지, 아니면 setActive 전환하는 코드가 우선순위가 매우 높은건지는 모르겠음)
setActive = false로 돌리는 순간, 해당 컨텍스트에 있는 코드들은 실행여부를 보장 할 수 없다. (실제로는 실행되는데, 육안으로 확인할 수 없을 정도로 빠른건가 생각도 해봤는데, Debug.log로도 안찍히는걸 봐서는 실제 실행되지도 않는듯)
( *참고 : 채찍피티의 견해 )
이게 왜 문제였냐...하면은 내 게임 오브젝트는 체력이 다 닳았을 시, Dead 애니메이션을 실행시키고 active를 false로 전환하는데,
active = false로 하자마자 Dead 애니메이션을 실행시키지 않고, 그대로 뻗어버리는 사건이 발생했다.
그러면 어떻게 해야하느냐, 바로 비활성화 시키는 함수 ( 이하 Dead )를 애니메이터에서, 사망 애니메이션이 끝나는 시점에서 실행시킬 수 있도록 해줘야한다.
animator.SetBool로 Dead 프로퍼티를 true로 만들어 Dead 애니메이션을 실행시킨다.
사진은 없는데, 애니메이터에는 Dead가 true가 될 시 Dead 애니메이션이 실행되도록 고속도로를 뚫어놓은 상태
그리고 이 시발놈의 Dead 함수를
애니메이션을 더블클릭해서 열리는 이 창에서, Time Cursor를 함수를 실행 시킬 시점으로 이동 시키고 ( 이 경우에서는 애니메이션이 끝나는 1초 지점)
왼쪽 파란색 동그라미 친 Add Event를 클릭해 오브젝트의 함수를 트리거할 수 있게 해준다.
이후 인스펙터에서 실행시키고 싶은 함수 (Dead)를 연결 해주면 끝.
--> 요렇게 애니메이터에서 함수를 실행시키도록 했으니, 동일한 로직을 사용하는 애니메이터에 모두 반복해서 이 작업을 해줘야한다.
애니메이터에서 함수의 실행이 가능하다는 것은, 함수의 실행이 스크립트에서만 가능한게 아니라, GUI에서도 가능하다는 점에서 큰 의미를 갖는다.
지금 예제에서는 Dead 애니메이션이 끝날 때 Dead 함수를 실행시켰는데, 0.5s에 GameObject에서 스프레이트에서 피가 튀기는 효과를 내는 함수를 실행시켜 피가 튀기는 애니메이숀 + 사망 애니메이션을 합쳐서 더 역동적인 애니메이션을 만들수도 있겠다는 생각이 들었다. 이러한 방식을 사용한다면 개발자가 준비해야하는 애니메이션의 수가 획기적으로 줄어들테니, 개발력을 대폭 절감할 수 있겠지.
2. UI -> Canvas에 올려져있는 요소는 Scale with screen size 를 켜줘야지 모든 화면에서 균일한 사이즈로 보인다
화면에 Text( Legacy)를 띄운 상태. 근데 그냥 이대로 두면 뷰포트의 크기에 따라 텍스트가 실제로 차지하는 크기가 달라진다.
그래서 요렇게 Canvas Scaler -> Scale With Screen Size로 전환해줘야지 모든 환경에서 동일한 사이즈를 둘 수 있다.
** 다른 옵션은 어떻게 써먹을 수 있을지 궁금하다
3. 스크립트에 [Header]와 같이 인스펙터의 형상을 다르게 볼 수 있게 해주는 그레이 매터를 삽입 할 수 있다.
이렇게 해더라고 삽입해주면 \n을 경계로 해서 각 프로퍼티들을 깔끔하게 볼 수 있다.
매우 만족스럽다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
회사가 바쁘니까 퇴근하고 유니티 켜는 것도 일이네...
사이드로 겜개하는 모든 사람들 다 리스펙한다 진짜
애니메이션 이벤트 노가다 빡쎌텐데... 애니메이터 사용하면 StateMachineBehaviour 사용 할 수 있고 헤더 쪽은 추가로 리치텍스트 적용 할 수도 있음