[Unreal] 01.월드생성, 블루프린트 기초(이동, 회전, 입력, 소환)
본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다
프로젝트 - 언리얼 엔진 V5.3.2
프로젝트 생성
- 프로젝트 디폴트
- 기본설정 : 블루프린트, C++
- 타깃 플랫폼 : Desktop(Console), mobile(Tablet)
- 타깃 플랫폼 설정에 따라 렌더링 기능이 달라짐
- 퀄리티 프리셋 : Maximum, Scalable
- 시작용 콘텐츠
- 레이 트레이싱 : 물리 기반 렌더링보다 뛰어난 그래픽 렌더링 기법
- 아웃라이너 : 레벨의 모든 액터를 이름 순서대로 나열하고 트리 뷰로 정리
- 디테일 : 액터의 세부 사항 표기
프로젝트 필수 파일
- Config, Content, Source, Project
액터
월드에 배치되는 모든 물체
- 컴포넌트(부품)를 추가할 수 있음
- 어떤 컴포넌트를 조합하느냐에 따라 다른 액터를 만들어낼 수 있다
언리얼 클래스 구조
USceneComponent
- Transform을 가짐
- 객체들간의 계층구조 형성
- 월드 상에 표현해야 하는 모든 물체는
USceneComponent를 상속받고 있다
스크립트
- ‘A’로 시작 : Actor Class
- 대부분이 구조체
- 월드에 배치할 수 있는 기능을 가질 수 있고, 컴포넌트의 기능을 가지고 있음
- Transform이 없다
- 계층구조 형성이 안됨
- 기능 구현만을 위해 사용 (이동 component 등)
- RootComponent로
USceneComponent의 객체를 가리키는 포인터를 가지고 있다
- ‘U’로 시작 : Actor가 아닌 Unreal Object
- ‘I’로 시작 : Interface, 다중 상속 가능
블루프린트
C++의 함수처럼 미리 만들어져 있는 노드를 순서대로 실행할 수 있게 선으로 연결하는 방법
- 비주얼 스크립팅의 한 종류
- 프로토타입을 빠르게 만들어 낼 때 사용
- 종류
- 구조체 : 함수없이 멤버변수들만 존재하는 기본 구조체
- 블루프린트 매크로 라이브러리 : 함수 형태의 매크로를 만들어 줄 때 사용
- 블루프린트 인터페이스 : 인터페이스 클래스는 다중 상속이 가능(Unity와 동일), 어떤 클래스에 추가적인 기능을 구현하기 위해 사용
- 블루프린트 클래스 : 기본 클래스 형식의 블루프린트
- 블루프린트 함수 라이브러리 : 전역함수를 만들어 놓고 호출해서 사용하는 형식
- 열거형 : Enum 형식
- UE에서 제공하는 클래스 중 하나를 무조건 상속 받아야 한다
DefaultSceneRoot
기본 씬 루트 컴포넌트, 다른 씬 컴포넌트로 덮어 쓰기 할 수 있음
ContructionScript
생성자의 역할을 해주는 스크립트 (정확히 말하자면 생성자는 아니다)
OnContruction 함수를 호출해주는 함수 (초기화용 함수)
- 생성자와 Begin Play가 해줘야하는 초기화를 분리해서 코드 작성을하여야 함
- ConstructionScript는 객체 생성 최초에 한번만 실행
- Unity의 Awake 함수와 동일한 역할인 듯
- 객체가 움직이거나 갱신될 때도 호출됨
- 오버라이더블 : 부모의 함수 재정의 가능
- 매크로 : 매크로 설정 가능
이벤트 그래프
블루프린트 코드를 작성하는 곳
- Begin Play : 액터가 플레이 시작될 때 이벤트 발생
- ActorBeginOverlap : 충돌 발생 시 이벤트 발생 (사용 안함)
- Tick : 매 프레임마다 이벤트 발생
- Delta Seconds : 전 프레임이 완료되기까지 걸린 시간 / 프레임 간 이동 사이의 시간 간격
- FPS(Frame Per Seconds) : 1초에 몇 프레임이 그려지는지
- 100Frame/s => DeltaTime = 1/100s
- 컴퓨터 성능에 따라 FPS는 달라진다
- 모든 컴퓨터마다 일정하게 시간간격을 가질수 있어, 시간을 통일성 있게 사용할 수 있게 해 준다
Mesh
- Static Mesh
- 자체 변형이 없는 메쉬
- Skeletal Mesh
- 스켈레톤이라는 뼈대를 움직여서 메쉬가 애니메이션을 동작할 수 있게끔 만들어진 메쉬
UPrimitiveComponent: 기하 정보를 가진 컴포넌트들은 모두UPrimitiveComponent를 상속받고 있다
Pawn
플레이어의 분신이 되는 폰은 컨트롤러에 빙의되어 동작
AController는AActor를 상속받음AController는 크게APlayerController,AAIController두 가지로 나뉜다- 컨트롤러는 폰에 빙의할 수 있다
APlayerController가 실제 플레이어 -> 폰에 빙의 하여 조작ACharacter클래스는APawn클래스를 상속받음UMovementComponent를 가지고 있음ACharacter2족보행을 할 수 있는 기본적인 캐릭터- 걷기, 뛰기, 수영하기 등 기본적인 물리 기능을 포함하고 있는 클래스
- Pawn을 생성하고 플레이어 자동빙의에 player 인덱스를 지정하면 해당 pawn으로 빙의
카메라
- 스프링 암 컴포넌트 : 부모에서 고정된 거리의 카메라
- 스프링 암 컴포넌트를 만들고 카메라를 스프링 암의 자식으로 둔다
- 지연 : 댐핑을 줄 수 있다
- 시네 카메라 컴포넌트
- 카메라 컴포넌트
게임 모드
월드의 규칙을 만들 수 있다
- 존재하는 플레이어, 허용된 플레이어, 관람자의 수, 게임의 승리 조건
- 월드당 하나의 게임 모드를 지정할 수 있다
- 게임 모드도 Actor의 한 종류 (AGameMode)
월드 세팅
프로젝트 세팅
- 맵 & 모드
- Default Mode : 기본 게임 모드로 지정할 게임모드 선택 가능
- 디폴트 폰 클래스
- HUD 클래스
- 플레이어 컨트롤러 클래스
- 게임 스테이트 클래스
- 플레이어 스테이트 클래스
- 관전자 클래스
- Default Maps : 시작 맵(씬)을 지정할 수 있음
- 에디터 시작 맵 : Open World(Default) -> 사용자 지정 Level로 변경 가능
- Default Mode : 기본 게임 모드로 지정할 게임모드 선택 가능
레벨
Unity의 씬과 같은 존재
좌표계
- Unity와 Unreal 모두 왼손 좌표계를 사용
- 엄지(x)와 검지(y)를 기준으로 중지(z)로 표기
이동
BP_Translate
회전
- 트랜스폼
- 최상위 부모는 스케일만 가짐 (월드에서 위치, 회전 값 설정 가능)
- 상대 트랜스폼 : 부모로부터 상대적인 좌표 (Unity의 로컬 트랜스폼)
- 월드 트랜스폼 : 월드 상의 절재적인 좌표 (Unity의 월드 트랜스폼)
BP_Rotation
입력
- Legacy Input과 EnhancedInput 두 가지 존재
- EnhancedInput은 BP에서
EnhancedInputLocalPlayerSubsystem을 컨트롤러로서 추가하여 사용 가능
입력 액션(Input Action)
- 값 타입
- Digital(Bool) : 공격, 창 열기 등
- Axis1D (float)
- Axis2D (Vector 2D) : 3D 게임에서의 이동
- Axis3D (Vector 3D)
입력 매핑 컨텍스트 생성
- 매핑
- 트리거 : 트리거 한정자, 매핑은 다음과 같은 상황에서만 트리거 됨
- 모디파이어 : 원시 키 값에 적용된 모디파이어, 배열 순서대로 순차 적용 됨
- 스위즐 입력 축 값 : 1D 입력을 2D 액션의 Y축에 매핑하는 데 유용
- 부정 : 값 반전
w, s가 동시입력 될 경우 뒤에 셋팅한 입력값으로 덮어쓰기 된다
- 위 문제를 해결하기 위해 FB과 LB 두가지로 나눠서 액션을 작성하고 매핑 컨텍스트에 두 액션을 각각 따로 매핑해 준다
- ‘W Key’는 x에 저장을 하고, ‘S Key’는 y에 저장을 해서 두 개를 더하면 두 키가 동시에 들어왔을 때, 0의 값을 가지게 만들 수 있다
BP_IA
Get Controller: IC로 만들어 진(부모 타입의 컨트롤러) 포인터 타입의 변수를 반환한다Cast To PlayerController: 플레이어 컨트롤러로 다운 캐스팅하고 실패하면 nullptr을 반환EnhancedInputLocalPlayerSubsystem: 컨트롤러로써 향상된 입력 로컬 플레이어 서브시스템을 얻기EnhancedInputActionTriggered: 누르고 있는지 체크(이동)Started: 키를 누르기 시작할 때Canceled: 누르기 취소
EnhancedActionEventsIA_Move_FB: +값과 -값의 합산을 위해 스위즐 입력 축 값 ‘YXZ’에 부정을 더해- 대각 이동 : 벡터의 정규화를 통해 대각 이동의 길이 조정
- 단위벡터(정규화된 벡터 : 크기가 1인 방향을 가진 벡터; 방향 벡터) * 이동속도(스칼라 값)
UMovement- 자신이 서브 오브젝트로 달린 액터(또는 캐릭터)에 일정한 형태의 이동을 제공
- 트랜스폼이 없음
UPawnMovement: AI 또는 플레이어의 이동제어, Navigation 기능 포함UFloatingPawnMovement: 폰 클래스에 단순한 움직임을 제공, 중력 제공 XUCharacterMovement: 캐릭터 클래스의 움직임을 제공, 중력 제공 O
URotatingMovement: 회전 제공UProjectileMovement: 투사체의 이동 제어
스폰
월드에 원하는 액터를 생성하는 것
SpawnActor from Class: 원하는 액터를 클래스로부터 생성- Class : 지정 클래스
- Spawn Transform : 소환 지점
- 벡터 = 단위벡터 * 스칼라 값
- Collision Handling Override : 충돌 관련 오버라이딩
- Always Spawn, Ignore Collision : 이펙트 등
- Try To Adjust Location, But Always Spawn
- Try To Adjust Location, Don’t Spawn If Still Colliding
- Do Not Spawn