Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

언리얼/기능구현

[Unreal5] 블루프린트로 달팽이 레이싱 게임 만들기

새벽_글쓴이 2024. 11. 11. 18:42
반응형

준비

도착지점 : 블로킹볼륨

움직일 물체 : 블루프린트 actor로 만든 구체


블로킹 볼륨(Blocking Volume)

블로킹 볼륨은 언리얼 엔진에서 물리적 충돌을 정의하는 기본적인 방법

생성하는법

Place 패널에서 Volumes → Blocking Volume을 선택 후 뷰포트에 드래그하여 생성

일반적인 사용 사례

  • 보이지 않는 벽 생성
  • 트리거 영역 설정
  • 레벨 경계 설정
  • 물리적 충돌 영역 정의
블로킹 볼륨은 게임 레벨 디자인에서 매우 중요한 요소이며, 플레이어의 이동을 제한하거나 특정 이벤트를 트리거하는 데 사용된다

Actor 블루프린트

기본 개념

게임 월드에 배치할 수 있는 가장 기본적인 오브젝트 클래스

C++ Actor 클래스의 블루프린트 버전

독립적으로 동작하며 고유한 로직을 가질 수 있음

 

주요 이벤트

BeginPlay: 액터가 게임에 스폰될 때 실행

Tick: 매 프레임마다 실행

EndPlay: 액터가 파괴될 때 실행

 

컴포넌트 시스템

Static Mesh Component: 3D 모델 표시

Collision Component: 충돌 처리

Particle System Component: 파티클 효과

Audio Component: 사운드 재생

Scene Component: 위치, 회전, 스케일 정보

 

생성 하는 법

Content Browser에서 우클릭 → Blueprint Class 선택 Actor 클래스 선택

 

주요기능

  • 변수 생성 및 관리
  • 함수 제작
  • 이벤트 처리
  • 컴포넌트 추가/제거
  • 물리 시뮬레이션
  • 네트워크 레플리케이션

일반적인 사용

  • 상호작용 가능한 오브젝트
  • 아이템 및 수집품
  • 장애물
  • 트리거
  • 적 캐릭터

컴포넌트 추가

 

유니티와의 차이

구조적

유니티
개별 컴포넌트 중심

언리얼
통합된 블루프린트 중심

 

로직구현

유니티
개별 스크립트 컴포넌트

언리얼
블루프린트 그래프 내 통합 구현

 

관리방식

유니티: Inspector 에서 개별 관리
언리얼 : Components 패널에서 통합 관리

변수설정


변수 옆 눈 모양 아이콘

Instance Editable 설정

눈 모양이 켜져있을 때 (열린 눈):

블루프린트로 만든 액터를 레벨에 배치했을 때
Details 패널에서 이 변수값을 수정할 수 있음
각각의 인스턴스마다 다른 값 설정 가능
레벨 디자이너가 쉽게 값을 조정할 수 있음

눈 모양이 꺼져있을 때 (닫힌 눈):

레벨에서 변수값을 수정할 수 없음
모든 인스턴스가 같은 값을 사용
블루프린트 내부에서만 값 수정 가능

 

유니티의 [SerializeField]와 비슷한가?

공통점

에디터에서 값 수정 가능
디자이너가 쉽게 값을 조정 가능
게임 실행 전 초기값 설정 가능

차이점

SerializeField

private 변수를 인스펙터에서 보이게 함
직렬화가 주 목적
private 상태 유지하면서 수정 가능

 

Instance Editable

이미 public한 변수의 인스턴스별 수정 가능 여부
변수 접근 제어가 아닌 수정 가능 여부를 결정
레벨에 배치된 각 인스턴스마다 다른 값 설정 가능

 

결론

완전히 같은 기능은 아니고 유니티의 serializeField 와 public 키워드를 합친것과 비슷하다고 볼 수 있다

이름 설정


달팽이 이동

이동 함수를 만들기 전 언리얼에는 함수를 작성할 수 있는 위치가 굉장히 많았다

어디에 작성하는게 가장 효율적인지 알아봤다


함수를 작성할 수 있는 주요 위치와 각각의 특징

Level 블루프린트

레벨 전체에 영향을 미치는 글로벌 함수
레벨 시작/종료 등 전체 게임 로직
모든 액터에 접근 가능
한 레벨에서만 작동

 

Actor 블루프린트

특정 액터의 동작을 정의하는 함수
Begin Play, Tick 등 기본 이벤트
해당 액터의 컴포넌트들에 쉽게 접근
인스턴스별 독립적 동작

 

Component 블루프린트

특정 컴포넌트의 동작을 정의
컴포넌트 특화된 이벤트 처리
재사용성이 높음

 

Animation 블루프린트

캐릭터 애니메이션 관련 함수
애님 그래프, 스테이트 머신
애니메이션 로직 특화

 

Widget 블루프린트

UI 관련 함수
버튼 클릭, 값 변경 등 UI 이벤트
화면 표시 관련 로직

 

GameMode / Game State- 게임의 규칙을 정의하는 함수

점수, 승패 조건 등 게임 상태 관리
멀티플레이어 동기화

 

설계 시 고려사항

1. 책임 분리

레벨 블루프린트: 전체 게임 흐름
액터 블루프린트: 개별 객체 동작
컴포넌트: 재사용 가능한 기능

 

2. 접근성

상위 객체는 하위 컴포넌트 접근 가능
하위 컴포넌트는 상위 객체 Get Owner로 접근

 

3. 재사용

자주 사용하는 함수는 함수 라이브러리로 제작
컴포넌트 레벨에서 모듈화

 

유니티와의 차이점

유니티

MonoBehaviour 스크립트에 모든 로직 작성
컴포넌트 단위로 스크립트 관리
직렬화된 필드로 연결

 

언리얼

계층적 블루프린트 시스템
시각적 프로그래밍으로 로직 구현
이벤트 기반 설계가 더 명확

달팽이의 이동은 각 객체들이 알아서 움직이니 actor 클래스에 작성하는게 가장 효율적인 것 같았다

주요 특징

도착지점으로 설정한 블로킹 볼륨에 부딪혔을 때 도착했다 라는 설정을 했다

이동은 랜덤속도로 만들어 주었다

 

랭킹 만들기

달팽이의 랭킹을 정하는 것은 중앙에서 처리하기 때문에 Level 블루프린트에서 작성했다

변수설정

 

값 담아주기

Get all actors of class으로 BP Slime 이라는 클래스를 다 가져와 Slimes라는 배열안에 넣는다


Get all actors of class란?

현재 레벨에서 특정 클래스 타입의 모든 액터를 찾아주는 노드이다

 

일반적인 사용 예시

1. 특정 타입의 모든 적 찾기

Get All Actors Of Class (EnemyClass)

→ ForEach Loop로 모든 적에게 데미지

 

2. 모든 아이템 수집

Get All Actors Of Class (ItemClass)

→ Array 조작으로 아이템 정보 처리


랭킹 출력 조건 설정

달팽이들이 담긴 배열이 있고 랭킹에 들어갈 배열의 길이 같아지면 출력

 

랭킹 배열에 추가

1. Slimes 배열의 인덱스 만큼 foreach 문을 돌린다

2. 부딪히면 Rank 배열에 Slimes에 있는 값을 추가해준다

2-1.조건 : Rank 배열에 없고, Slimes 배열에 있는 값일 경우에만

2-2.이유 : 중복추가를 막기 위해서

이부분은 Add Unique 노드로 더 간단하게 만들 수 있을 것 같다

출력문

단순한 출력문이지만 노드로 하니 꽤나 복잡하다

name에 연결한 노드(분홍색)는 actor class에서 만들어 놓은 name 변수를 가져온 것이다.

결과

반응형