
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 함수를 이용하여 디버깅을 ..

Reload Continued이어서 리로딩에 대한 작업을 해주자.먼저 기존 ShooterCharacter 클래스의 헤더에 있던 총알 유형에 대한 enum 클래스가 Weapon 클래스에서도 사용해야할 필요가 생겼다.이에 아에 따로 헤더를 생성하여 거기에 총알 유형에 대한 enum 클래스를 선언해주자.Weapon 클래스에서 ShooterCharacter 헤더를 포함시켜도 되긴하지만, 불필요한 내용까지 포함되므로 따로 만들어주자. 그리고 해당 헤더를 포함시켜주면 된다. 새로운 파일이 추가되었으므로 언리얼로 돌아가서 Refresh Visul Studio Code Project를 눌러주자.언리얼에 해당 파일의 존재를 알려줌으로써 인텔리전스 오류가 사라진다. 이제 Weapon 클래스에서 해당 유형에대한 변수 선언 ..

Reload Lecture리로드를 위한 작업을 시작해보자.먼저 액션 매핑부터다 보통 리로딩은 R키를 할당한다. 액션 매핑을 위한 콜백 함수와 바인딩 작업도 해주자. 다음으로 리로드를 위한 함수이다.우선 ECS_Unoccupied 상태가 아니라면 바로 return을 해야할 것이다. 필요한 변수를 더 선언해주자.리로드시 동작할 Montage에 대한 변수가 필요할 것이다. 아직 구현예정인 부분이 존재하여 해당 부분들은 주석으로 표시하였다.우선 구현된 부분만 보면 MontageSection을 불러오고,우리가 불러올 Montage와 AnimInstance가 유효한지부터 체크 해준다.이후 AnimInstance를 통해 Montage를 플레이 및 위의 섹션으로 점프해준다. 해당 함수를 필요한 부분에 호출해주자.저번에..

Reload MontageReload를 위한 Montage를 작성해주자.기존 90~91 강의를 통해 만든 애니메이션을 사용하지만, 해당 에셋이 내가 사용중인 언리얼 버전과 호환이 불가능하여 따로 만들지 않았었다.이어지는 강의가 존재하므로 Belica 에셋 중 Level Start Montage를 적절히 편집하여 사용하였다. 나머지는 강의 내용을 따라 한다.먼저 혼합 시간을 0으로 설정해주자. 몽타주 섹션도 만들고 기존의 Default는 지워주자. 슬롯도 추가해주자. 이어서 추가한 슬롯을 할당해주자. 이제 애니메이션 블루프린트로 돌아가서 해당 슬롯을 추가해주는 작업을 해주자.먼저 기존 애니메이션을 Cach로 저장해주자. 해당 애니메이션 Cach 한 것을 Reload 슬롯과 연결해주자. 이를 또 Cach로 ..