
Blending Shooting Animations사격 애니메이션이 이제 존재하지만, 달리면서 사격하면 애니메이션이 부자연스럽다.이번엔 이를 수정하기 위해 blend 작업을 해보도록 하자. 우리가 blend 할 대상은 기존 Ground Locomotion에 대한 애니메이션과, 사격이 포함된 애니메이션이다.이 2개를 먼저 Cached 작업을 통해 정리해주도록 하자. blend를 하기 위해 어느 뼈대를 미리 살펴보자.사격 모션은 상체에 해당하므로, 하체는 그대로 달리고 상체만 바뀌는 것이 목표이다.따라서 상체 쪽에 위치한 뼈대를 체크해주자. 이제 Layered blend per bone 노드를 통해 이를 섞어 줄 수 있다.Layer Setup에서 하위 Branch Filters를 추가하고 여기서 Bone N..

Shooting Animation슈팅하는 순간에 대한 애니메이션도 추가해주자.우선 원본 애니메이션을 찾아서 해당 애니메이션을 복사해주자. 복사한 애니메이션에 대해 프레임을 잘라주자.뒷부분이 필요없어 보이므로 앞부분만 채택했다. 다음으로 애니메이션 몽타주를 생성했다.기존 스테이트 머신을 사용하지 않고 애니메이션 몽타주를 사용하는 이유는 사격 모션에 대해 보다 더 자연스럽게 구현할 수 있기 때문이다. 해당 몽타주에서 방금 만든 복사본 애니메이션을 넣어주자. 그리고 새롭게 Section을 생성해주자.해당 Section은 사격 모션 애니메이션에 걸맞게 Start Fire로 설정해줄 것이다.그리고 Default Section을 뒤로 쭉 땡기면 StartFire Section이 앞으로 할당되고, 이후 Default..

Shooting Particles사운드에 이어 이펙트도 추가해주자.이펙트를 추가해주기에 앞서서 이펙트가 생성될 위치를 먼저 잡아주자.현재 캐릭터의 스켈레톤 골격을 보면 총이 있는 위치를 볼 수 있다.해당 위치에 이펙트 스폰용 소켓을 추가해주자. 그리고 해당 소켓 위치를 총구 앞으로 조절해주고, 방향 또한 x 축이 앞으로 가도록 해주자. 이제 사운드 때와 마찬가지로 할당할 이펙트를 선언해주자. 사전에 생성한 소켓 위치를 토대로 이펙트를 생성해주자.사용한 함수는 SpawnEmitterAtLocation 함수이다.그리고 소켓 관련한 변수는 변할 필요가 없는 값이므로 const로 값을 고정시켜주었다. 다음으로 이펙트를 확인해주자.사용할 이펙트는 P_BelicaMuzzle이다.해당 이펙트를 확인해보면 3번의 총 ..

Shooting Sound Effects총기에 사운드 효과를 입혀주자.사운드 에셋은 강의 첨부된 자료를 사용한다.우선 자료를 다운하여 프로젝트에 임포트해주자. 그리고 해당 파일을 기준으로 사운드 큐을 만들어주자. 그리고 해당 큐에 다운 받은 사운드 10개를 랜덤으로 재생되도록 묶어주자.랜덤은 해당 사운드 큐 파일에서 우클릭시 생성이 가능하다.사운드 파일들은 전부 클릭 후에 사운드 큐 화면으로 드래그 해주면 된다. 이제 이를 좌클릭 눌렀을 때 사운드가 발생하도록 해주자.우선 이를 위해 할당할 사운드를 선언해주자. 그리고 기존 ulog 내용을 지우고 PlaySound2D 함수를 통해 사운드를 실행시켜주자. 이제 BP ShooterCharacter 클래스에 사운드 큐를 할당하고 실행해보면 좌클릭 시 랜덤한 1..

Rotate Character to Movement현재 앞뒤 이동만 되는 상태로 좌우로 이동하게 되면 앞을 보고 있는 모습 유지된 상태로 이동하게 된다.이번 강의는 이를 위한 작업을 하게 된다. 우선 캐릭터 회전이 카메라 회전과 일치하지 않도록 변경해주자.이를 위해 bUseControllerRotation 값들을 모두 false로 변경해주게 된다. 캐릭터의 방향이 이동 방향에 맞도록 조정되도록 하기 위해 bOrientRotationToMovement 값을 true로 바꿔주자.그리고 회전 속도 또한 설정해주자 여기서는 540으로 설정하였다.하는김에 점프속도 및 공중 제어 시간 또한 설정해주었다. 바로 컴파일 했을 때 제대로 동작하지 않을 수 있다.왜냐하면 해당 값들이 블루프린트에도 존재하는데, 블루프린트에..

Trimming Animations전진하고 멈추는 애니메이션을 조금 다듬어보자.현 상태는 시작할때 준비시간이 다소 존재하고, 멈출 때 또한 비슷하게 딜레이 시간이 존재한다.이를 위해 원본 애니메이션에서 복사하여 복사한 애니메이션을 다듬는데 사용하도록 하자. 그리고 우선 기존에 스테이트에 할당했던 애니메이션을 바꿔주자. 이제 프레임을 다듬어주자.깔끔한 동작을 위해 한번 걷는 사이클을 제외한 뒷 프레임을 모두 제거해주자. 그리고 이어서 앞에 걷기 시작하기 전의 딜레이 부분도 삭제해주자. 마찬가지로 멈출 때 애니메이션 또한 작업해주자.작업하다보면 되돌리고 싶을 때도 있을 텐데, 이를 위해 복사본을 사용하는 것이다.또한 테스트해보고 맘에 안들면 추가적으로 삭제도 해주자.

Run Animations달리는 애니메이션을 설정해보자.우선 기본적인 스테이트 머신을 생성해주자. 그리고 스테이트를 통해 간단하게 구성도를 만들어주자.idle -> 달리기 시작 -> 달리기 -> 달리기 멈춤 -> idle 형태이다. 각 스테이트에 대한 애니메이션과 조건들을 생성해주자. 이제 컴파일 하고 실행해보면 달리기 애니메이션이 실행된다.이후 강의를 통해 좀 더 다듬는 과정을 거치게 된다.

The Animation Blueprint직전 강의를 통해 만들었던 애니메이션 클래스를 토대로 블루프린트를 생성해주자. 그리고 미리 BP ShooterCharater로 들어가서 Anim Class를 방금 만든 BP 클래스로 설정해주자. 이제 Event Graph로 들어가보면,우클릭을 통해 VScode에서 작성했던 Update Animation Properties 함수를 호출할 수 있다.이를 event Blueprint Update Animation의 아웃풋 값과 연결해주자.

The Anim Instance캐릭터 움직임에 맞는 애니메이션을 할당해주자.이번엔 이를 위한 기반 작업을 하게 된다.이를 위해 C++ 클래스를 생성해주자. 그리고 애니메이션의 BeginPlay() 함수와 Tick() 함수에 해당하는 함수들을 선언해주자. 그리고 캐릭터의 스피드, 공중 여부, 움직임 여부에 대한 변수도 선언해주자. BeginPlay()에 해당하는 기본 초기화 함수를 먼저 구현해주었다. 이후 Tick()에 해당하는 함수에서도 똑같이 초기화를 해주고, null인지 아닌지 체크해주자.그리고 현재 캐릭터의 속도를 받아서 Z 값을 제외한 나머지를 Speed에 저장하였다. 공중 여부는 IsFalling() 함수를 통해 체크해주고,움직임 여부는 GetCurrentAcceleration() 함수의 사이즈..

Adding a Mesh기본적인 기능들을 구현해줬으니, 이제 캐릭터의 메시를 할당해주도록 해보자.우선 언리얼 엔진 마켓 플레이스에서 사용할 에셋을 다운받아주자.여기서는 Paragon Belica 에셋을 다운받아 사용했다.다운 받은 후 현재 프로젝트에 추가해주도록 하자. 추가하면 콘텐츠 브라우저에 해당 폴더가 생긴 것을 볼 수 있다. 이제 메시를 할당해주자. 이후 메시의 방향과 캡슐에 맞게 위치를 조정해주자.우선 캡슐의 크기를 체크하고, 이에 이용하여 높이를 조정해주자. 이제 플레이 해보면 해당 메시를 가진 캐릭터가 움직이는 것을 볼 수 있다.다음 강의에 애니메이션에 대한 작업을 시작하게 된다.

Mouse Turning And Jumping상화좌우 화살표로 회전했던 것을 마우스로 바꾸고, 점프 기능 또한 추가해주자.좌우 회전에 대해서는 Mouse X 값을, 상하 회전에 대해서는 Mouse Y 값을 할당해주자. 이후 똑같이 바인딩 작업을 해주자.여기서는 곧바로 APawn에 있는 AddController(Yaw/Pitch)Input 함수를 바로 사용해주면 된다. 이후 점프를 할당해주는데, 점프의 경우 Action 매핑이다.키가 누르고 있는 동안 동작되는 Axis 매핑과 달리 키가 눌리자마자 단일 함수 호출만 필요한 경우이다. 마찬가지로 바인딩 작업을 해준다.여기서 점프 버튼을 눌렀을 때와 놓았을 때 2가지 케이스에 대해 작업을 해주었다.

Turn at Rate이번엔 회전에 대해서 구현해보자.구현하기에 앞서 직전 강의 내용인 델타 타임에 대해서 알 필요가 있다. 델타 타임은 간단하게 말하여 각 프레임 간의 시간 차이 값으로, 두 프레임 사이에 경과한 시간을 측정한 값이다.이는 게임의 프레임 률이 일정하지 않더라도 물리적이나 애니메이션 움직임 등의 일관성 유지를 위해 사용된다.이번 구현 대상인 회전의 경우 프레임 률에 따라서 회전 속도에 큰 차이를 가질 수 있으므로, 델타 타임을 이용하여 회전 속도를 조절하게 된다. 델타 타임을 사용하는 것 말고는 상하좌우 이동 때와 거의 동일하게 구현해주면 된다.대신 여기서는 추가적으로 기본 프레임 률을 얼마로 설정할 지에 대한 변수를 추가로 선언해주어야 한다. 기본 프레임 률을 우선 45로 정했으며, 생..

Move Forward and Right직전 내용으로 컨트롤러 및 입력에 대한 내용이 있었는데, 강의로만 짧게 설명한 개요 같은 부분이라 생략한다.이에 따라 이번 강의 내용은 기본적인 플레이어 움직임에 대해 다루게 된다. 우선 프로젝트 세팅의 Input 항목으로 가서 Axis 매핑을 작성해주어야 한다.앞뒤에 대한 WS 키와, 좌우에 대한 AD 키를 할당해주자.Scale 키는 정방향 역방향에 맞게 1.0과 -1.0을 할당해주면 된다. 이제 이에 대한 함수를 만들어주어야 한다. 이제 본격적으로 구현하기에 앞서 현재 Controller가 유효한지 체크를 해주자.그리고 컨트롤러의 회전 값을 얻고, 거기서 x축에 해당하는 Yaw 값만 따로 저장해준다.이후 해당 Yaw 회전 값을 통해서 x축에 대한 방향 값을 얻어..

Follow Camera이제 카메라 또한 SpringArmComponent와 같은 방법으로 생성해주자. 카메라의 경우 플레이어와 같이 회전하면 안되므로, bUsePawnControlRotation을 false로 할당해준다.그리고 카메라의 경우 카메라붐에 붙여줄 때 소켓네임 또한 같이 적어주었다.이러면 특정 소켓에 카메라를 위치시켜주는 것이 가능하다.해당 코드에서는 소켓이 1개인 상태이므로 소켓네임을 빈칸으로 해도 같은 결과가 나온다. 이제 컴파일을 해보면 카메라가 추가된 모습을 볼 수 있다.