[Unreal] 간단한 슈팅 게임 제작(Blue Print)

Doorbals·2022년 12월 23일
0

Unreal

목록 보기
5/10

1. 플레이어 이동

1) 가장 먼저 Player 블루프린트 클래스를 Pawn 클래스로 생성
: 사용자의 입력대로 처리할 수 있는 클래스
=> Game Mode Base에서 Default Pawn Class를 해당 클래스로 설정해야 함.

2) 사용자 입력 바인딩 처리 (Project Settings -> Input)
: 입력 장치 신호를 일정한 값으로 처리해주는 과정

  • 좌우 이동 -> Horizontal (A/D 입력)

  • 상하 이동 -> Vertical (W/S 입력)

  • Input 바인딩 종류

    • Action : 특정 키가 눌렸는지 안 눌렸는지만 판단
    • Axis : 키 입력의 강도 또는 기울기를 0 ~ 입력된 값으로 판단 (축)
    • Speech : 음성 인식 했는지 판단

3) 블루 프린트 작성

  • 등가속도 운동으로 플레이어가 이동하도록 한다. (P = P0 + vt)
    a. Horizontal과 Vertical 입력을 받아온다.
    b. Make Vector 노드를 통해 두 입력 벡터를 더한다.
    c. 모든 방향으로 동일한 속도로 이동하기 위해 해당 벡터를 정규화 해야하므로 Normalize 처리 한다.
    d. MoveSpeed와 위 벡터를 곱한다. (== dir \* speed)
    e. 프레임 속도에 의한 이동 거리 차이를 보정해주기 위해 Delta Seconds를 위 벡터에 곱해준다. (== dir \* speed \* time.deltaTime)
    f. 현재 액터의 위치 (GetActorLocation) + 위 벡터를 더한 벡터 = 액터의 위치로 설정한다. (SetActorLocation)

2. 총알 발사

1) Bullet 블루프린트 클래스를 Actor 클래스로 생성
2) Bullet 블루 프린트 작성

  • 총알은 항상 위 방향(Z축)으로 이동하도록 한다.
    a. GetActorUpVector 노드를 통해 총알의 위 방향 벡터를 가져온다.
    b. Bullet Speed와 위 벡터를 곱하고 Delta Seconds도 곱한다. (vt)
    c. GetActorLocation으로 현재 액터 위치 가져와 vt와 더한다. (P0 + vt)
    d. 위에서 더한 벡터를 액터의 위치로 설정한다. (P = P0 + vt / SetActorLocation)

3) 총알 발사 입력 키 바인딩 (Project Settings -> Input)
: 왼쪽 마우스 클릭만 하면 발사되도록 설정

4) Player 블루 프린트 작성

  • 바인딩 된 Fire 입력 시 총알 발사되도록 한다.
    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 항목도 추가해 발사할 때마다 소리가 출력되도록 한다.

3. 적 생성

1) Enemy 블루프린트 클래스를 Actor 클래스로 생성
2) Enemy 블루프린트 작성

  • Enemy 생성 시(BeginPlay) 확률에 따라 Enemy의 이동 방향을 두 가지로 설정
    (미리 Direction이라는 Vector 변수를 만들어둔다.)
    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 블루프린트 작성

  • 일정 시간마다 Enemy 액터를 생성하도록 한다.
    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 활성화해 전부 다르게 설정)

4. 충돌 설정

1) 액터들 간 충돌 하기 위해서는 충돌 영역을 설정해야 한다.
-> 액터의 최상위 컴포넌트가 Collision(Box Collision, Capsule Collision, ...)이 되어야 한다.

2) 대부분의 경우 Collision의 크기를 메쉬의 크기와 동일하게 변경해주어야 한다.

  • Cube 메쉬의 Scale
  • Box Collision의 크기
    : 메쉬의 Scale이 1일 때 -> Collision의 Box Extent는 50.
    즉, 50에 메쉬의 Scale을 곱한 값을 Box Extent에 넣어야 한다.

3) 액터들 간에 같은 충돌 처리 하기 위해 Collision 그룹을 생성 (Project Settings -> Collision)
: Collision간 충돌 -> Object 채널 / Ray Tracing -> Trace 채널 사용

  • Default Response에는 3가지 종류가 있다.
    • Ignore : 모든 충돌 무시
    • OverLap : 충돌은 감지. 물리적으로 밀어내지는 X
    • Block : 충돌 감지. 물리적으로 밀어내기도 O
  • 서로 다른 응답 가진 오브젝트끼리 충돌할 경우 더 약한 응답 쪽으로 처리
    (ex. Ignore VS Overlap -> Ignore)

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의 정보를 반환한다.

  • Cast To 노드를 통해 충돌한 액터의 클래스를 파악한다. (Cast 된다면 해당 클래스일 것이고, 안된다면 아님.)
  • 충돌 처리 해야할 오브젝트일 때와 아닐 때를 구분해서 처리 (일반적인 실행핀과 Cast Failed일 때 실행핀 따로 존재)

5. 배경 이미지 배치

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)

6. Enemy에 회전 기능 추가

  • Enemy의 이동 방향에 따라 오브젝트의 방향 또한 회전하려고 한다.
    -> 이 때 어떤 축을 회전 시키는지 신경쓰지 않으면 예상과 다른 형태로 회전될 수 있다. 이를 막기 위해 어떤 축은 고정 시킨 상태로 회전해야 한다.

  • 현재 Enemy 액터의 Viewport로, 내가 원하는 방향으로 회전시키려면 X축 벡터는 고정 시킨 상태에서 Y축과 Z축 벡터가 변화하게 된다.

  • Enemy 액터 블루프린트의 BeginPlay 노드의 마지막 부분에서 Set Direction을 통해 이동 방향이 결정되는데, 이 때 결정된 이동 방향으로 Enemy가 회전해야 한다.
    1) Make Rot from 노드를 사용하는데, 앞의 벡터는 변경할 벡터(Z축)이고 뒤의 벡터는 고정할 벡터(X축)이다. 두 벡터가 설정되면 나머지 하나의 벡터(Y축)는 자동으로 계산되어 회전해야 할 Rotation 값을 반환한다.
    2) 고정돼야 할 방향의 벡터(X축)에는 해당 축에 대한 단위 벡터가 입력되는데, 언리얼에서는 유니티와 축 개념이 다르다. 이에 유의해서 단위 벡터를 사용한다.
    - X축 : 앞뒤 방향 (Forward Vector)
    - Y축 : 좌우 방향 (Right Vector)
    - Z축 : 상하 방향 (Up Vector)
    3) 이렇게 반환된 Rotation 값을 SetActorRotation 값의 New Rotation 입력핀으로 넣어 액터의 Rotation을 재설정해준다.
profile
게임 클라이언트 개발자 지망생의 TIL

0개의 댓글