기존의 Satellite 프로젝트를 수정하자니 전체적으로 손봐야해서,
아예 처음부터 수정하기로 하였다.
기본 FPS의 형태를 갖추고, Sputnik프로젝트만의
기능들을 추가하려고 계획하고 있다.
Trello는 기존 Satellite 프로젝트의 것을 이어서 사용한다.
https://trello.com/b/L76nrwoC/satellite
이전 Satellite 프로젝트에서 직접 CPP에서 매시를 설정했는데,
바보같은 짓이었다.
SimpleShooter 프로젝트에서 배운 것처럼,
CPP인 Character를 상속받는 BP를 만들고 직접 매시를 조정한다.
기본적인 입력을 설정하였다.
이전 Satellite 프로젝트에서
CPP로 이동/조작 방식 설정과 SpringArm을 설정하였는데
BP로 진행하는 것이 더 효율적이라고 생각했다.일단 BP에서 기본값을 설정해둔 뒤,
특정 설정값만 바꾼다면 모르겠는데, 전부를 CPP로 작성하는 것이 의미가 있을지 모르겠다.
CPP로만 코딩하라는 제한이 없는 이상 무조건 BP가 효율적이었다.
BP에서 카메라, SpringArm을 조절하여 위와 같은 시야가 되도록 하였다.
SpringArm을 캐릭터의 우측을 더 보이도록 조정했다.
SpringArm 끝에 Camera를 배치함으로써,
1) Camera가 벽을 뚫지 않고 ArmLength 궤도 내에 움직이도록 하였고,
2) Pawn의 Rotation대로 Camera가 움직이도록 고정시킬 수 있었다.
[ 카메라 시점을 참고한 게임 ]
램넌트2의 트레일러 영상
사진처럼 플레이어가 죽여야하는 몹들이 1) 우측에 잘 보이도록
카메라를 조절하고,
2) 하반신은 무릎정도까지만 보이게 하여,
이동하고 있음을 보이게 했다.
GameMode를 생성하고, Default Pawn을 수정하여 적용시킨다.
게임 시작시, 플레이어는 지금 만든 캐릭터로 시작하게 된다.
이동관련 Animation은 BS를 적용시키려고 한다.
Asset에 포함된 Runs라는 BS를 이용할 것인데..
속도가 0인 경우에도 움직이도록 되어있어서,
Idle모션을 추가해주었다.
2개의 축으로 이루어져 있으므로,
캐릭터의 Speed, Movement Angle을 BP로 간단히 구하여
해당 기본 이동 Blend-Animation의 변수값으로 사용한다.
추가로 까먹지말고 Anim을 BP_Character에 적용시킨다.
공격을 위해 팔을 드는 애니메이션도 적용하였으나,
바로 뒤의 Attack 목차에서 설명한다.
Character의 Attack은 Shoot 함수에 구현하였다.
마우스 왼쪽을 누르면 Shoot함수가 실행되도록 바인딩하였다.
위의 코드를 요약하자면, LineTrace를 통해서
1) PlayerController로부터 가져온 Player의 위치로부터
(Location)
2) Player의 위치에서
PlayerController로부터 가져온 Player의 회전값을 더하여,
Player가 보는 방향으로 30m만큼 먼 거리를
(End)
LineTrace하겠다는 코드이다.
분명히 시작점과 끝 점 사이의 StaticMesh가 존재하고,
Collision 설정도 잘 되었다고 생각하는데,
Hit되는 것이 하나도 없다.
뭐가 문제일까.
해결
ECC_GameTraceChannel1 로 해야하는데
ECC_EngineTraceChannel1 로 설정이 되어있었다..
항상 조심
Character CPP에 위처럼 Blueprint에서 장착할 수 있도록 생성하고,
UE의 Asset들을 바로 장착하여 적용시킨다.
Sound와 Effect 모두 적절히 적용시킨다.
Sound에
ATT 설정도 적절히 추가해주어 공간감을 더한다.SoundQueue는 지루하지 않게 랜덤한 타격음을 출력하도록 하였고,
(SimpleShooter프로젝트에서 다룸)
ATT를 생성하고 설정값을 적절히 수정하여 공간감을 가지도록 하였다.
Shoot 함수 내부의 코드.
Effect/Sound 둘 다 Muzzle_01이라는 SkeletalMesh소켓에 Spawn하도록했다.
총기의 총구가 아닌,
Character의 Muzzle_01에서 바로 총이 발사되는 이유는,
해당 프로젝트에선 총을 구현하지 않을 것이기 때문이다.
오른손에서 총알이 발사되도록 Effect/Sound를 디자인한다.
위와 같은 효과를 주고 싶다.
애니메이션의 설정만 신경쓴다면 쉽게 구현할 수 있을 것 같다.
바로 진행해본다.
먼저 우클릭을 누르고 있는지 파악하는 기능을 구현하는 곳을
Tick으로 해야하나 생각하다가,
IE_Released
가 있다는 것을 생각하고 한 번 로그를 출력해보았다.
원하는대로, 처음에 누를 때, Aiming이 뜨고,
뗄 때, NotAiming이 뜬다.
따라서 꾹 누르는 행위를 해야만 Aiming이 유지가 된다.
우클릭을 하지 않으면 팔은 내려간 상태여야만 한다.
우클릭을 하면 팔은 올라간 상태여야만 한다.
이걸 기존의 이동 BS와
앞으로 추가될 Jump나 다른 애니메이션 등등을 생각해볼 때,
어떻게 구현하는게 효율적일까?
현재 Animation 구조는 위처럼 되어있다.
Live인 상태라면, Locomotion에 AimOffset을 합쳐서 최종 움직임이 반환된다.
Locomotion은 Ground-Jump 상태로 나뉘는데,
Ground라면, Speed와 Angle에 따라 달리는 애니메이션을 수행한다.
여기서 팔의 움직임을 제어할 곳은 아마
AimOffset이 들어간 Level로 보인다.
Ground던 Jump던 하는건 하는거고,
최종 손의 위치는 해당 모션과 Blend되어야 할 것이다.
위처럼 Anim Graph를 수정해보았다.
BlendPosesByBool로
isAiming의 값이
참이면, 기존의 이동과 AimOffset 모션을,
거짓이면, 기존의 이동과 손을 내리는 모션을
Pelvis를 기준으로 0.8만큼 Blend한 모션을 출력한다.
부자연스러워서 Blend 기준 bone을 pelvis말고 spine으로 바꾸었고,
0.8만큼 참고하도록 하였다.
자연스럽게 반영된다.
bIsAiming에 따라서 Animation이 바뀌도록 만들었으니,
bIsAiming값을 우클릭에 따라 바꿔본다.
AnimInstance를 생성하고, bIsAming을 해당 변수로 둔다.
Anim에서 Instance를 상속받게하고, 변수를 노드에 연결한다.
위처럼 마우스 우클릭을 하거나 떼면,
AnimInstance의 ChangeAiming이 실행되고,
bIsAming의 값이 단순히 반대의 값으로 변경된다.
후에 해당 코드는 버그를 일으킨다..
Character에 bIsAiming이라는 플래그를 두지 않고,
AnimInstance에 설정한 이유는,
해당 플래그 값을 CPP에서 뿐 만 아니라,
Anim Graph에서도 사용할 수 있게 하기 위함이다.
사용되는 모습.
그리고 bIsAiming값의 getter함수에 따라 Shoot을 제한한다.
BP에 부착된 SpringArm을 가져오고 싶은데,
FObjectFinder의 결과가 없다고 뜬다.
Visible설정과 SpSpringArm으로 이름도 전환했는데
작동하지 않는다.
위의 방법을 통해 해결하였다.
확대되는 모습. 하지만 Lerp효과를 적용해야할 듯 싶다.
https://coding-hell.tistory.com/58
https://www.reddit.com/r/unrealengine/comments/juq74s/cant_get_my_head_around_fmathfinterpto/
FInterpTo를 사용하여 서서히 바뀌게 한다.
시작값, 끝값, DeltaSeconds, 변화량
잘 적용되는 것처럼 보이지 않는다. 너무 급격히 변한다.
좀 천천히 변하게 하고 싶었는데, 위처럼 사용자 Lerp를 만들어도
똑같이 동작한다.
일단 위처럼 작성하고 넘어간다.
천천히 바뀌게 하는 방법이 BP에 존재하는 것으로 봤는데
https://www.youtube.com/watch?v=fYI2NAmKVIo
뭔가 찝찝한데 그냥 CPP에서 하는 방법이 없는걸까..
TimeLine만 생성하면 쉬울 것 같긴한데..
일단 BP로 작성한다.
마우스 우클릭에 대해서 눌렸는지, 떼졌는지 바로 파악할 수 있는 노드가 존재했다.
그래서 CPP의 알고리즘과 거의 유사하게 작성할 수 있었고,
실행하는 함수는 TimeLine을 이용하여 Camera를 Move하는데,
150에서 80까지 일단 선형으로 이동하게 하였다.
내가 원하는 대로 느리게 줌인/줌아웃이 된다.
그리고 Track을 2개 따로 만들어서
다른 곡선을 타고 각각 진행되도록 한다.
그런데 문제가 있다.
처음 단 한번만 TimeLine대로 서서히 바뀌고,
그 이후로는 휙휙 바뀐다.
TimeLine - Play & Play from Start
https://forums.unrealengine.com/t/why-does-this-timeline-only-execute-one-time/394198
PlayFromStart를 하면 TimeLine의 진행상황을 다시 처음부터 실행하여,
Play와는 다르게 처음부터 수행이 된다고 한다.
Play
는 최초 단 한 번 실행.
정상적으로 서서히 aim되고 풀리는 것을 볼 수 있다.
추가로, 조준하지 않으면 팔을 내리고 이동하는 것도 볼 수 있다.
gif의 프레임 수를 줄여서 상당히 긴박하게 보이지만 정상동작.