본문 바로가기

3D_FPS

08_12 Player 애니메이션 구현. Move, Attack, CrossFade

목차


Float Parameter 로 Player 애니메이션 구현

 

애니메이션에 대해서 알아 보자!

 

플레이어가 사용할 모델을 하나 가져와 보자!

이거 다운 !!

 

프리팹 입힘
애니메이터 컨트롤러 새로 생성

우리가 새로 만들거니까, 애니메이터 컨트롤러 생성한다.

새거 하나를 만듦
애니메이터에 만든 컨트롤러를 넣은 모습

 

애니메이션 블록이 없어서 가라 앉음
이거 선택해서
넣은 모습

 

 

float 파라미터를 설정하자!

Float 파라미터 만들기

이름은 Speed로!

 

0 이 아니라, 0.1 로 하자.

Idle 에서 Move로 갈때는

 

0.1 보다 크게! (근사치 이용)

 

(참고) int 와 float 의 차이

더보기

float 이 이렇게 되는거 알고있나요??

완벽한 90 이 안될 때가 있음

float 이 이렇게 되니까.

 

https://smile2x.tistory.com/entry/%EA%B0%99%EC%9D%80-4byte-int%EC%99%80-float%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

같은 4byte int와 float의 차이

int형과 float형은 둘 다 4바이트로 자료형의 크기가 같은데 실제로 표현될 수 있는 값은 왜 그렇게 큰 차이가 나는 것일까? int, float 자료형의 bit구조를 알기전까지는 위와 같은 의문을 가진바가

smile2x.tistory.com

 

설명)))

이건 빨간줄
이건 됨!

 

오버플로우. 주전자와 그릇
인트값을 flaot 에 넣으면 됨, 하지만 역은 안됨!

음 float 이 더 크구나!

근데 둘다 4바이트로 같은데????

둘 다 같아야 하는거 아니야??

 

근데 float 은 실수, int 는 정수.float은 소수점도 나타내야 함

 

float 은 10의 몇승 이런걸 이용하기 시작함

근데 이게 자리수가 넘어갈려면 좀 디테일이 떨어짐..

 

그렇기 때문에 완벽한 정수가 나오기가 힘듦

 

그렇기에 Speed 가 0.1 보다 클 때 라고 하자.

Move 에서 Idle 로 돌아올때는? Less 로 하면 되겠지??

 

 

에디터에서 처리해줬으니 코드에서도 처리해보자

Player 의 스크립트를 살펴 보자!

 

player 가 앞뒤로 움직이는건, float v 에 따라서 조절 가능

변수설정
컴포넌트 값 받아오고
Speed 를 v로 설정

앞으로 갈때 이제 걷는 모션이 나옴

 

근데 뒤로갈때는 안나옴,

그럼 대각선은?

그럼 다른 방향은? 

이걸 다 조건 해줘야 돼??

그게 아니니까. 

Blend Tree 라는걸 이용하자!


Blend Tree 로 Player 애니메이션 구현

 

 

한 두개 속성값으로 다 혼합할 수 있게 하는 게 Blend Tree 임!!

 

 

Animator 창에서 Blend Tree 생성

이 블렌드 트리 이름을 Move 로 바꾸자.

그러면 원래 Move 가 있어서 

Move 0 으로 바뀜

다 지우고 블렌드 트리로 ㄱㄱ!

다 지우고 블렌드 트리만 놔두자!

 

여기에 들어가면 (더블 클릭하면) 아까 설정 해뒀던 Speed 파라미터로 

설정 할 수 있게 나와있음

하지만 이렇게 해도, 아까랑 다를바가 없음!

앞으로 갈때나 뒤로갈때 좌우로 갈때는 쓸수가 없다..

인스펙터창에서 설정해주는 모습

인스펙터창에서 모션을 추가시키자.

 

(참고) 블렌드 트리에 블렌드트리

더보기
여기서 가지치기도 가능!

일단 저거 보다는 Motion 을 추가 시키자

Add Motion Field ㄱㄱ

 

이렇게 나옴

Threshold 에 따라 바뀔 텐데

0 에서 0.5 사이는 ? 유니티에서 알아서 해줌

여기서 0 을 클릭하면

이렇게 -1 로 바꿀 수 있음
Idle 뒤, 앞 도 설정해준 모습

앞 뒤 Idle 설정 완료.

 

이제 다른 방향도 살펴보자.

float Parameter 

Direction 이름으로 생성하고

 

Motion 에서 + 를 눌러 BlendTree 를 하나 더 만들어준 모습

 

이 블렌드 트리에 모션필드 2개 넣고

 

왼쪽 오른쪽도 넣자!!

 

플레이 안하고도 실행 해서 볼 수 잇음

왼쪽에 파란색 두줄이 실행 되고 있음

근데 Speed, Direction 이 0 이니까 재생해보면 가만히 멈춰야 하는데

움직인다,,?  왜??

 

첫번째 블렌드 트리

여기서 보면 새로 만든 블렌드 트리가 Threshold 가 1이어서

WalkFront_Shoot_AR 이 0.333 으로 나와있다.

 

Speed 값이 0 이니까, Idle 과 WalkFront 가 50프로씩 나오고 있는거임!

그래서 걸어감..

 

 

근데 일단 이것도 문젠데,

또다른 블렌드 트리 는 어떻게 실행해주지..?

 

그러니까 이제

 

Treshold 를 조정 해줘야 함!

 

이렇게 해주면 BlendTree 도 실행 됨!

WalkFront 를 1로 해주고, Idle 과 Blend Tree 는 0으로!

 

실행해보면?

공중에 떠있음...?!

.....?!

공중에 떠있음,,,

 

지금 두개가 섞여서 이렇게 붕 떠있음....

 

그럼 어떻게 할 까?

 

지금 Speed 와 Direction 이 0 이어서, Idle 이랑 디렉션 블렌드 트리의 0 값에 있는 애니메이션이랑 합쳐져 있어서 

저렇게 이상하게 붕떠있는 거임

 

그렇다면 두번째 블렌드 트리의 0 값에 None 값을 하나 설정 해주자.

Direction 블렌딩에 하나 추가해서 None 으로 해주자

 

코드도 구현해보고

 

이렇게 하고 해봤는데, 동시에 먹어서,또 붕뜨고 난리 남

 

이럴 때는 블렌드 트리를 쓰지 말고,

 

하나를 다 엮어서 써버리자.


Blend Tree 2D 사용

 

아까 디렉션 블렌드 트리는 삭제하고 여기 두개 추가

 

그리고 2D 로 바꿈!

 

2D 를 선택해주는 모습
위 사진 처럼 애니메이션 설정 ㄱㄱ

Parameter 에는 두번째에 Direction 으로 설정해주면

PosX , PosY 로도 나온다.

 

PosY 는 Direction 값!

 

Pos x 가 Speed, Pos Y 가 Direction 이다!

 

이렇게 하면 완벽합니다...


점프 애니메이션을 구현하는 방법

 

 

점프 구현은 어떻게 할까?

점프 할 때는

착지,

떨어질 때,

점프할 때 이렇게 3가지로 나눠서 하 함!

점프점프 애니메이션

 

 

그리고 전에 했던 방식으로, 점프에니메이션에서

Clip  을 딴다. 3개 추가.

Start , Loop, End

 

JumpLoop 만 루프 체크 해줌! 

점프루프는 점프하는 중인건데, 공중에서 계속 떨어지는 모션이 나와야 하니까!

 

JumpStart 의 자른 범위
JumpLoop의 자른범위
JumpEnd 의 자른범위

근데 착지는, 좀 더 줄여줘야 될 수도 있음! 바닥에 부딪혔을 때 해줘야 하니까.

 

 

이번엔 Bool 파라미터를 써보자!

IsInAir 의 이름으로 하나 생성

3가지의 점프를 완성시킨 모습

구현 방향

 

Move 0 -> JumpStart  는 공중에 있을때로 설정 (bool)

 

JumpStart  -> JumpLoop 그냥 Has Exit Time 과 함께 가만 냅두면 됨

 

JumpLoop -> JumpEnd 공중에 있지 않을때로 설정(bool)

 

JumpEnd -> Move0 이것도 그냥 가만 냅두면 됨. 착지하고 알아서 Move 로 가게 하면 되니까!

 

 

공중에 있을 때
JumpLoop 에서 JumpEnd 로 갈 때

 

코드로도 구현해주자

바닥에 닿아 있지 않을 때

PlayerMove.cs

 

 

근데 이렇게 하고 실행해보면 뭔가 좀 부자연 스러움,...!

착지 애니메이션을 좀 더 줄여줘야 할것같다!

 

줄여준 모습

 


오브젝트 위에 있다가 그냥 떨어질때

 

근데, 벽위에 있다가 그냥 떨어지면?

이게 점프를 애초에 시작을 안해서

중간에 Loop 에 들어가지 않는다.

 

그렇기 때문에 점프의 기준을 바꾼다!

레이로 설정해서 해줌!

 

근데 걸을 때 보면, 걸을 때 뭔가 좀 미끌어지는 느낌임!

 

Animation 에서 Speed 값을 올림!

Move 애니메이션의 Speed 를 2 로 올린 모습

 


Player 의 공격 애니메이션 구현

 

이제 공격 애니메이션을 쓰자!

 

한발씩 쏠거니까 SingleShot 으로!

 

루프를 끄자! single shot 이니까!

 

단발성은 트리거!

 

Trigger 로 Attack 만들어줌

 

자동완성  진짜로 갸꿀팁(참고)

더보기

GetComponent 하고 만약에 틀리면 다시 지우고 자동완성? ㄴㄴ

Ctrl + Space 바  누르면 또 자동완성이 뜸! 

wow!

하면 되긴 하는데, 빠르게 쏘면 뭔가가 좀 딜레이 되는 느낌?

 

이럴때 코드로 실행 시키자.

anim.Play 로 코드로 구현한 모습

그런데 이걸로 해도 조오오끔 좀 걸림;;;

 

그럴떄 CrossFade 라는게 있음!!

70퍼센트 부터 플레이 하는거임!

10퍼센트 부터 하는거임!

내부적으로 큐가 다 쌓여있고, 다른거랑도 다 fade 가 된다. 와우..

 

엄청 자연스럽게 잘 됨!


Player 상 하체 애니메이션 따로 구현하기

 

걸어가면서 발사하면?? 이게 어쩔 수 없이 끊길 수 밖에 없음...

동시에 진행 시킬 수 있을 까?

 

레이어를 사용하고 상체 하체를 나눈다!!

 

레이어 하나 더 만듦
Attack 을 복사 하고 지운다.
여기에 붙여넣기

빈 스테이트 생성.

 

Attack 은 신호 줄 때만 하고싶으니까 

 

빈 스테이트를 Idle 로 만들고 

Set as Layer Default State 로 만든다

톱니바퀴 누르면 나오는거

Weight => 가중치

1이면 100퍼센트 내껄 실행 하겠다는거임.

 

걸으면서 주먹질을 할때 50프로로 하면? 두개가 섞인게 나옴!

 

Mask

=> 필터같은거

 

여기에 상하체 넣는거임!

아바타 마스크 생성
상체만 쓰겠다는거임!
PlayerAvatarMask 선택!

코드 수정

여기서 0을 1로 바꿔줘야 함

0번 레이어를 따르는게 아니라, 1번 레이어를 사용하겠다는 말임!

 

Layer 를 수정.

그리고 플레이 해보면, 걸어가면서 총도 쏠 수있다.. Wow

 

IK = Inverce Kinematics