1. 충돌영역 설정 및 이벤트 발생
1) Overlap
- BP_Overlap으로 Blueprint Actor 생성
- 편집창에서 Box Collision을 최상위 Component로 하고, 하위에 Cube를 넣고 Z Scale를 0.1로 줄임
- Collision 사이즈를 늘려 다음과 같은 Overlap 영역 지정
- Overlap 이벤트가 발생할 때(이벤트 감지), 어떤 반응을 일으킬지 구현해보자
- EventGraph에 적용하고 싶은 대상에 적용 → Event ActorBeginOverlap
- Cube에 떨어졌다가 다시 다가가야 Overlap이 발생함
객체 지향 프로그래밍
충돌 체크로 이벤트가 발생되는 상황에서 캐릭터에 반응을 하고 싶을 때, 캐릭터(대상에 직접)에 직접 프로그래밍을 하는 것
- Cube 위에 올라가면 Sphere가 떨어지도록 해보자
- 충돌체를 여러 개 사용하려면 DefaultSceneRoot가 필요함
- 계층 구조, 포함 관계를 잘 구분해줘야 함
- DefaultSceneRoot가 있으면 Billborad가 보임
- Set Actor Location은 BP_Pawn 자체를 움직이기 때문에 Actor 전체를 제어
- 현재 위치 기준으로 Now Location 입력하기 (각각 50만큼 이동)
- Cube 위로 올라가니 위치가 변경 되지만 Sphere만 위치를 변경하려고 했던 처음 목적과 다름
- Sphere만 움직이는 API를 찾아야 함
- 세 개의 노드를 비교하면 각각 타겟이 다름
- Set Actor Location : 타겟은 액터 전체
- Set Relative Location / Set World Location : 액터 전체가 아닌 Blueprint Actor 안에 있는 Component 하나하나를 제어
- Set World Location 사용 : Level 공간에 있는 World 좌표의 원점을 기준으로 함
- 기준을 잡기가 불편하기 때문에 계산이 어려워 적절하지 않은 API
- Set Relative Location 사용 : Actor가 배치된 좌표 위치에서 Actor 원점을 기준으로 새로운 위치를 설정
- Event ActorEndOverlap : 박스에 내려갔을 때 원래 위치대로 돌아오도록 하기
- 이벤트 발생 시 애니메이션으로 좀 더 부드러운 움직임 구현하기
- Timeline 노드 생성 후 편집창에서 +Track → Add Float Track → 키를 생성할 위치에 우클릭으로 Add key to CurveFloat_0
- 가로축은 시간, 세로축은 값
- Time과 Value는 모두 0으로, 길이는 1초로 맞춰야 하기에 Length를 1로 바꿈
- 증가하는 초 당 실행을 Update(실행핀)가 이벤트를 발생시킴
- Timeline에 생성된 Track의 이름을 바꾸면 노드 내 핀의 이름도 바뀜
- 핀을 나눠서 X, Z Location에 연결
- 0에서 튀어나와 1까지 증가하는데, 값이 너무 작아 값을 보정해야 함 → multiply (내가 원하는 간격)
- 애니메이션의 값도 보정이 필요
- New Location이 Sphere의 위치인 x축 100정도에 시작해야 함
- 값을 키우기 위해 Multiply를 해야하는데 Add보다 앞에 노드를 넣어야 함
- 위치가 변하지 않게 하기 위해
- 0에서 10까지 증가하겠다(100cm이동)
- Timeline으로 보정할 땐, 그래프를 조정하고 노드를 옆과 같이 바꿈
- 위치 이동 애니메이션에서는 등속도 / 감속 / 가속이 필요
- 많이 사용하는 EaseIn
- 발판에 내려갈 때 Sphere가 다시 원래대로 돌아오도록 하려면, Event ActorEndOverlap을 Reverse와 연결하면 역으로 재생해서 다시 돌아옴
- 올라갈 땐 감속 , 내려갈 땐 감속
2) 여닫이 문 인터랙션 및 애니메이션
- Blueprint Class Actor 생성 후 편집창으로 이동
- Blueprint 안에 만들어진 메쉬를 가져오고 싶으면 Add → StaticMesh (가져올 수 있는 틀)
- 프레임을 먼저 가지고 오고, 앞을 바라보는 방향을 X축으로 함
- 동일한 계층에 StaticMesh를 추가하고, 문짝을 가져옴
- 문짝의 위치를 잡아주기
- 충돌하면 애니메이션이 작동되는 영역인 Collision 영역을 만들기
- 캐릭터가 문 앞에 있으면 충돌 영역을 감지해야 함 → 문 틀을 벗어나지 않는 범위에서
- EventGraph로 문이 열리도록 함
- 미닫이 도어는 위치 이동 노드, 여닫이 도어는 회전 노드가 필요
- Set Relative Rotation(door)를 가져오면 따로 door 노드를 가져올 필요 없이 바로 연결 시켜줌
- 문이 급진적으로 열리기 때문에 *(Multiply) 노드를 사용해 부드럽게 열리도록 함
3) 두 개의 다른 Blueprint를 연결해 인터랙션(제어)
- Cube Blueprint / Cone Blueprint 만들기
- Cube Blueprint가 Cone Blueprint의 존재를 알 수 있도록 함 → Blueprint Class의 정보를 가져옴(Get Actor Of Class)
- 새로 Cube Blueprint / Cone Blueprint 만들고, Timeline도 생성해 다음과 같이 설정
- 위치가 실행될 때마다 다르게 배치되면 값이 계속 바뀌기 때문에 숫자를 바로 더하기가 어려움 → 액터의 현재 위치를 가져옴(Get Actor Location)
- Cone의 현재 위치를 가져와야 하기 때문 Target이 Self가 되면 안됨 → BP Cone으로 설정한 Get Actor Of Class의 Return Value를 Get Actor Location 그리고 Set Actor Location Target과 연결
Get Actor Of Class에서 Target을 Cone으로 해 Blueprint 정보를 가져오고, 거기서 Cone의 위치 정보를 받기 위해 Get Actor Location을 Return Value에 연결
- Split Struct Pin으로 Vector 값을 분리하고, 다음과 같이 노드를 추가하고 연결
- 0~1 사이의 값을 100으로 곱해주고 이동 값을 더함(Y는 기존 값을 그대로 사용)
- 값을 조절하면서 원하는 위치로 맞춤
- Event ActorEndOverlap 노드를 추가하고, 다음과 같이 구성 → 대신 한 번만 가능 (반복해서 왔다갔다는 불가). 업데이트가 한 번 진행되고 멈춤
- Subtract 노드는 핀의 위치에 따라 값이 달라지기 때문에 주의해서 사용(빼줘야 할 값을 상단 핀에 위치)
물리 적용을 Blueprint로 제어
- Get Actor Of Class에서 Set Simulate Physics 연결하고, Simulate 체크
- 물리가 적용되어 떨어질 때 중력이 느껴짐
충돌 영역에 다가가면 Material 적용하기
- Overlap용 Cube Blueprint와 Material이 적용될 Cylinder Blueprint 두 개 만들기
- Material을 만들고, Set Material 노드에 해당 머티리얼을 적용
2. 일정 장소 도달 시 재생되는 컷씬 만들기
1) 컷씬 원리 익히기
- 캐릭터가 어느 위치에 도달했을 때 카메라가 움직이는 컷씬 만들기
- CutScene 폴더를 만들어 Level과 Sequence 파일을 저장
- 계단 에셋을 구해 편집창으로 이동해 Collision → Auto Convex Collision으로 대략적인 충돌 영역 만들기
- Blueprint Actor로 Trigger Box를 만들어 특정 위치에 놓고, 그 위치에 도달하면 Overlap 이벤트 발생(애니메이션 실행)
- Camera Rig Rail로 컷씬 용 영상 만들기
- Open Level Blueprint를 열어 컷씬 플레이 모드를 제어하기
- 아웃라이너에서 BP_TriggerBox 선택 후 EventGraph에서 On Actor Begin Overlap을 생성하면 해당 Blueprint와 연관된 노드가 생성됨
- On Actor Begin Overlap은 Event Actor Begin Overlap과 성격은 같지만 명칭이 다름
- 아웃라이너에서 Sequencer를 Blueprint EventGraph로 드래그
- 아래는 가장 기본은 Sequencer 플레이로, 트리거에 다가가면 컷씬이 플레이 되지만 진행 중에 플레이 캐릭터가 움직여짐 → 대체적으로는 컨트롤할 수 없게 하는 것이 일반적
- Sequencer가 재생되는 동안 메인 캐릭터를 컨트롤 할 수 없게 하자
- 충돌 반응을 일으켰을 때, 자기 자신(self) 외의 Other Actor 는 상대방을 의미
- Overlapped Actor : Event를 추가할 때 선택한 Actor
- Other Actor : Event 발생 시 상대 Actor
- 컨트롤을 못하게 하려는건 Other Actor(Character) → Disable노드에 연결. 키보드, 마우스의 Input 입력이 안됨
- 플레이 다음으로 키보드 입력이 Enable하도록 만들어야 함
- 진행 시간은 Duration, 진행되는 동안에는 기다리기
- 특정 구역을 지나갈 때 컷씬이 재생된다면 한 번만 보여지도록 → Do Once
전체 노드 및 주석 정리
- 움직임을 막고 플레이하는 것이 논리에 맞기 때문에 Disable Input을 Play 노드 뒤에 놓기
- 타겟은 Other Actor(Character)
- Play가 끝나면 다시 캐릭터가 움직일 수 있도록 Enable Input을 넣지만 컷씬이 끝날 때 까지 기다려야 하기 때문에 Delay 노드도 추가
- Duration에 재생 시간을 일일이 바꾸고 기입하는 것이 번거롭기 때문에 값을 직접 입력하지 않고 Sequencer의 플레이 타임만큼을 기다리도록 Sequence Play 객체에서 Get Deuration 연결
- 두 개의 데이터 타입이 다르지만 연결하면 QualifiedFrameTime To Seconds 노드가 자동으로 추가 → 프레임 시간에서 초 시간으로 바꿔줌
- 계속 실행되지 않고 최초 한 번만 실행하도록 만드는 Do Once
2) 게임 시작 후 바로 시작되는 인트로 컷씬
- 캐릭터 애니메이션을 위해 Mixamo에서 캐릭터와 애니메이션 다운로드
- Sitting / Sit to Stand / walking / Left Turn (처음 것만 with skin 그 외는 without skin으로 다운)
- Walk는 Trim으로 네 걸음 정도로 늘려야 Blend Animation이 잘 됨
- 앉아 있다가 걸을 때 방향 전환이 필요하기 때문에 Left Turn을 넣고, Trim을 오른쪽으로 끝까지 늘림
- 파일 이름들 정리
- 메인 캐릭터의 인트로 컷씬이 끝나면 바로 플레이가 가능하도록 구성
- 컷씬을 위한 Sequencer에 Player Start Actor가 아닌 Skeletal Mesh를 넣어야 함
- 시퀀서 애니메이션에 사용해야 할 Actor / Camera : Skeletal Mesh / Cine Camera
- 게임 플레이에 사용해야 할 Actor / Camera : Character Blueprint / Camera
Sequencer에 Cine Camera, Camera 모두 사용이 가능하지만, Camera는 컷씬에서 게임으로 자연스럽게 이어질 수 있다는 장점이 있음
Player Start Actor를 사용하지 않고 Blueprint Character Class를 사용하기기
- Character Blueprint Class를 직접 뷰포트 이동 및 배치
- 디테일 패널에 pawn을 검색하면 pawn actor 관련 항목들이 뜸(pawn의 속성을 charcter도 가지고 있음 → 자식이기 때문에 상속받음)
- Auto Possess Player를 player 0으로 하면 우선권을 가짐
- Auto Possess Player : Game에서 메인 캐릭터 플레이어의 소유권을 자동으로 생성되는 Player가 아닌 레벨에 배치한 Character Blueprint에 소유권을 적용하는 기능
- 배치한 Character Blueprint로 바로 플레이 가능
- 애니메이션을 모두 꺼내 연결시키고 블렌드 하기
- Blending 되는 부분이 어색하면 Show Skeletaon으로 확인
- 간격 때문에 분홍 Skeletal이 초록 Skeletal이 훅 넘어가는 것 처럼 보임
- 앞으로 시작될 초록색에 맞춰져야 하기 때문에 Walking 애니메이션 우 클릭 Match With This Bone In Previous Clip 으로 root / pelvis 둘 중 알맞는걸로 선택
- 애니메이션을 모두 적용
- Skeletal Mesh의 Collision에 Character Blueprint의 Sprint Arm이 인식되므로 Skeletal Mesh의 디테일 패널에서 Collision을 검색해 No Collision으로 설정
- 컷씬에서 바로 플레이까지 자연스럽게 이어지도록 하기 위해 일반 카메라 사용 → Camera 검색후 Camera Actor 추가
- Sequencer에 넣고 애니메이션 만들기
- 시작되면 바로 인트로 컷씬이 실행되도록 Level Blueprint를 열고 Event BeginPlay 노드 생성
- Play 노드를 생성하고 인트로 컷씬 Sequencer를 불러와 연결
- Do Once는 필요 없음
- 컷씬 재생 시 플레이하는 캐릭터가 2개가 보임(서 있는 건 Character Blueprint → 인풋 동작도 함)
- Disable Target에 캐릭터를 가져와서 연결하는 건 어렵기 때문에 다른 방법 진행
- Sequence의 디테일 패널의 Cinematic 항목에서 세 가지를 체크하면 다음과 같이 노드 제 셋팅(Disable, Inable Input 노드 삭제)
- Disable Movement Input
- Disable Look at Input
- Hide Player
- 그리고 인트로 컷씬이 끝나면 Skeletal Mesh가 안사라지고 계속 보이기 때문에 노드를 재 설정해야 함
- Skeletal Mesh를 EventGraph로 가져와서 Destroy Actor
- 컷씬과 플레이가 자연스럽게 이어지도록 Camera Cuts 우클릭 → Can Blend 체크
- 끝 쪽에 자연스럽게 Blending 되도록 Blend
- 시퀀스 재생 영역을 맞춘 후 플레이하면 영역 만큼 재생 후 바로 게임 플레이 가능
레벨 일부의 문을 열기
- 테스트를 위해 캐릭터를 문 쪽 위치로 Play from here이 가능하도록 하려면 Character Blueprint를 잠시 Auto Possess Player를 Disabled로 변환
- 문을 열기 위한 Blueprint 만들기
- Static Mesh Component를 추가 후 Door로 이름 변경, Static Mesh를 지정
- 중심이 중간에 있어 문이 열리도록 하는 데에 어려움이 있음 → 이에 대한 방법 2가지
1번 방법
- Billboard가 Blueprint의 중심이기 때문에 위치를 맞춰주면 그 쪽으로 기즈모를 변경 가능(Blueprint 원점 활용)
2번 방법
- Content Browser에서 기존 문 복제 후 레벨에 꺼냄
- 선택 상태에서 Modeling Mode로 이동해 XForm → Edit Pivot에서 피봇 위치 변경(원본에도 그대로 적용됨)
- 복제 한 Static Mesh를 Blueprint 의 Static Mesh로 변경
- Collision 영역 설정을 위해 Box Collision을 추가하고, 충돌 영역에 맞춰 사이즈 변경
- EventGraph에서 문이 열리는 것에 대한 Blueprint 구성
- 기존 문을 Blueprint Actor로 교체
- Set Relative Rotation으로 Z축을 기준으로 현재 위치에서 회전 값을 변경하도록 함(Z 값 90)
- 문이 열릴 때 자연스러운 애니메이션이 구현되도록 Timeline 노드 생성 후 DoorValue라는 트랙 생성
- 문이 닫힐 때를 위해 Event ActorEndOverlap도 생성하고, 속도 조정을 위해 * 110
- 반대로 열리게 한다면 110을 -110으로 변경
- 안쪽으로 들어갈 수 있도록 기존의 벽에 적용된 Block All → No Collision
- Event ActorEndOverlap이 발생되면 Delay 실행으로 캐릭터가 충돌 영역을 벗어난 후 3초 있다가 문이 닫히도록 함
- 카메라까지 다 지나간 후 문이 여유있게 닫힘
트램 움직이기
- BP_Trigger_Tram이라는 Trigger용 Blueprint Acotr 생성 후 뷰포트에 추가
- Tram Mesh를 하나로 묶어야 함(몸체, 문, 포인트라이트) → Blueprint로 불러와 조립하기
- BP_Tram을 만들어 Blueprint에서 Static Mesh Component를 추가해 Tram 요소들 불러와 조립하고 뷰포트에 배치
- Trigger의 Blueprint EventGraph 설정
- Trigger에 다가갔을 때, 위치가 앞뒤로 이동되도록 함
- X 방향으로만 100만큼 이동하도록 하고, 나머지는 현재 위치로 설정
- 타임라인은 움직임 - 멈춤 - 움직임 반복
- 처음 실행 될 때 Get Actor Location이 한 번만 실행될 수 있도록 함 → 현재 위치가 계속 업데이트 되서 계속 이동되기 때문
- 보통은 Do Once를 사용하지만, 여기서는 적용이 안되기 때문에 CurrentLocation 변수를 새로 만들어 이걸 넣어 쓰는 형태로 만듦
- IsSaved의 Boolean 타입 변수를 만듦(CurrentLocation에 값이 저장 됐는가 아닌가)
- Branch 노드를 넣어 False 일 때 비어있기 때문에 실행될 때 저장이 되고, 그로인해 True 로 변환되어 더 이상 재생이 되지 않아 명확하게 한 번만 실행됨
반짝이는 간판 네온 사인 효과
- BP_Sign을 만들고, Static Mesh Component로 Sign Mesh를 불러와 Rotation 90으로 돌리기
- 시작하자마자 계속 네온이 깜빡이도록 Blueprint 를 구성
- Set Material은 머티리얼을 통째로 사용해야 하기에 사용 불가
- Global Scalar Parameter Values 내 intensityemissive를 사용하고 싶음
- Set Scalar Parameter Value on Materials 노드를 생성하고 Parameter Name 부분에 사용하고 싶었던 항목의 이름을 그대로 기입함
- Material Instance 항목을 조절 할 수 있다는 걸 확인
- 네온 사인이 깜빡이는 느낌의 Timeline 애니메이션을 만들고, Blueprint 노드도 구성
'4. 언리얼 엔진(Unreal Engine) 공부 > Unreal Engine [이론]' 카테고리의 다른 글
24. [UE5] NPC 만들기(정적/동적/Socket) (2) | 2024.11.03 |
---|---|
23. [UE5] UI Interaction(Widget) (0) | 2024.10.30 |
21. [UE5] 블루프린트를 위한 프로그래밍 기초 (1) | 2024.10.18 |
20. [UE5] 블루프린트를 활용한 캐릭터 움직임 제어 (0) | 2024.10.14 |
19. [UE5] 인터랙션 / 충돌체 / 블루프린트 개념 (1) | 2024.10.10 |