액터의 동적 생성
총알 발사는 적을 격추시키기 위해 총알을 발사하는 기능입니다.
총알에 해당하는 Actor를 플레이 중에 동적으로 생성합니다.
절대 좌표와 상대 좌표
월드 공간에서의 좌표를 월드 좌표 (World Positon)이라고 합니다.
액터 객체를 기준으로 계산된 좌표를 상대 좌표 (Relative Position)이라고 합니다.
총알의 이동 구현
1. Event Thick : 프레임당 발생하는 이벤트
2. 현재 방향벡터에 속도값(Move Speed)를 곱하고, Event Thich의 Delta Seconds 값을 곱합니다.
3. 곱한 값을 현재 Actor의 위치와 더합니다.
4. 이를 Set Actor Location을 이용하여 현재 Actor의 위치를 변경합니다.
총알 발사 입력 키 바인딩
IA_Fire
PlayerInput
IA_Fire을 왼쪽 마우스클릭에 매핑(누를 시 발사)
총알 생성 기능 구현
1. 생성지점을 선택
2. SpawnActor from Class 노드에서 Class로 총알 BluePrint Class를 선택
3. 왼쪽 마우스 클릭시 설정된 노드에 따라서 총알이 생성됩니다.
적 제작
적들이 플레이어와 부딪혀서 게임오버가 되도록 생성. 적의 생성과 이동을 구현
적의 이동 구현
1. Event Thick : 프레임당 발생하는 이벤트
2. 현재 방향벡터에 속도값(Move Speed)를 곱하고, Event Thich의 Delta Seconds 값을 곱합니다.
3. 곱한 값을 현재 Actor의 위치와 더합니다.
4. 이를 Set Actor Location을 이용하여 현재 Actor의 위치를 변경합니다.
위의 총알의 이동 구현과 비슷합니다.
Enemy 공장 액터 생성
화면 위쪽에서 일정 시간 간격으로 무한 생성.
BP_EnemyFactory라는 이름으로 생성, Enemy를 생성하는 역할만 수행하면 되기 때문에 사용자 눈에 보일 필요는 없습니다.
Enemy 액터 생성은 Spawn Actor from Class 노드 사용.
이것을 Tick 노드에 연결하면 매 프레임(약 0.0.1초)마다 계속해서 Enemy 생산.
스톱 워치 기능 필요 ⇒ 지정된 시간이 경과되었음을 알려줄 때마다 Enemy 액터 생성.
시간 지정용 변수 생성
- Delay TIme : 시간 지정용 Float 타입 변수
Instance Editable을 설정함으로써 각 인스턴스마다 설정 값 (여기서는 DelayTime)을 변경할 수 있게 합니다.
=> 적 생산 BluePrint 인스턴스 각각 마다 DelayTime을 변경하여 적의 생성 시간이 각각 다르게 설정할 수 있게합니다.
BluePrint 설정
- Event Thick(각 프레임마다 실행)
- 현재 시간과 Delta Seconds를 더한 뒤 Branch 조건문 실행
- Delay Time값에 도달하면 True, 아니면 False
- True인 경우 SpawnActorFrom Class 노드가 실행되고 BP_Enemy 인스턴스가 생성됨.
액터 생성 방향 생성
Arrow Component 설정 ( 액터의 생성 방향 설정)
BluePrint에 Enemy Actor의 생성 방향을 설정
Arrow Component를 BluePrint에 설정하고
해당 좌표값을 받아와서 Spawn 시 BP_Enemy 인스턴스가 해당 좌표로 스폰되게 합니다.
마지막으로 Enemy 생성 후 Current Time 값을 0으로 설정해야
Enemy가 일정 시간에 도달할 때마다 계속해서 생성될 수 있습니다.
여러 개의 BP_EnemyFactory 생성
여러 개의 BP_EnemyFactory 생성 후 각 Delay Time을 다르게 설정해서 적의 생성을 자연스럽게 유도합니다.
플레이 화면
여러개의 Enemy 생성 위치에서 Enemy가 생성됩니다.
Enemy 이동 방향 추첨하기
적들이 위협적으로 보이지 않음
⇒ 적들의 이동 방향이 죄다 일정하기 떄문에 플레이어 입장에서는 피해야할 위치가 너무 뻔하게 예측되기 때문입니다. 동선에 불규칙성을 주기 위해 Enemy가 처음 생성되었을 때 지정된 확률에 따라 아래 또는 플레이어쪽으로 이동하게 만듦
방향 벡터 생성
최초 이동 방향을 다르게 설정하려면 확률 추첨에 의해 결정된 방향 벡터를 담을 벡터 변수 필요. 개발자가 설정할 확률 변수도 필요. BP_Enemy 블루프린트 설정 창 열기 Direction 변수(Vector)와 TraceRate 변수(Float) 추가.
- Direction(Vector) : (0, 0, 0) 설정
- TraceRate(Float) : 0.35 설정
확률 추첨 기능 구현
- Random Float In Range
- 0 부터 1까지 값을 랜덤으로 생성
- Trace Rate와 Less Equal 비교 ⇒ Trace Rate보다 작거나 같다면 True 반환
- Event Begin Play 노드에 Branch 연결 후 Random 노드의 Boolean 값을 받음(0.35 이하인 경우 True, 아니면 False)
- True 인경우 월드 공간에서 이동중인 플레이어의 위치를 가져옵니다.
- 플레이어 위치를 Get Actor Location, 현재 Enemy Instance의 위치를 Get Actor Location으로 가져오고 각 벡터간 뺄셈 연산을 수행합니다.
- 뺄셈 연산을 수행한 벡터는 플레이어의 위치에 따라 벡터의 길이가 천차만별이 되므로 벡터의 길이를 1로 정규화(Normalize 노드 생성)합니다.
- Enemy 객체로부터 플레이어 위치를 가리키는 정규화된 벡터를 Enemy의 Direction(방향 벡터) 변수에 설정해줍니다.
- 실패 시 기존의 방향대로 설정되게 끔 Forward Vector를 SetDirection 벡터 변수에 연결해줍니다.
플레이 화면
여러개의 Enemy 생성 위치에서 Enemy가 플레이어를 향해 날라오거나, 정위치로 날라갑니다.
참고
인생 언리얼 5 프로젝트 교과서 1권을 실습하고 작성한 글입니다.
'Unreal' 카테고리의 다른 글
UE - 프로젝트 프로토 타입 - 슈팅 프로젝트(배경 스크롤) (0) | 2024.09.07 |
---|---|
UE - 프로젝트 프로토 타입 - 슈팅 프로젝트(충돌 처리) (0) | 2024.08.31 |
UE 에디터 - White Boxing (0) | 2024.08.10 |
UE 캐릭터 컨트롤 설정 (0) | 2024.06.28 |
UE C++ 리플렉션 (0) | 2024.06.22 |