프로그래밍/언리얼엔진

[언리얼5] 인디게임 제작기 2 : 캐릭터, 폰, 충돌, 피직스

하바사 2024. 6. 28. 05:58

개요

사용 엔진 : 언리얼 5.4.2 최신

목표 제작 기간 : 3개월

제작인원 : 5명

분류 : 팀프로젝트, 사이드 프로젝트

목적 : 재미, 공부

1편 : https://imresearcher.tistory.com/33

 

제작 3주차 진행상황

 

1. 기획자가 게임의 개괄적인 기획을 세웠다.

2. 캐릭터 모델러가 플레이어 캐릭터를 제작하였다.

3. 배경 모델러가 프랍들을 제작하였다. 

4. 프로그래머가 시스템 요소를 구현하였다. <-ME

 

캐릭터를 조작하여 목표지점에 도달하는 게임으로, 난이도 요소를 이것저것 넣어서 게임을 재미있게 만들 예정이다.

제로베이스부터 만들려 하니 기본 개념이 헷갈리는 게 많아서 다시 정리해보았다.


Pawn(폰) vs Character(캐릭터)

Pawn은 게임 세계에서 플레이어나 NPC가 될 수 있는 모든 물체를 의미한다. 어떻게 이동할 것인지, 어떤 Mesh나 Collision을 갖고 있는지, 어떻게 컨트롤되는지는 의도에 따라 자유롭게 구현될 수 있다.

반면에 Character는 Pawn을 상속받은 사람형태의 클래스 액터로 더 구체적이고 고급 기능을 구사하게 된다. 기본적으로 CapsuleComponent 충돌 콜리전을 갖고 있으며, 기본적인 걷기, 뛰기, 점프를 할 수 있는 CharacterMovementComponent를 가지고 있으며, Mesh는 스켈레탈 메시Skeletal Mesh이고 AnimInstance를 가지고 있다. AnimInstance는 AnimationBlueprint를 통해 애니메이션을 관리하면 된다. 

 

요약

Character: 사람 형태의 플레이어와 NPC를 위해 설계된 클래스. 고급 이동 기능과 애니메이션 통합이 용이.

Pawn: 더 일반적인 액터로, 기본적인 이동 로직을 직접 구현해야 하며, 다양한 형태로 커스터마이즈 가능.

 

Mesh(메시)와 Collision(충돌), 그리고 PhysicsSimulation(물리 시뮬레이션)의 관계

Mesh (메시)

메시는 3D 모델을 의미하며, 게임 내의 물체를 시각적으로 표현하는 데 사용된다. StaticMesh(정적메시)와 SkeletalMesh(스켈레탈 메시)로 크게 구분하면 된다. 애니메이션을 적용시킬 수 있는 건 본(Bone)을 가진 스켈레탈 메시이다. 

 

Collision (콜리전)

물체들이 서로 어떻게 상호작용하는지 결정하는 시스템이다. 첫 번째로 형태는 어떠한지( Box, Sphere, Capsule, Convex Mesh), 두 번째로 물체간 상호작용 방식-즉, 충돌 프리셋(Collision Presets)은 어떠한지, Overlap, Block, Ignore의 선택지가 있고 또 특정 물체끼리 충돌을 할지 무시를 할지 등...의 옵션을 세팅해줘야 한다. 세 번째로 Complex Collision, 메시의 정확한 모양을 따르는 충돌도 다룬다. 이 충돌 시스템은 메시와 별도로 설정된다(최적화, 효율, 퍼포먼스를 위해서). 고로 메시의 모양과 일치할 수도 있지만 보다 단순화된 형태일 경우가 많다.

 

Physics Simulation (물리 시뮬레이션)

물리 법칙을 받아야 하는 액터가 있을 때-물리 법칙 적용 안 하면 외부영향과 상관없이 물체는 가만히 있는다- 어떻게 물리 법칙을  적용할지 결정하는 시스템이다. 주요하게 Gravity(중력), Force(힘), Constraints(제약 조건), Physics Asset으로 구성돼 있다. Constraints는 조인트와 같은 제약 조건을 사용하여 물체의 움직임을 제한하거나 특정 방식으로 연결하는 것/ Physics Assets은 주로 스켈레탈 메시에 사용되며, 뼈 구조에 따라 물리적인 충돌과 상호작용을 정하는 것이다. 이 두 가지는 자세히 다뤄보진 않았다.

 

요약

Mesh는 시각적인 역할, Collision은 물체 간 상호작용 처리, Physics Simulation은 그 상호작용을 기반으로 물체의 움직임과 반응을 처리하는 것이다. 

* 스켈레탈 메시는 피직스 에셋을 통해 본 마다 물리적 상호작용을 정할 수 있으며, 정적 메시는 주로 단순한 물리 효과(중력 등)만 받는 경우가 많다.

 

예시

캐릭터가 점프하고 땅에 착지하는 경우:

  1. Mesh: 캐릭터의 시각적 모델을 표시한다.
  2. Collision: 캐릭터가 땅에 착지할 때 충돌을 감지하여 착지 이벤트를 트리거한다.
  3. Physics Simulation: 캐릭터가 중력의 영향을 받아 내려오고, 착지할 때 충격을 계산하여 적절한 반응(예: 튀어 오르거나 멈춤)을 시뮬레이션한다.

※ 콜리전 없이 메시만으로 충돌을 세팅하고 싶은 경우 :

메시의 실제 모양대로 충돌 콜리전을 생성할 수 있다. 메시 에디터에서 Auto Convex Collision 옵션을 사용하면 된다. 수동으로 충돌 모델을 만들 수도 있다. 

 

※ 콜리전은 있고 PhysicsSimulation이 비활성화돼 있을 경우 :

1: 고정된 장애물

게임에서 움직이지 않는 장애물(예: 벽이나 기둥)로 설정된 오브젝트는 Collision만 활성화하고 Physics Simulation을 비활성화하여 플레이어나 다른 물체가 이 오브젝트와 충돌할 때 멈추게는 하되, 장애물 자체는 움직이지 않게 할 수 있다. (자기는 안 움직여도 물리 적용 받는 다른 물체들은 알아서 움직일 거란 거)

 

2: 트리거 영역

시뮬레이션은 안 돼도 트리거는 된다. Collision을 사용하여 특정 영역을 감지하는 트리거를 만들 수 있다. 트리거는 물리적 상호작용 없이 단순히 영역 내에 들어오는 물체를 감지하는 역할만 한다. 주로 게임 이벤트를 발생시키는 데 사용하는 것.

 

Set Location과 Move Forward

- 물체 이동시킬 때 Set Location과 Move Forward류 함수의 차이 -

Set Location은 액터의 위치를 즉시 변경하는 함수다. 고로 자연스러운 이동보다는 액터를 텔레포트하는 개념에 더 가깝다. 물리적 충돌이나 애니메이션이 고려되지 않고 즉시 이동된다. 특정 위치 설정할 때 주로 사용된다. Move Forward는 입력을 받아 캐릭터를 앞으로 이동시키는 함수다. 연속적인 이동, 입력 처리, 물리적 충돌을 고려한 자연스러운 이동 등에 이용된다. 

이러한 함수시행별 이동위치 조절 함수는 프레임 레이트(FPS)에 따라 이동 거리가 화면 상에서 실제로 달라질 수 있다.  Move Forward함수의 경우엔 Tick함수 내에서 실행되는데, 고로 흐르는 시간에 비례하여 이동될 수 있도록 이동거리를 보정한다.  프레임 레이트가 높으면 함수가 더 자주 발생해서 이동이 더 자주 일어나게 되니, 이동 거리값에 델타 타임을 곱하여 일정 속도를 유지한다. 

만약에 SetLocation을 매Tick마다 호출하는 식으로 이동 로직을 구현하게 된다면, 위와 같은 프레임 레이트에 따른 거리 차이를 보정해 주어야 한다. 이동 거리에 Delta Time을 곱하는 식으로 보정이 가능할 것이다.