모든 상황에 대해서 Character가 정보를 다 가지고 있는것은 힘들다.
또한 특정상황일 때 SkeletalMesh에 접근을 해서 애니매이션 불러와서 재생하는게 학원에서도 많이 가르치고 직관적이기는 하지만 성능 떨어진다. + 복잡하다.
그래서 UE에서 추천하는 방법과 강의에서 하는 방법은 Anim Class를 따로 만들어서 관리를 하는 것이다.
C++ Anim에서 데이터를 몰빵해서 관리를 해야함.
근데 누군가는 접근을 해서 데이터 (변수)를 조절하거나 뭐 해야됨.
나중에 인공지능에서도 막 사용함.
먼저 아래처럼 AnimIstance를 만든다.
그리고 아래처럼 애니매이션 블루프린트를 만들어준다.
다른 클래스에서 anim c++클래스 접근해서 값을 수정하고 막 하면은 곂치거나 막 그럴 수 있다. 뒤섞이고 막.
Anim c++클래스에서 다른 클래스에 접근하는게 일반적인 방법이다.
UE의 입력시스템 호출 다 한다음에
Mycharacter나 그런거의 컨텐츠 로직을 다 실행한다음에
NativeUpdateAnimation같은 애니매이션 Update를 함수를 호출을 한다.
Super 키워드 부모 클래스 말하는거임.
c++ 클래스로 이동같은거 만들고
블루프린트 클래스로 전에 만든 C++클래스 상속받아서 애니매이션 같은 부분 블루프린트로 작업을 한다.
모든 상태에서 대해서 bool값으로 다 처리를 할 수 가 없다.
그래서 어떠한 "상태"에서만 정해진 로직이 흘러가도록 하면은 훨씬 관리가 쉬워서 state machine이란거 사용한다.
이런거 만들어준 적없는데 IsFalling같은거 다 있음. FPS게임에서 이런거 자주 사용하니까.
이게Ground state machine이다.
이게 Jump state machine이고
이게 "룰"임.
중간에 Loop Animation비활성화로 한다음에 JumpEnd끝났을 때 자동으로 다음 애니매이션 넘어가게 하는게
Automatic Rule Based On 머시기임.
뭔가 예술에서 쓰는거임.
애니매이션 편집해서 새로운 애니매이션 만들거나 그런거
Mesh ->
뭐뭐뭐
이런식으로 원하는 애니매이션 드래그해서 붙인다음에 오른쪽에 끝시간조절해서 빠르기? 조절할 수 있음.
이렇게 만든다음에
아까만든 애니매이션 c++로 돌아가서 생성자 만들어준다음에 몽타주만들었던 부분 컨트롤 + c로 경로 복사후
이렇게 연결해준다.
그리고 나중에 Action발생하면 호출할 함수도 만들어 줌.
이 함수안에 Montage_IsPlaying이나 Montage_play이런거는 몽타주 재생할 대 사용하는 애니매이션이라는 정도로 기억을 하면됨.
Montage_IsPlaying은 이미 재생중인 경우를 체크하는 함수임. false일 때만 Montage_Play를 하겠다 라는 것임.
이제 MyCharacter에서 이 애니매이션cpp에 있는거 호출할 수 있도록 연결해주어야함.
GetAnimInstatnce는 일반적인 UAnimInstance를 받는 함수이다. 우리는 MyAnimInstance를 받기를 원하는 것임.
그래서 막 이딴 식으로 캐스팅해서 호출하면된다.
근데 이게 끝이 아니라
여기서 몽타줄 틀려면 한가지 더 설정을 해야함.
이거 연결을 같이 낑겨 주어야함.
꼭 여기서 해야하는것은 아님. Ground State들어가서 넣어주어도 됨. Ground상태에서만 해야한다면(일단은 그냥 넣음)
DefaultSlot은 하나만 있어야 하는것은 아님.
C#은 Delegate가 기본 문법으로 지원을 하는데 C++ 고대 화석 쓰레기 유물급 언어라 그딴거 없고
언리얼에서 지원한 template 막 써가지고 야매로 만든 Delegate가 있음.
C#문법이랑 같기는함. Action받을 함수의 시그니처를 똑같이 맞춰 주어야함.
OnAttackMonatgeEnded가 Action받을 함수임.
시그니처를 UAnimMontage랑 bool맞춰 주어야함.
이런 애니매이션 동작에 맞춰서 피격연산이나 사운드같은 처리를 할경우
그래서 특정 애니매이션의 어느 시점에서 "Notify"라고 하는 특정 알람을 주면은 된다.
몽타주에만 있는 것은 아니고 다른 애니매이션에도 있다.
새 노티파이 추가해서 이렇게 가능함.
지금
c++클래스 만든다음에 이녀석을
애가 상속함.
그래서 C++파일로 가서 노티파이 추가하면 되는데 그냥 막 하는게 아니라
이렇게 AnimNotify_노티파이 이름 이렇게 맞춰 주어야함.
평타 모션이 3개인 경우 어떻게 구현을 할까?
새 몽타주 섹션으로 이름 이렇게 만듦.
링크 제거로 끊을 수 있음.
뭐 이럴때 쓴다?? (아직 무슨말인지 잘 모르겠음..)
이딴식으로 FName반환하는 함수 만들어주도록 하자. FString에다가 * 붙이면 FName으로 변환 된단다.
그리고..
JumpToSection이라는 함수 만들어주고 아까 GetAttackMontageName함수를 FName Name으로 받아주자.
그리고 Montage_하면 Montage_JumpToSection이라는 함수 있는데 여기다가 Name, AttackMontage넣어 주도록 하자.
그리고 AMyCharacter에서는
Attack함수가 호출되면은 PlayerAttackMontage 호출 하고 AnimInstance에 JumpToSection함수 호출한다.
그럼 여기서 몽타주 섹션 찾아서
인덱스 번호에 맞게 점프하고
AttackIndex를 하나 늘림.
이후 프젝 실행해서 공격하면 공격할 때마다 평타 모션 바뀌면서 공격함.
굿굿 끝.
FPS게임 기준 옆으로 걷는다거나 막 그런부분들 처리할 때
애니매이션 블렌드 사용함
이거 1D랑 일반 블렌드 스페이스랑 엄청 크게 차이는 없다.
먼저 아래처럼 블렌드 스페이스 만들어준다.
말 그대로 공간을 섞는다.
그리고 아래처럼 가로축, 세로축 이름 정해준다.
그러면 이렇게 16칸 생김.
그리고
애니매이션을 이렇게 다 넣어줌. 각 축에 맞게
그리고 저장한다음에
일로 넘어와서
아까 만들어준 BS_Move넣어준다.
Anim cpp에 이딴값 넣어주고
캐릭터에서도
이딴 값넣어준 뒤
UpDown, LeftRight에서 Value를 받아준다.
그리고 매틱 호출되는 NaiveUpdate에서 Vertical, Horizontal 값을 받아옴. 이거에 따라서 BS_Move가 적절한 값에 따라서동작을 할 것임.
굿굿
아 그리고 중간에 보간하는 부분
Interpolation 0.1로 해주어야 애니매이션 뚝뚝 안 끊김.