
Crouching AnimBP저번 강의에 이어서 애니메이션을 할당해주자.Ground locomotion에서 CrouchStart로 가는 조건을 만들어 줄 것이다.그리고 이어서 CrouchIdle -> CrouchEnd -> Idle로 애니메이션 할당 및 조건을 설정해줄 것이다. 이외에도 JogStart, JogStop, Run 상태에서도 CrouchStart로의 전환이 가능할 것이다.이에 대한 조건도 설정해주자. 이제 컴파일 하고 할당한 키인 Left Shift를 누르면 Crouch 자세를 취하게 된다.

Crouching Animations이제 애니메이션을 살펴볼 것이다.해당 강의에서 사용되는 애니메이션이 예전에 다운받아서 사용했던 AnimStarterPack에 속한 애니메이션이다. 해당 애니메이션을 리타켓팅해서 사용하게 되는데, 저번과 똑같이 내가 현재 사용 중인 언리얼 버전과 호환성 문제로 사용이 불가하여 일단 앉은 자세가 있는 에셋으로 대체하였다.이후 강의에 따라 실습을 따라해보거나 아니면 단순 강의 시청만 하게될 것 같다. 우선 고른 에셋은 다음과 같다.stun되어 앉아있는 모션을 가진 애니메이션이다.해당 애니메니션에 우선 강의와 똑같이 Key를 3가지 추가해주었다. 다음으로 서있다가 앉는 모션의 애니메이션이다.대체한 애니메이션은 Stun 되기 시작하는 애니메이션이다.앉아 있는 프레임을 체크하고,..

Crouching Setup캐릭터 앉기 동작인 Crouching 동작을 구현해보자.앉기 여부를 나타낼 bool 변수 선언 및 초기화를 해주자. 그리고 getter() 함수 또한 생성해주자. 앉기 키 설정을 위한 액션 매핑도 해주자. 이어서 바인딩 작업도 해줄 것이다. 우선은 공중 여부를 체크하고, 크라우칭 상태를 반전 시키는 내용만 구현하였다.매핑된 키를 통해 앉았다 일어났다를 반복하게 될 것이다. AnimInstance 클래스에도 bool 변수를 선언해줄 것이다. 해당 변수는 애니메이션 속성 업데이트 함수에서 ShooterCharacter로 부터 얻은 크라우칭 여부를 저장해주자.

Lean Blendspace이제 기울기를 적용해보자.기존의 RunnngBlendSpace를 이용할 것이다. 기울기 애니메이션의 경우 Circle을 검색하면 종류별로 확인이 가능하다. 이를 Lean 값에 따라 적절히 배치해주자. 이제 저번 강의에서 만들었던 YawDelta 변수를 적용해주자. 이제 실행해보면 기울기가 적용되어있다.하지만 애니메이션이 다소 덜컥거리는 현상이 존재한다.이를 고치기 위 CharacterYaw 값을 출력하여 체크해보자.이를 통해 확인해보면 캐릭터가 기울이며 이동하면서 -180에서 180도로 회전 값이 급격하게 변하는 것을 볼 수있다. 이를 해결하기 위해서 기존 변수를 FRotator로 바꾸자. 초기화도 새롭게 해주자. 이제 회전값 토대로 정규화를 해줄 것이다.정규화된 값을 사용하면..

Lean추가적으로 기울이는 동작을 추가해보자.먼저 기존에 사용하던 CharacterYaw 변수와 CharacyerYawLastFrame 변수 앞에 구별을 위해 TIP 단어를 붙여주자.(TIP = Turn In Place) 그리고 기울이는 함수를 작성해줄 것이다. 그리고 이에대한 CharacterYaw 변수와 CharacyerYawLastFrame 변수를 새롭게 생성해주자.YawDelta 값 또한 같이 생성해주자. 이제 Yaw 값을 할당해주고, 해당 값들을 통해 회전 차이를 구하고 이를 DeltaTime으로 나눠서 속도를 구하자.그리고 해당 속도를 보간하여 설정해줄 것이다.이때 범위를 -90~90으로 지정해줄 것이다.이제 YawDelta 값을 디버깅 메시지로 출력하도록 해서 확인해보자. 그리고 YawDel..

Aiming Aim Offset조준 했을 때 기준의 Aim Offset도 만들어보자이번엔 Idle_AO_가 아닌 RMB(Right Mouse Button)_AO_ 애니메이션들을 사용할 것이다. 조준 시에는 -180~180도 까지는 필요없기에 -90~90까지만 범위를 지정해줄 것이다. 그리고 애니메이션들을 할당해주자. 할당하다보면 화면에 캐릭터가 사라지는데 RMB_AO_CC 애니메이션이 할당되어서 그렇다.이를 조준시 Zero_Pose인 RMB_Zero_Pose로 바꿔주자.할당할 때마다 사라지므로 모두 할당 후에 바꿔주자. 모두 할당해준 모습 다음으로 이번엔 AnimInstance 클래스에 열거형을 하나 만들어줄 것이다.OffsetState에 대한 것을 나타내며, 이를 통해 일반 Offset을 사용할 지, ..

Hip Aim Offset지금은 위아래 또는 좌우로 돌렸을 때 aim이 해당 방향을 향하지 않는다.이번엔 이에 대한 조정을 해줄 것이다.먼저 이를 위한 Aim Offset을 생성해주자. 다음으로 Axis 값을 설정해주자.Yaw 해당 하는 값은 -180 ~ 180으로, Pitch에 해당 하는 값은 -90 ~ 90으로 값을 설정해주자. 다음으로 애니메이션을 할당해주자.AO를 검색해보면 Idle에 대한 애니메이션이 나온다.CC의 경우 센터의 센터, CD의 경우 센터의 다운, CU의 경우 센터의 업이다.LBC의 경우는 left back center이다.이러한 약자를 참고하여 애니메이션 위치를 할당해주자. 이제 해당 AimOffset을 이용해 Yaw 값을 적용시켜보자.Root Yaw Off set 값을 얻고, 반..

Turn in Place using Curve Values만든 커브 값을 이제 적용해보자.기존의 TurnInPlace() 함수에 추가로 작성해줄 것이다.우선 기존의 RootYawOffset 값은 -180~180 값의 범위를 넘지 않도록 NormalizeAxis 함수를 사용한 코드로 수정하였다.다음으로 커브 값을 가져와 우선 변수에 저장해주었다. 이후 필요한 변수를 선언해주자.회전 커브 값과 직전 회전 커브 값이 필요하다. 이를 토대로 다시 구현을 이어서 해주자.직전에 저장한 Turning 값이 0보다 크다면 회전 애니메이션이 재생 중인 것이다.각 회전 커브 값을 할당해주고, 둘의 회전 차이 값을 저장해주자. 이후 RootYawOffSet 값을 토대로 0보다 크다면 회전 값을 빼주고, 0보다 작다면 회전 ..

Animation Curves현재 애니메이션은 제대로 회전하는 것이 아니라 제자리를 도는 애니메이션이다.이를 제대로 구현하기 위해 Animation Curve를 이용할 것이며, 이번 강의는 이를 만드는 내용이다.먼저 우리가 만들었던 trimmed 애니메이션의 Curves 항목을 보자. 예시로 DistancCurve 항목을 보면 저렇게 곡선의 형태로 이루어진 것을 볼 수 있다. 이제 이러한 Curve를 직접 만들어보자. 3개의 키를 둘 것이며 각각 (0, -90 / 0.35, -45 / 0.65, 0)이다. 3개의 점을 모두 드래그하고 Auto를 눌러주자. 이제 가운데를 조절하여 적절한 곡선으로 만들어 주자. 그리고 MEtadata Entry도 생성해주자.이는 애니메이션 커브가 특정 기능을 하도록 도와주는..

Turn in Place Animations이제 애니메이션을 할당해보자.기존 애니메이션 중 Idle_Turn_90_Left와 Idle_Turn_90_Right 애니메이션을 복사하여 사용할 것이다. 각각의 애니메이션의 필요없는 뒷부분을 삭제해주자. 이제 Idle 애니메이션을 고쳐줄 것이다.우리는 아래 부분만 움직일 것이기에 기존 애니메이션 삭제후 2가지 스테이트 머신을 새로 생성해주자.각각 상체와 하체를 담당한다. 상체의 경우 변화가 없기에 기존에 사용하던 애니메이션을 그대로 사용해주면 된다. 하체의 경우 90도 왼쪽 회전과 90도 오른쪽 회전 2가지가 추가 된다. 먼저 Idle -> Idle_Turn_90_Left_trimmed 조건이다.움직이지 않아야하고, Root Yaw Off set 값이 90을 ..

Rotate Root Bone현재 캐릭터를 제자리에서 회전 시켜보면 발이 자연스럽게 돌지 않는 모습을 볼 수 있다.이에 대해 수정을 해줄 것이다. 먼저 이를 위해서는 Belica_Skeleton의 root에 대해 먼저 볼 필요가 있다.root는 모든 skeleton의 중심으로, 해당 root를 회전 시키면 캐릭 전체가 회전하는 것을 볼 수 있다.따라서 우리는 이 root를 이용해 제자리 회전을 구현해 나갈 것이다.이는 AnimInstance 클래스에서 진행된다. 이제 root를 회전 시키기 위한 변수들을 선언해주자. 함수도 이어서 생성해주자. Speed가 0보다 크면 움직이는 중이어서 제자리 회전이 필요없으므로 빈칸이다.스피드가 0일 때를 고려하자.우선 현재 캐릭터 Yaw 회전 값과 직전 Yaw 회전 값..

강의 107 ~ 111은 재장전 모션 중에 탄창을 실제로 빼고 장착하는 애니메이션 및 이에 대한 효과음을 넣어주는 내용이다.하지만 재장면 애니메이션 호환 문제로 임의의 다른 Montage를 사용 중이기에 따라하기엔 무리가 있다고 생각되어 강의만 시청하고 실습은 하지 않았다. 임의로 지정하여 탄창 빼고 넣는 부분을 실습하는 것 자체는 가능하지만 사용중인 Montage와 맞지 않아 다소 이상한 애니메이션이 연출될 듯 하여 보류하였다.이에 강의 112부터 다시 작성한다.Pickup Sounds아이템을 주었거나, 장착했을 때의 사운드를 추가해보자.우선 강의 깃허브에서 음원을 다운받아서 큐를 생성해주자. 우리가 사용할 것은 sw_Foley_jump_01_cue와 sw_Wep_AR_Equip_02_cue이다.각각의..

Bind Carried AmmoCarried Ammo에 대해서도 바인딩 작업을 해주자. 그리고 로컬 변수로 Carried Ammo 개수에 대한 Text 타입 변수를 만들어 주자. 기존에 만들어둔 Shooter Character를 가져와서 유효성을 체크해준다.그리고 이를 통해 Ammo Map과 Equipped Weapon에 대한 접근이 가능하다.Equipped Weapon은 이어서 Ammo Type에 대해 접근이 가능하고, Ammo Map을 통해서는 FIND 함수를 통해 Ammo Type이 존재하는 지를 체크할 수 있다.Find의 아웃풋은 bool과 integer로 2가지인데 integer 값을 통해 Return text를 세팅하고,bool 값을 통해 Set 가능 여부를 체크하게 된다. Return Tex..

Update AmmoMap이제 AmmoMap을 업데이트 해주는 과정을 만들어주자.먼저 탄창 용량에 대한 변수를 Weapon 클래스에 선언 및 초기화 해주자. 이에 대한 Getter 함수도 생성해주자. 다음으로 FinishReloading() 함수이다.여기서 AmmoMap에 대한 업데이트를 진행하게 된다. 먼저 장착된 무기가 유효한지 체크하고, 해당 무기의 탄약 유형을 확인한다.해당 유형이 AmmoMap에 있는 지를 체크하고, 해당 유형에 대한 총알을 가져오게 된다. 이어서 탄창 용량에서 현재 탄약을 빼서 남은 용량을 체크해준다.이제 남은 용량을 기준으로 AmmoMap을 업데이트 하게 된다. 필요한 부분을 추가적으로 만들어주자.먼저 RealodAmmo() 함수이다. checkf 함수를 이용하여 디버깅을 ..