기타

혼자 포폴하면서 느낀점 - 2

추운날_너를_기다리며 2024. 6. 24. 22:55

1. UI를 만들기 위해서 UIManager를 만들어서 UI가 공통적으로 가져야하는 기능이 있는데 그것을 IUI 인터페이스라는 형태로 만들어 둘 것입니다.
UIManager는 Singleton이어야 합니다.
그 이유는 게임 Scene에서 Unity API Logic을 따라서 뭔가를 수행할게 있는 것이 아니기 때문입니다.
2. UIMonoBehaviour는 아무튼 UI이기 때문에 내가만든 IUI인터페이스와 MonoBehaviour를 상속받고 UI는 기본적으로 Canvas 위에 만들 것이기 때문에 Canvas를 무조껀 요구컴포넌트로 등록해야한다.
Canvas에다가 하는 이유는 Canvas에 Sort Order가 있다.
3. OnStateEnter 함수는 SubStateMachine에 진입하는게 아니라 SubStateMachine안에 있는 특정 State에 진입했을 때 그 진입한 애니메이터와 해당 애니메이터의 정보와 layerIndex같은 것을 반환해줍니다.
4. OnStateMove는 Transition이 일어날때 발생합니다.
5. OnStateMachineEnter는 SubStateMachine으로 넘어갈 때 호출이 됩니다.
6. 여기서 중요한 것은 이러한 함수들을 사용해서 특정 애니메이션의 머신이 잘 동작하는지 체크를 할 것입니다. 
그런데 내가 원하는 머신이 어떤건지에 대해서 미리 알아야 되잖아요.
이 머신이 어떤건지에 대해서 고유 ID를 부여해놓고 그 ID에 해당하는 머신이 동작이 어떻게 되는지 다 체크를 해야합니다.
즉, Move, Jump, Fall, Land가 있으면은 이 각각의 Hash ID를 생성해서 부여하고 이 이벤트들이 발생을 할때 이 AnimatorStateInfo stateInfo에 보면은 어떤 Hash Id의 Machine인지가 넘어옵니다.
그래서 Hash ID를 비교해가지고 현재 어떤 ID를 가진 StateMachine이나 State가 동작하고 있는지 그런것들을 감지를 할 수 있습니다.
7. BehaviourTreeForCharacter는 캐릭터에 대한 게임 오브젝트나 Transform RigidBody Animator 등을 캐싱해놓고 사용하려고 만들었습니다.
그리고 AnimatorWrapper Class를 만들었습니다.
AnimatorWrapper Class를 만든 이유는 특정 상태또는 특정 상태 머신이 정상적으로 끝났는지 체크 또는 모니터링 하기 위해서 입니다.
그다음 행동트리에서 Player의 Action을 구현하기 위해서 MotionCommand라는 행동을 구현하고 있었습니다.
8. Gravity를 쓰려면 RigidBody를 Cashing 해줘야 한다.
9. IEnumerable은 class를 foreach loop를 사용하여 반복순회할때 사용한다.
IEnumerable interface는 하나의 메소드만 가지고 있다.
GetEnumerator() : IEnumerator interface를 반환한다.
IEnumerator interface는 2개의 메소드와 하나의 속성을 가지고 있다.
MoveNext() : 다음 요소로 이동한다.
Reset() : 열거 순서를 처음으로 되돌린다.
Current : 현재 요소를 반환한다.
10. ICollection interface는 IEnumerable Interface를 상속받는다.
public interface ICollection : System.Collections.IEnumerable
IEnumerable interface는 collection에 몇개의 요소가 있는지 제공하지 않았지만, ICollection Interface는 추가 속성을 제공한다.
Count
IsSynchronized
SyncRoot
CopyTo(Array, Int32)
GetEnumerator() : IEnumerable에서 상속됨
11. IList Interface는 ICollection, IEnumerable Interface를 모두 상속받는다.
public interface IList : System.Collections.ICollection
IList Interface는 요소의 추가와 삭제를 허용한다.
또한 index로 item에 접근하는 기능도 제공한다.
앞의 2 Interface보다 강력하다.
IsFixedSize
IsReadOnly
Indexer
Count : ICollection에서 상속됨
Add(Object)
Clear()
Contains(Object)
Indexof(Object)
Insert(Int32, Object)
Remove(Object)
RemoveAt(Int32)
CopyTo(Array, Int32) : ICollection에서 상속됨
GetEnumerator() : IEnumerable에서 상속됨
IList Interface는 one Indexer를 갖고 있고, 어느 위치의 요소로든 접근할 수 있고, 요소를 추가하고, 어느 위치의 요소든 삭제가 가능하다.