1) 가장 먼저 Player 블루프린트 클래스를 Pawn 클래스로 생성
: 사용자의 입력대로 처리할 수 있는 클래스
=> Game Mode Base에서 Default Pawn Class를 해당 클래스로 설정해야 함.
2) 사용자 입력 바인딩 처리 (Project Settings -> Input)
: 입력 장치 신호를 일정한 값으로 처리해주는 과정
좌우 이동 -> Horizontal (A/D 입력)
상하 이동 -> Vertical (W/S 입력)
Input 바인딩 종류
3) 블루 프린트 작성
a. Horizontal과 Vertical 입력을 받아온다.
b. Make Vector 노드를 통해 두 입력 벡터를 더한다.
c. 모든 방향으로 동일한 속도로 이동하기 위해 해당 벡터를 정규화 해야하므로 Normalize 처리 한다.
d. MoveSpeed와 위 벡터를 곱한다. (== dir \* speed)
e. 프레임 속도에 의한 이동 거리 차이를 보정해주기 위해 Delta Seconds를 위 벡터에 곱해준다. (== dir \* speed \* time.deltaTime)
f. 현재 액터의 위치 (GetActorLocation) + 위 벡터를 더한 벡터 = 액터의 위치로 설정한다. (SetActorLocation)
1) Bullet 블루프린트 클래스를 Actor 클래스로 생성
2) Bullet 블루 프린트 작성
a. GetActorUpVector 노드를 통해 총알의 위 방향 벡터를 가져온다.
b. Bullet Speed와 위 벡터를 곱하고 Delta Seconds도 곱한다. (vt)
c. GetActorLocation으로 현재 액터 위치 가져와 vt와 더한다. (P0 + vt)
d. 위에서 더한 벡터를 액터의 위치로 설정한다. (P = P0 + vt / SetActorLocation)
3) 총알 발사 입력 키 바인딩 (Project Settings -> Input)
: 왼쪽 마우스 클릭만 하면 발사되도록 설정
4) Player 블루 프린트 작성
a. Add Component -> Arrow를 검색해서 FirePosition이라는 이름으로 Player 블루프린트에 추가한다.
b. 총알은 항상 플레이어의 위 방향(Z축)으로 나가기 때문에 Arrow의 위 방향(Z축)이 플레이어의 위 방향과 같도록 해준다.
c. FirePosition의 월드 좌표 기준 Transform을 받아온다. (GetWorldTransform)
d. FirePosition과 같은 Transform(Rocation, Rotation, Scale)에서 Bullet 오브젝트가 생성되도록 한다. (SpawnActor BP Bullet)
f. Playe Sound 2D 항목도 추가해 발사할 때마다 소리가 출력되도록 한다.
1) Enemy 블루프린트 클래스를 Actor 클래스로 생성
2) Enemy 블루프린트 작성
a. Random Float In Range를 통해 0.0 ~ 1.0 사이 수를 생성
b. Trace Rate(== 0.3)과 비교해 이보다 작으면 플레이어 방향으로 이동, 아니면 아래 방향으로 이동하도록 만들 것. -> Branch 사용
c. 0.3보다 작을 때 : (플레이어 위치 - Enemy 위치) 벡터로 Direction 변수 설정
-> 플레이어 위치는 Get Actor Of Class(BP_Player) -> GetActorLocation
-> Enemy 위치는 GetActorLocation(self)
d. 0.3보다 클 때 : Get Actor Up Vector를 통해 Enemy 액터의 위 방향으로 항상 이동하도록 설정(Enemy를 뒤집어서 생성할 것이므로 아래 방향으로 이동하게 될 것.)
e. Player가 파괴되어서 플레이어 방향 설정 불가능할 때를 대비해 Is Valid를 사용해 Player가 존재할 때에만 Set Direction으로 넘어가도록 한다.
f. 이후 Enemy를 이동 시키는 등가속도 운동은 Bullet의 블루프린트에서 Get Actor Up Vector를 Direction + Normalize로만 교체해주면 된다.
3) Enemy Factory 클래스를 Actor 클래스로 생성
4) Enemy Factory 블루프린트 작성
a. float형인 CurrentTime 변수에 Delta Seconds를 프레임마다 누적해준다.
b. 미리 설정해 둔 float형 변수 DelayTime과 비교해(Compare Float) DelayTime보다 크면 Enemy Factory의 Transform과 동일 위치에 Enemy 액터를 생성한다. (SpawnActor BP Enemy)
c. CurrentTime을 0으로 초기화 해준다.
5) Enemy Factory 여러 개를 월드에 배치한다. (DelayTime의 Details에서 Instance Editable 활성화해 전부 다르게 설정)
1) 액터들 간 충돌 하기 위해서는 충돌 영역을 설정해야 한다.
-> 액터의 최상위 컴포넌트가 Collision(Box Collision, Capsule Collision, ...)이 되어야 한다.
2) 대부분의 경우 Collision의 크기를 메쉬의 크기와 동일하게 변경해주어야 한다.
3) 액터들 간에 같은 충돌 처리 하기 위해 Collision 그룹을 생성 (Project Settings -> Collision)
: Collision간 충돌 -> Object 채널 / Ray Tracing -> Trace 채널 사용
4) 각 액터들의 Collision 컴포넌트의 Details에서 Collision 부분 수정
a. 충돌 이벤트 발생 위해서는 Genertae Overlap Events 항목 활성화
b. Collision Presets -> Custom 선택하면 밑 항목들 수정 가능
c. Collision Enabled는 충돌 감지 또는 물리 작용을 설정하는 부분이다.
(충돌 감지 및 물리 작용 X / 충돌 감지만 / 물리 작용만 / 충돌 감지 및 물리 작용 O)
d. 아까 Object 채널에서 만들어두었던 Object Type을 각각 설정
e. 현재 액터의 다른 오브젝트들과의 충돌에 대한 반응을 설정
5) 충돌해야 하는 액터들의 블루 프린트 작성 (ex. Bullet)
: ActorBeginOverlap은 해당 액터가 다른 액터와 충돌하는 순간 발생하는 이벤트이다.
여기에 달린 Other Actor는 해당 액터와 충돌한 다른 Actor의 정보를 반환한다.
1) 먼저 월드 상에 Plane을 하나 생성해 플레이어 액터 뒤쪽에 배치한다.
2) Plane의 Material을 설정하기 위한 Material을 새로 하나 만든다. (Add/Import -> Material)
3) 2D 게임이기 때문에 월드에 배치해둔 Directional Light에 의해 영향을 받으면 어색해진다. 따라서 빛의 영향을 받지 않도록 Material의 Shading Model 설정을 Unlit으로 해준다.
4) Material Editor에 이미지 파일을 끌어 Texture Sample을 생성한다.
5) 밝기가 너무 밝아서 원본 파일과 다르게 보이기 때문에 이를 보정하기 위해 ScalarParameter 노드를 생성하고 이를 Texture Sample의 RGB값과 곱해 (Multiply 노드 추가) Emissive Color 입력핀에 연결한다.
* Emissive Color : 빛과 관계 없이 물체 자체가 발산하는 색상
6) Panner 노드를 추가하고 X축이나 Y축으로 이동하는 Speed를 설정해 이미지의 UV가 위에서 아래로 스크롤 되도록 한다.
* UV : 텍스쳐의 픽셀 사이즈를 비율로 환산한 가로세로 좌표 (U축 : 가로 / V축 : 세로)
0 ~ 1의 실수 값으로 이루어진다. (ex. 텍스쳐의 정중앙 UV 좌표는 U : V = 0.5 : 0.5)
- X축 : 앞뒤 방향 (Forward Vector)
- Y축 : 좌우 방향 (Right Vector)
- Z축 : 상하 방향 (Up Vector)