함수 노드의 종류
일반 함수(Funtion / 파란색)
- 실행 핀이 있음
- 클래스, 상태를 자유롭게 변경이 가능
순수 함수(Pure function / 초록색)
- 실행 핀이 없음
- 데이터, 상태를 변경하지 않음 → 항상 동일한 데이터를 가져온다는 보장이 있음
- 현재 필요한 데이터를 가지고 와야 할 때의 경우가 많음 (ex : Get / 조작, 가공하는 노드가 아님)
1. 정적인 NPC(의자에 앉기, 서있기)
1) NPC 제작
- Controller → AI가 제어함
- Animation → Locomotion(Idle, Walk), Sitting
2) 동작 만들기
- Mixamo에서 애니메이션 가져오기
- 5개의 캐릭터를 가져온 후 파일 정리(Skeleton은 Mesh 폴더 안에 넣기)
- NPC들의 Blueprint Character를 만들어야 함
- Character Blueprint의 편집창에 들어가 Mesh Component에서 Leonard 캐릭터를 불러옴
- Capsule Component를 선택해서 Capsule Half Height 사이즈를 확인(88), Mesh Z 위치를 -88로 하면 바닥에 딱 맞춤
- 캐릭터 Z축 위치를 -90으로 맞춰 앞을 바라보는 파란색 화살표와 위치를 동일하게 함
- 머리카락이 잘 안보일 때는 Mesh Component 내 헤어 Element Material 편집창에 들어가서 텍스쳐 하나를 Alpha와 Opacity를 연결
- 반복 동작은 Use Animation Asset을 선택해 애니메이션을 넣어줌
- Blueprint Character를 Viewport에 꺼내 배치하기
- 위와 같은 방법으로 여러 개의 NPC 제작 후 배치
2. 동적인 NPC(걸어가기)
디테일하지는 않지만 심플하게 쓸 수 있는 방법
- Character Blueprint 내 편집창에서 Use Animation Blueprint 사용
- Character를 돌아다니고 멈추는 등의 상태로 만들 것 → 컨트롤러로 제어하고 AI로 움직이게 함
- EventGraph로 이동해 AI MoveTo 노드를 사용
- 게임 시작하자마자 움직이게 할 것 → Event BeginPlay
- 현재 위치 : Get Actor Location / 랜덤한 움직임 구현 : Get Random Reachable Point In Radius → 이 두 노드를 Origin에 연결해 돌아다니는 캐릭터의 현재 위치를 랜덤하게 함
- Radius 1000정도 설정
AI MoveTo
- Pawn : 외부 입력을 받을 수 있는 Blueprint Class. 여기에서의 Pawn은 외부 제어로 움직이는 객체 → self 를 연결(나 자신을 움직이기)
- Destination : Random(불규칙)한 목적지로 설정. 움직임이 게임 실행 동안 지속적으로 업데이트(목적지가 계속 업데이트 되어야 한다는 의미로, 돌아다니는 캐릭터의 현재 위치를 파악해야 함)
- Acceptance Radius : 움직임의 반경
- Stop on Overlap : 충돌 영역에 닿으면 멈추게 할 것인가
- 실행해도 아직 움직이지는 않음 → 돌아다녀야 하는 영역을 표시해야 함(이동 영역)
- Nav Mesh Bounds Volumn 추가, 바닥과 겹쳐지도록 배치
- P를 누르면 초록색 영역이 보임 → NPC의 이동 영역이 됨
- 반복 실행
- for loop 노드 : 동시 실행
- 시간 흐름에 따른 반복 : 30FPS → Event Tick / Timeline 노드
- 하나의 동작이 끝나고 나서 반복 : 재귀 실행(한 사이클의 실행이 끝나면 동일한 루팅을 다시 실행)
- 끝나고 나면 다시 실행하도록 AI MoveTo 내 OnSuccess에 동일하게 반복 실행할 수 있도록 하기
- Custom Event로 NPCWalk 생성 후 연결
- 시작하자마자 NPC Walk가 실행되고, 아래의 노드로 반복 실행되도록 함 → 계속 반복적으로 움직임
- 재귀 실행 NPCWalk 노드 전에 잠깐의 텀을 주는 노드 넣기 → Delay
- 자연스러운 불규칙함을 위해 Random Float in Range 노드를 Delay duration에 넣어주기
- Random Float in Range : 범위를 지정하면 그 안에서 다양한 숫자가 랜덤으로 생성됨
- 한 곳에 머무는 시간이 좀 더 길어짐
- 그러나 캐릭터의 움직임의 속도가 빨라 조정할 필요가 있음
- Character Movement에서 Character Blueprint의 최대 속도, 최저 속도를 확인
- EventGraph에서 지정해주기
- Character Movement와 Set Max Walk Speed 연결
- 전체 맵 내에서 움직일 수 있도록 Nav Mesh Bounds Volumn 공간 덮기
- Animation Blueprint 만들기. Mixamo_Bot_Skeleton 선택
- AnimGraph : 상태를 만들어줌. 서있거나 걸어다니는 두 가지 동작만 만듦 → Locomotion만 있으면 됨
- State Machine : Locomotion 만들기. 더블 클릭으로 들어가서 Add State (Idle, Walk)
- Idle State 더블클릭 → 제자리에서 움직이는 모션
- 마네킹 애니메이션으로 가서 걷는 모션 Walk_Fwd를 Mixamo_bot을 타겟으로 Retargeting
- 완료한 애니메이션 Walk, Idle 애니메이션을 Locomotion으로 연결(둘 다 Loop Animation 체크)
- 상태를 전환하는 조건 만들어주기
- 변수 만들기 → ShouldMove
- 윗 부분의 상태 전환에 변수 연결(Idle to Walk)
- 아래 부분의 상태 전환에는 not boolean을 껴 넣어 변수 연결(Walk to Idle)
- EventGraph에서 제어하기
- 동작 여부 체크 : ShouldMove → Speed → Velocity
- Try Get Pawn Owner : 그 안에 있는 컨트롤러 데이터를 쓰고자 함
- 속도(Velocity)를 가져와서 속력(Vector Length)을 추출함. 3보다 큰 지 비교함 → 움직임만 체크하면 됨
- Blueprint Character에 애니메이션 블루프린트(ABP_Mixamo) 할당
- 목적지까지 가는 중간에 장애물을 만났을 때 멈춰야 할 때는 Character Blueprint의 EventGraph의 AI MoveTo에서 Stop on Overlap 체크하기
- 좀 더 상세하게 하려면, Acceptance Radius 200 → 반응 영역 2m정도 / 그래도 제자리 걸음의 경우가 있음
- Event ActorBeginOverlap으로 장애물이 있으면 멈추도록 다시 설정
- Nav Mesh Bounds Volumn을 여러 개 만들어 영역을 지정해 NPC들이 그 곳에서만 움직이도록 하기
3. 애니메이션에 소품 적용하기(Socket)
애니메이션으로 움직이는 캐릭터에 가방을 쥐어주도록 해보자
- Skeletal Mesh 편집창에 들어감
- Skeletal tree의 right hand 찾아서 Add Socket
- RightHandSocket이 생긴 것 확인
- RightHandSocket 우클릭 Add Preview Asset 클릭으로 미리보기
- Character Blueprint로 이동해서 StaticMesh Component 생성 후 Mesh 하위에 넣어주어야 Parent Socket을 설정할 수 있음
- ParentSocket에 RightHandSocket 지정 후 Static Mesh 선택
- Skeletal Mesh 편집창의 Preview 위치를 맞춰주면 Blueprint의 위치가 맞춰짐
- Blueprint Character 편집창에서 디테일하게 수정
'4. 언리얼 엔진(Unreal Engine) 공부 > Unreal Engine [이론]' 카테고리의 다른 글
25. [UE5] Dialogue 대화 기능 구현 - 작성중 (0) | 2024.11.11 |
---|---|
23. [UE5] UI Interaction(Widget) (0) | 2024.10.30 |
22. [UE5] 다른 액터와 캐릭터가 상호작용 하기(Overlap, CutScene, LevelBlueprint) (1) | 2024.10.23 |
21. [UE5] 블루프린트를 위한 프로그래밍 기초 (1) | 2024.10.18 |
20. [UE5] 블루프린트를 활용한 캐릭터 움직임 제어 (0) | 2024.10.14 |