컴퓨터 및 게임 관련 전공인이 아닌 문외한 일반인이 언리얼 엔진을 배우면서 정리한 내용입니다.
그날그날 배웠던 내용을 제가 나중에 보기 위해 정리한 것으로, 지금 당장 보기에 부족한 점이 아주아주 많고 추후에 수정이 될 수도 있습니다.
오탈자 및 잘못 기재된 내용 지적, 부족한 내용 설명은 언제든지 환영입니다.
본글은 언리얼 엔진 5.5.4 버전 영문판을 기준으로 합니다.
----------------------------------------------------------------------------------------------------------------
24일차에는 개인 포트폴리용 게임 기획서 작성하는 시간을 가져서 수업을 하지않았기에 생략합니다.
25일차 학습 내용
- 3인칭 액션 게임 제작
라이플 상태 시야 수정
라이플 꺼내는 애니메이션 추가
라이플 든 상태의 상하 방향 조준 애니메이션 추가
Line Trace 추가
매크로 정리
총 쏠 때 반동효과 추가
총 들고 구르는 애니메이션 추가
콤보어택
콤보어택에 대미지 추가
대미지 추가
공격 이펙트 추가
칼에 이펙트 추가
총에 이펙트 추가
연발 사격 추가
HUD 추가
오류 수정
3인칭 액션 게임 제작
라이플 상태 시야 수정
우선 총을 들고 다닐 때, 장비 미장착 시나 칼을 들고 다닐 때와 다르게 어색하였기에 수정해주도록 하겠다.

총을 들었을 경우에는 Spring Arm이 움직여 다른 상태와 비교했을 때 시야가 다르기에, 달라진 시야에 자연스러움을 주기 위해 카메라 설정을 총기 상태에서만 수정하였다.
다른 상태들과 다르게 "Use Controller Rotaion Yaw" 는 체크하고, "Orient Rotation to Movement" 는 체크를 해제해주었다.
라이플 꺼내는 애니메이션 추가

총을 든 상태로 이동할 애니메이션을 관리할 State Machine을 새로 생성하고 "Cached Pose" 노드와 연결해준다.

저번에 생성했던 Blueprint Thread로 들어가 "Property Access" 노드를 생성하고, 해당 노드를 플레이어 BP에 있는 "isRifle" 변수를 가져와 ABP에서도 사용가능하게 해준다.


그리고 생성한 State Machine에 들어가 우선은 밖에서 연결한 Cached Pose를 생성하여 연결해주고, 위 그림처럼 연결해준 뒤 각 조건에 "isRifle" 을 상태에 맞게 걸어주면 된다.

항상 해줬던 것처럼 Blend Space를 생성하여 위 그림과 같이 축 별 값 설정과 애니메이션을 삽입해준다.


Blueprint Thread로 들어가 "Property Access" 노드를 통해 플레이어 BP로부터 필요한 변수인 캐릭터의 속도와 회전값을 가져와준다.
각 값을 가져온 후 걷는 상태의 Blend Space에 위 그림과 같이 노드를 연결해준다.
이 상태로 컴파일 후 진행하다보면, 플레이어가 총을 꺼내고 걸어가다가 갑자기 앞으로 가는 속력이 느려지는 일이 발생한다.

위 그림과 같이 플레이어 BP로 가서 "Get Control Rotation" 의 벡터를 Split하여 축 별로 분리해주고, 각 축에 맞는 회전에 연결해주면 문제가 해결된다.


플레이어 BP에서 플레이어의 무장을 변경해주면서 해당 무장에 맞는 Enum에 연결해주면서 'isSword' 와 'isRifle' 을 각 상태에 맞게 True값이 되도록 설정해줘서, 다시 한 번 무기 착용 별 플레이어의 상태를 설정해준다.
라이플 든 상태의 상하 방향 조준 애니메이션 추가
우선 총을 들고 가만히 조준하는 상태의 애니메이션을 가져온다.

애니메이션을 일시정지 시키고 스켈레탈 쪽에서 'spine_5' 의 각도를 조절하면 위 그림과 같이 위 아래로 조준하는 동작을 만들 수 있다.
이 상태로 "Create Asset" 탭에서 "Create Animation" 의 "Create Pose" 를 누르면 해당 포즈가 그대로 저장되게 된다.

상하 조준 애니메이션을 관리할 Blend Space를 생성 후, 위 그림과 같이 위에서 새로 생성한 상하 조준 애니메이션을 배치해주면 얼추 비슷한 애니메이션을 만들어줄 수 있다.


Blueprint Thread로 들어가 "Property Access" 노드를 생성하여 상하 조준 애니메이션에 필요한 "GetBaseAimRotation" 노드를 플레이어 BP에서 가져오고, 위 그림과 같이 노드를 연결해준다.
"Layered Blend per Bone" 노드에 상하체를 구분해줄 척추인 'spine_1' 을 입력해주는 것도 잊지 않도록 한다.
위까지 작성 후 게임을 실행해보면 카메라 시점을 위아래로 이동 시 화면에 변화가 없는 것을 확인할 수 있다.

위 그림과 같이 "Use Pawn Control Rotation" 노드에 연결된 변수를 'Spring Arm' 이 아닌 총을 들었을 때 사용하는 'Spring Arm Rifle' 로 교체해주면 된다.
총을 들었을 때 사용하는 Spring Arm이 기존 카메라와 연결된 Spring Arm이 아니었기에 문제가 발생했던 것이다.
Line Trace 추가
우선은 총을 발사하거나 칼을 들고 공격할 공격키를 바인딩해주도록 하겠다.
늘 했던 것처럼 IA를 생성하고 IMC에서 키를 바인딩 해준다.


위 그림과 같이 Custom Event 노드에 라이플의 Line Trace Channel을 연결해준다.
이 부분은 여러번 했기에 자세한 설명은 생략하도록 하겠다.

위에서 생성한 Custom Event를 총을 장착한 상태에 연결해주면 총을 든 상태에서 공격 키를 누를 시 총알을 발사하게 된다.
*라이플에 손 붙이기

우선 캐릭터 스켈레탈 메시에 들어간다.
총을 받칠 손이 왼손이기에 'hand_l' 에 소켓을 새로 생성해주고, 손이 제대로 받쳐질 위치에 소켓를 옮겨준다.
즉각적으로 확인할 수 없기에 애니메이션을 재생하면서 확인해봐야한다.

AnimGraph로 돌아가 "Two Bone IK" 노드를 생성한 뒤, "IK" 의 "IK Bone" 에 총을 받칠 손안 왼손 ('hand_l') 을 입력해주고 "Effector" 을 "Bone Space" 로 수정해준다.


그리고 노드의 항목을 우클릭하여 "Expose As Pin" 을 눌러 'Alpha' 를 제외한 나머지를 없애주고 위 그림과 같이 "isRifle" 변수를 불러와 연결해주면, 왼손이 총을 받쳐주게 된다.

매크로 정리
플레이어의 상태 변화쪽 BP가 노드가 길어져서 복잡하므로 매크로를 사용하여 정리해주도록 하겠다.

뒤쪽의 공통된 노드들을 한꺼번에 선택한 후 "Collape to Macro" 를 통해 하나의 매크로로 만들어주고, 각 노드 별 변수를 "Input" 노드에 가져와 연결해준다.

위 그림과 같이 매크로를 끝에 생성하여 연결해주고, 각 상태 별로 맞게 체크해주면 된다.
총 쏠 때 반동효과 추가

총을 발사하는 BP의 뒷부분에 위 그림과 같이 노드들을 추가해주면 총을 쏘고 반동으로 화면이 흔들리는 효과를 줄 수 있다.
총 들고 구르는 애니메이션 추가
총을 들었을 경우 시점이 약간 변경되기에 일반 상태나 칼을 든 상태와 다르게 애니메이션을 주도록 하겠다.


위 그림과 같이 BP를 작성해주면 된다.
총을 들었을 경우와 아닌 경우 실행하는 Montage를 각각 다르게 해줬고, 이 경우 총을 들었을 구르는 Animation Montage를 따로 제작해줘야한다.
Montage 제작은 위에서도 해봤고 여러번 해봤으므로 생략하도록 하겠다.

그리고 위 사진과 같이 IMC로 가서 구르기 키 바인딩 쪽에 "Triggers" 를 눌러 "Chorded Action" 을 추가해줄 경우, 특정 상황에서만 구르기를 실행하도록 할 수도 있다.
"Chorded Action" 은 특정 버튼을 같이 누른 상황에서만 실행하도록 하는 것이다.
여기서는 "IA_Move" 를 넣어줬으므로 이동이 바인딩 된 키를 같이 눌렀을 경우에만 구르기를 실행하도록 하게 했다.
해당 ans구간에서 키 입력시 다음 실행
콤보어택
콤보어택과 관련된 애니메이션을 종합할 새로운 Animation Montage를 생성해준다.

위 사진과 같이 콤보어택 애니메이션으로 사용하고 싶은 순서대로 애니메이션을 배치해주고, 우측 하단의 화살표를 눌러 "Remove Link" 까지 실행해준다.

칼을 장비했을 때 애니메이션을 재생할 새로운 Custom Event 노드를 생성하고 "Play Montage" 노드를 연결하여 위에서 생성한 Montage를 넣어준다.
그리고 "Delay" 노드를 통해 클릭할 때마다 계속 첫 애니메이션이 나오지 않도록 해주고, 'isAttacking' 변수 상태를 false로 만들어 초기화해준다.

저번에 생성해뒀던 "isPoseAction" 매크로에 위에서 생성한 'isAttacking' 노드를 연결해준다.
위의 "or" 노드는 연결된 상태 중 하나라도 해당 될 경우 아무것도 동작하지 않도록 설정해주는 것이다.

위 그림과 같이 "Character Speed" 변수를 생성하여 움직임을 관리하는 BP에 연결해준다.


"Character Speed" 변수를 칼을 휘두르는 애니메이션 재생 시 '1' 의 값으로 설정하여, 칼을 휘두르기 시작한 첫 애니메이션이 재생될 때 앞으로 순간적으로 전진하는 효과를 줄 수 있다.
애니메이션 재생 후 "Character Speed" 변수를 '0' 의 값으로 다시 돌려줘서, 콤보 공격 중에는 더 이상 앞으로 이동하지 않게 하는 효과를 줄 수 있다.

위에서 했던 방법 말고도 위 사진과 같이 TL의 Finished에 "Character Speed" 변수를 '0' 의 값으로 줘서 이동을 막을 수도 있다.

위 그림과 같이 "Last Input Vector" 노드를 추가하여 BP를 작성해주면, 앞키를 입력했을 경우에만 앞으로 이동하며 공격하게 할 수도 있다.
이젠 마우스를 누를 때마다 콤보 단계가 진행되며 애니메이션이 바뀌는 효과를 줘보도록 하겠다.


우선 "Anim Notify State" BP를 생성해주고, 위 그림과 같이 콤보 어택 BP의 "Play Montage" 노드의 'Starting Section' 을 변수로 만들어준다.


생성한 "Anim Notify State" BP를 실행하여 "Notify Begin" 과 "Notify End" 를 "Override" 를 눌러 생성해주고, 위 그림과 같이 BP를 작성해준다.
위 BP는 캐릭터에 Notify State를 부여해주는 것이다.

콤보 어택 용으로 제작한 Montage로 들어가 우클릭으로 "Add Notify State" 를 누른 뒤 위에서 생성한 "Anim Notify State" BP로 선택해준다.

그러면 위 그림과 같이 키가 추가되는데, 해당 키의 지속시간 중에 키 입력이 들어올 경우 콤보 어택의 다음 애니메이션으로 진행되게 해주는 것이다.
자신이 넣어주고 싶은 애니메이션의 시간에 원하는 시간 길이만큼 주면 된다.

각 단계 별 애니메이션에 하나씩 넣어주고, "Combo Section" 에 다음에 진행하고 싶은 애니메이션의 Montage를 입력해주면 된다.


콤보 어택 실행 용 Custom Event로 돌아가 앞 부분을 위 그림과 같이 TL이 들어간 새로운 Custom Event로 만들어주고, 콤보 어택 실행 용 Custom Event는 위 그림과 같이 바꿔준다.
Starting Section의 이름과 진행 중 애니메이션이 같을 경우 다음 콤보 어택을 진행 시키는 것이다.

마무리로 전체적인 공격을 관리하는 BP쪽으로 가서 뒤쪽에 TL이 들어간 새로운 Custom Event를 연결해준다.
콤보어택에 대미지 추가

우선 플레이어 BP로 가서 칼의 스태틱 메시에 위 그림과 같이 Capsule Collision을 덮어씌워준다.
Capsule Collision 크기는 큰 편이 좋고, 위 그림과 같이 너무 작거나 칼의 크기과 딱 맞출 경우 충돌 판정이 잘 안 생기기에 적당한 크기로 키워서 하는 편이 좋다.

Event Graph로 넘어가 Capsule Collision의 충돌 판정과 관련된 Custom Event를 새로 생성해주고 위 그림과 같이 BP를 작성해준다.
자기 자신을 제외한 것들에는 충돌 판정을 일으키고, 자기 자신에게는 충돌 판정을 일으키지 않도록 하는 BP이다.
그리고 콤보 어택 Montage에 충돌 판정을 추가할 새로운 "Anim Notify State" BP를 생성해준다.

생성한 "Anim Notify State" BP를 열고 'Notify Begin' 쪽에 위 그림과 같은 BP를 작성해준다.
플레이어 BP에서 생성한 Collision Custom Event를 불러오는 것이다.

콤보 어택 Montage로 돌아가 위에서 콤보 어택 시간을 부여했던 것처럼 이번엔 충돌을 일으킬 구간을 위 그림과 같이 설정해준다.
판정 시간을 너무 짧게 하지 않아야하고, 애니메이션을 보면서 칼을 휘두를 때에 충돌 판정을 넣는 편이 좋다.
대미지를 주는 애니메이션을 만들었으니, 이번엔 대미지의 수치를 부여해주고 대미지를 통해 깎을 체력을 생성해보도록 하겠다.

플레이어 BP로 가서 위 그림과 같이 BP를 작성해준다.
체력을 설정해주고 대미지를 입을 때마다 체력에서 입은 대미지만큼의 수치를 빼며 피격 상태라고 표시하며, 체력이 '0' 이하로 될 경우 해당 캐릭터의 충돌 판정을 없애버리며 사망 판정을 선고하는 BP이다.
'Health' 변수에 최대 체력 수치를 적어서 넣는 것을 잊지 않도록 한다.

피격 상태 메세지가 출력되는 걸 확인하고, 위 그림과 같이 피격 상태 Motage를 넣어준다.
이번엔 사망 관련 애니메이션 설정을 해보도록 하겠다.

Blueprint Thread로 들어가 "Property Access" 노드를 생성하고, ABP에서 사용할 "Get Base Aim Rotation" 변수를 가져온다.

ABP에서 죽는 애니메이션과 죽음 상태를 감지하는 "Die Catch" 라는 이름의 Alias를 하나 생성한 뒤, "Die Catch" 에서 죽음 상태로 넘어가는 조건에 'isDie' 를 넣어준다.
그리고 Alias를 클릭하여 죽는 상황을 제외한 모든 상황에서 "Die" 로 넘어올 수 있게 우측 상단에서 체크해준다.
*충돌 판정이 잘 안 생겨서 피격 상태로 넘어가지 않을 경우, "Begin" 에서 "Tick" 으로 변경하는 것도 나쁘지 않음; 이럴 경우 매 틱마다 대미지가 들어가기에 대미지 수치를 많이 낮춰줘야함
다만 원래는 "Begin" 으로 하는 게 맞음; 무기 휘두를 때 판정시간 널널히 하고 Capsule Collision을 크게 함
대미지 추가
대미지는 "Apply Damage" 노드를 통해 쉽게 추가해줄 수 있다.

칼을 휘두를 때 칼에 있는 Capsule Collision이 충돌 효과를 일으켜야 대미지를 줄 수 있기에, 칼에 충돌을 부여한 Custom Event에서 "Apply Damage" 를 연결하여 대미지를 줄 수 있다.
대미지를 낮게 설정한 이유는 칼의 충돌 판정이 잘 들어가지 않아 임시로 "Tick" 에 연결해줬기 때문이다.

총 또한 마찬가지로 Trace 이후에 "Apply Damage" 를 적용시켜주면 Trace에 적중한 액터에게 대미지를 줄 수 있다.
공격 이펙트 추가
칼에 이펙트 추가
칼을 꺼내 휘두를 때 Niagara 효과를 줘서 휘두를 것을 심심하지 않게 보이게 할 수 있다.

칼 메시에 넣어주고 싶은 Niagara를 자식 액터로 추가해주고, Niagara의 "Auto Activate" 를 해제해준다.
무기를 꺼내지 않은 상태에서도 Niagara를 주고 싶은 경우엔 "Auto Activate" 를 켜주면 된다.

칼을 꺼내 휘두를 때 Niagara 효과를 주고 싶은 상황이기에, 칼을 휘두를 때 Niagara를 활성해시켜주는 노드를 연결해주면 된다.

이러면 칼을 휘두를 때 Niagara 효과가 나오는 것을 확인할 수 있다.
총에 이펙트 추가

총구에서 빛과 연기가 나는 효과를 주기 위해 위 그림과 같이 총구쪽에 Arrow를 배치해준다.

위 그림과 같이 "Spawn System Attached" 노드를 Arrow 쪽에 연결해줘서, Niagara 효과가 총구에서 나오도록 할 수 있다.

연발 사격 추가
총의 발사를 연발로 하고 싶을 경우, 단순하게 IA에서 Started에 연결하는 것이 아닌 하여 연발 효과를 줄 수 있다.
하지만 이렇게 할 경우 정말 무수히 많은 Trace가 생성되기에 Triggered에 연결만 하여 사용하는 방법은 추천하지 않는다.

우선은 마우스를 일일이 클릭해주지 않고 좌클릭을 누르기만 해도 발사 가능하도록 일단은 Triggered에 연결해준다.

그리고 위에서 활용했던 TL을 이용해 위 그림과 같이 노드를 배치해주면, 마우스를 꾹 누르고만 있을 경우 TL의 지정된 시간마다 발사하게 된다.
HUD 추가
총을 들었을 때 조준하기 편하도록 크로스헤어 Widget을 생성해보도록 하겠다.
크로스헤어 WBP는 저번 1인칭 게임을 제작할 때 만들어본 적이 있으므로 생략하고 넘어가도록 하겠다.
(18일차 참고)

WPB를 생성하고 플레이어 BP로 넘어와 위 그림과 같이 BP를 작성해주면 된다.
총기를 들었을 경우에만 WBP가 Viewport에 출력되고, 그 외의 상황에서는 출력되지 않도록 한 것이다.
여기까지만 BP를 작성했을 경우, 총을 꺼냈다가 다른 상태로 변경했을 경우 크로스헤어가 사라지지 않고 그대로 남아있게 된다.

그렇기에 위 그림과 같이 장비 상태를 변경할 때 HUD 표시를 설정해주는 것으로 마무리 해줘야한다.
오류 수정
무기 교체 시 다른 무기 교체 버튼을 연타할 경우 계속 교체 애니메이션을 재생하는 오류가 있다.

이 경우 우선은 장비 교체 중임을 나타내는 변수인 "isEquip" 을 추가하여 해당 상태일 때 다른 행동을 하지 못하도록 해줄 수 있다.

위에 이어서 장비 상태를 변경하는 BP에서 시작 시점과 종료 시점에 'isEquip' 상태를 부여해줬다.

마지막으로 "isEquip" 이 종료된 걸 확인하고 난 후에 장비 상태를 교체할 수 있도록, 장비 상태 변경 BP 앞 부분에 'isEquip' 을 확인하는 노드를 추가해줬다.
총을 들었을 때 사격하고 난 후, 아무 장비를 하지 않은 상태로 변경할 경우 총기에서 지속적으로 발사가 가능한 오류가 있다.

이 오류는 총을 들고 있는 상태를 초기화 해주지 않아서 발생한 것이기에, 총을 들고 있는 상태를 나타내는 "isRifle" 변수를 생성하고 위 그림과 같이 노드를 연결하여 총을 직접 들고 있지 않은 상태에서는 사격이 불가하도록 만들어줬다.
하늘을 향한 채고 사격할 경우 더 이상 총 사격 불가능한 오류가 있다.

이 오류는 Trace에 히트 된 것이 없는 경우에 부여된 명령이 없기에 발생한 것이다.
그렇기에 Trace에 히트 된 것이 없는 때에도 뒤쪽에서 'isAttacking' 을 초기화 해줌으로서 다시 발사가 가능하게 해줬다.
'Unreal Engine > GCC Class (5.5.4)' 카테고리의 다른 글
| Unreal Engine 5 배워보기 - 27일차 (0) | 2025.04.25 |
|---|---|
| Unreal Engine 5 배워보기 - 26일차 (0) | 2025.04.24 |
| Unreal Engine 5 배워보기 - 23일차 (1) | 2025.04.21 |
| Unreal Engine 5 배워보기 - 21일차 (0) | 2025.04.15 |
| Unreal Engine 5 배워보기 - 20일차 (2) | 2025.04.14 |