학원

15일차 - 2024-08-20

하타라시 2024. 8. 20. 19:16

유니티의 애니메이션 시스템 즉, 메카님은 FSM과 연관이 있습니다.

A > B > C > D가 루프라고 가정할 때에, 특정 상황에서 E가 되는 것입니다. 

실제로 메카님즉 유니티의 애니메이션과 연관이 있는데,

Unity에서의 실제 FSM 구현에 대해 (tistory.com)

[Unity] 메카님 시스템 : 네이버 블로그 (naver.com)

 

밑에 스택 오버플로에서 가져온 이미지입니다. 별거아닌 행동에도 난잡해지는 보입니다.

c# - Unity의 메카님 애니메이션 - 스택 오버플로 (stackoverflow.com)

 

복잡해지는 경우 대처방안이 있는데,

1. 최대한 이쁘게 정리하게

잘 알려주지 않는 메카님(Mecanim) 기법 : 네이버 블로그 (naver.com)

2. Behavior Tree사용 이라고 이해하였습니다.

Behavior Tree를 알아봅시다 (linecorp.com)

 

 

 

유니티 생명 주기(라이프 사이클) 입니다.

기본적으로 기억해둘만 한것은 저정도라고 이해했습니다.

OnEnable이나 Disable도 있습니다.

OnEnable은 거의 시작쯤에 실행됩니다.

OnDisable은 거의 마지막에 실행됩니다.

https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html

https://docs.unity3d.com/kr/2019.4/uploads/Main/monobehaviour_flowchart.svg

 

 

결국 저는 Awake는 GetComponent같이 초기화에 관한 것.

Start는 값을 넣는 부분

Update는 또 다른 클래스와 통신을 해야할때에 필요한 것을 넣기로 이해했습니다.

 

해당 형태의 이유는 만약 Test라는 스크립트를 A,B,C에 넣었다고 가정할 때,

먼저 실행된 것부터 Awake -> Start -> Update의 한 루틴을 돌아야하지만,

실제로는 A에서 Awake -> B에서 Awake -> A에서 Start -> C에서 Awake 이런 형태일 수도 있기때문에 그렇습니다.

 

 

NGUI와 UGUI에 관한 부분입니다.

기존에 유니티 GUI는 애매했기때문에 외부 플로그인으로 만든 것을 활용했었는데 ,

그것이 NGUI이며, UGUI는 유니티에서 공식적으로 있는 기능입니다.

https://badakprogramming.tistory.com/68

 

 

MonoBehaviour이 있을 때와 없을 때의 차이점입니다.

MonoBehaviour을 상속 받지 않았기 때문에 당연히 불러오지 못합니다.

있을 경우는 성공적으로 불러와집니다.

 

그러나 using UnityEngine;이 있기때문에 앞에 GameObject를 붙이면 성공적으로 불러와집니다.

즉 Instantiate는 GameObject 클래스에 포함된다는 의미입니다.

 

 

해당 라인을 실행하게 되면 obj에는 Enemys가 들어갈 것입니다.enemy에 obj의 첫번째 자식의 transform을 넣었기때문에 transform.parent하면 enemy의 부모를 부른다거나 활용이 무긍무진합니다.

 

그러나 GameObject.Find는 컴퓨터의 자원을 많이 먹기 때문에 되도록 안쓰는 것이 좋다고 이해했습니다.

 

테스트 용으로 하였기때문에 간단하게 하였습니다. 이러면  Item으로 업캐스팅이 가능하기 때문에 활용이 편리하여집니다.

 

ex) Item heal = new Heal();

heal.Use();

결과

Heal 아이템 사용

 

 

 

이런식으로 분명 Item에 있는 PlayParticle인데 사용이 가능하다거나 

부모의 생성자를 구현한다거나,,

abstract로 되어있는 부분을 오버라이드하거나.. 상속이라는 것이 그대로 상속받아도 되고, 오버라이드해도되고, 활용하기 어려운 것 같습니다.

 

 

Resources.Load하면 해당 폴더를 기점으로 불러오고,추가로 타입이 GameObject로 일치하기 때문에 Test_Shield를 성공적으로 불러올 것입니다.

https://docs.unity3d.com/kr/current/ScriptReference/Resources.Load.html

공식문서에 보면 다양한 타입으로 불러오는 모습입니다.

 

 

요번엔 AnimationEvent를 좀 더 심화적으로 배웠습니다.

중간에서 AnimationEvent가 실행되고, 마지막 점에서 끝 처리를 해주는 방식입니다.

추가로 Float , Int , String, Object에 값을 입력한것의 정보를 볼 수 있습니다.

파라미터를 AnimationEvent 변수명으로 받아와서 해당 값을 볼 수 있습니다.

만약 int intValue 혹은 string stringValue로하면 한 개의 값을 불러 올 수 있습니다.

 

 

배열을 통하여 응용한 버전입니다.

Enemys를 찾습니다.

그 이후 enemies의 배열 크기를 obj의 크기로 합니다.

for문 + GetChild(i)를 통하여 gameObject를 불러옵니다.

 

 

추가로 Resources폴더에 있는 Explosion도 불러옵니다.

 

 

딕셔너리입니다. 번역과 비슷하듯 key와 value로 이루어져집니다.,

딕셔너리에 데이터를 넣기위해서 리스트와 동일하게 Add를 사용합니다.

그러나 파라미터가 두 개 이므로 위와 같은 형태로 사용된 것입니다.

 

위와 같이 eee가 없을경우 새로 추가도 가능하며,

 

foreach문과 KeyValuePair을 통해 key와 value출력.

그리고 딕셔너리에 직접적으로 접근!

Remove와 Keys를 통해 키값을 불러오고 직접적으로 딕셔너리에 접근하는 형태도 가능합니다.

 

인덱서(Indexer)라는 친구입니다.

배열처럼 []형태로 접근 가능하도록 도와줍니다.

https://velog.io/@wjdgh9577/C-%EC%9D%B8%EB%8D%B1%EC%84%9CIndexer

 

리스트도 딕셔너리랑 비슷한데, 약간 차이가 있으므로,, 추후 한 번에 다룰 예정입니다.

https://programmingdev.com/unityc-list%EC%99%80-dictionary%EB%A5%BC-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90/

 

 

이로써 Enemys의 적군을 불러와서 딕셔너리에 저장하고,

반복문을 통해 Item클래스에 있는 Use라는 추상메소드를

상속받으면서 Use를 재정의한 Use라는 메소드를 실행 하게됩니다.

추후 제작할 게임에 다소 적용시키면 깔끔하게 정리할 수 있을 것 같습니다.




감사합니다.