Directional Light (평행광)

SkyLight (Ambient Light : 주변광)

 

평행광과 주변광의 영향을 받지 않는 아이템들은 Unlit이거나 Emmisive이다.

 

밝은 장소와 어두운 장소로 이동할 때 눈에 들어오는 밝기가 서서히 바뀌는 연출 

ㄴ PostProcessVolumed의 Exposure 속성

 

라이트 섀프트

ㄴ Directional Light -> Light shafts 속성

ㄴ 빛 번짐 효과를 제어할 수 있다.

 

다이나믹 라이트와 스태틱 라이트

ㄴ 모바일 환경에서는 static light를 굽는 것이 퍼포먼스 향상에 좋다.

 

루멘 (언리얼 5에 도입)

ㄴ 리얼타임 글로벌 일루미네이션 시스템

ㄴ 소프트웨어 레이트레이싱 혹은 하드웨어 레이트레이싱을 사용할 수 있다.

 

'언리얼 5 > 정리' 카테고리의 다른 글

기초 지식 - 에디터 종류  (0) 2022.10.14
기초 지식 - 기본적인 용어 정리  (0) 2022.10.14
컨테이너  (0) 2022.09.15
AI Controller & Behavior Tree  (0) 2022.09.14
충돌과 UI  (0) 2022.09.14

언리얼에서는 C++의 STL 컨테이너 대신 자체 컨테이너를 제공한다

다양한 플랫폼의 빌드에서 생기는 문제를 피할 수 있다.

 

vector <-> TArray

unordered_map <-> Tmap

string <-> FString

 

'언리얼 5 > 정리' 카테고리의 다른 글

기초 지식 - 기본적인 용어 정리  (0) 2022.10.14
라이팅 설정  (0) 2022.10.05
AI Controller & Behavior Tree  (0) 2022.09.14
충돌과 UI  (0) 2022.09.14
애니메이션  (0) 2022.09.13

AIController

캐릭터 클래스 안에는 APawn의 멤버 AIControllerClass와 AutoPossessAI가 있다.

AIControllerClass = AMyAIController::StaticClass();
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;

 

AIController 클래스의 OnPossess 함수

ㄴ Possess 하기 시작하는 순간에 호출되는 함수

 

AIController 클래스의 OnUnPossess 함수

ㄴ Possess 끝날 때 호출되는 함수

 

Behavior Tree와 BlackBoard

BlackBoard : AI에서 사용할 데이터를 모아놓는 저장소

Behavior Tree : BlackBoard에 저장된 데이터를 기반으로 AI가 어떻게 동작할지 결정하는 트리

 

MyAIController 클래스에 두개의 멤버 추가

 

Wait과 MoveTo 사이에 오는 노드 실행에 실패하면 다음 노드 (MoveTo)는 실행되지 않는다.

시퀀스 노드는 왼쪽에서 오르쪽으로 자식 노드를 순서대로 실행한다.

Wait과 Move To 사이에 올 노드에서는 PatrolPos 값을 블랙보드에 갱신하는 작업을 해야 한다. 이것은 BTTaskNode 를 상속받는 클래스로 구현한다.

ExecuteTask 함수를 오버라이드한다.

이 노드를 가지는 OwnerComp는 BehaviorTreeComponent가 될 것이고, ExecuteTask 구현부에서 트리와 연관된 블랙보드에 키-값을 세팅한다.

 

주기적으로 주변을 탐색하여 행동을 결정하는 기능을 구현할 때 (서비스)

ㄴ BTService 클래스를 구현, 실행 주기를 정할 수 있음

 

일정 주기로 주변을 탐색하여 Target 키에 값을 갱신하는 SearchTarget 서비스
데코레이터 정의
블랙보드 키의 상태에 따라 성공 실패 여부가 결정되는 데코레이터 TargetOn, TargetOff

데코레이터는 조건에 따라 노드의 성공 실패 여부를 결정한다.

데코레이터를 양쪽 selector에 추가하여 분기문으로 동작하게 한다.

 

키의 상태만으로 성공 실패를 결정하지 않고 구체적으로 성공 실패를 결정하기 위한 데코레이터는 BTDecorator를 상속받는 클래스를 사용해야 한다.

CanAttack 이름의 노드를 가지는 데코레이터

데코레이터 생성을 위해 BTDecorator 클래스를 상속받는 클래스를 생성한다.

bool 값을 반환하는 함수를 재정의해야 한다. 여기서 반환하는 bool 값이 true면 왼쪽 자식 노드가 성공이다.

 

'언리얼 5 > 정리' 카테고리의 다른 글

라이팅 설정  (0) 2022.10.05
컨테이너  (0) 2022.09.15
충돌과 UI  (0) 2022.09.14
애니메이션  (0) 2022.09.13
Unreal의 기초  (0) 2022.09.12

프로젝트 세팅 -> 콜리전

Object Channels

콜리전을 가지는 물체들 사이의 충돌을 신경써야할 때 사용

ㄴ 기본 반응 (Ignore, block, overlap)

block : 충돌한다.

overlap : 뚫고 지나가지만 이벤트를 발생시킬 수 있음

Ignore  : 무시

 

캐릭터의 Capsule 컴포넌트에 콜리전 프리셋(충돌 규칙) 적용

블루 프린터 디테일 창에서 콜리전 프리셋을 설정해도 되고

Weapon->SetCollisionProfileName(TEXT("NoCollision")); 처럼 생성자에서 설정해줄 수도 있다.

 

Trace Channels

주위에 무엇이 있는지 논리적인 판단을 확인하거나 탐색하기 위해 사용

bool UWorld::SweepSingleByChannel 함수

ㄴ 트레이스 채널을 활용하여 첫 번째로 부딪힌 물체에 대한 충돌 정보를 얻을 수 있는 함수

 

Socket

메시 스켈레톤의 관절에 소켓을 추가하면 캐릭터의 손에 무기를 쥐어줄 수도 있다.

ㄴ Actor를 캐릭터 메시의 소켓에 attatch하는 방식으로

 

GameInstance

매니저 역할을 할 클래스는 GameInstance

프로젝트 세팅 -> 맵 & 모드 -> 게임 인스턴스 클래스 설정

 

전투 상황에서 체력 계산은 공격을 당해서 체력이 깎이는 쪽에서 처리를 해주는 편이 낫다.

 

액터 컴포넌트 (stat component)

ㄴ 캐릭터의 스탯 컴포넌트 (최대 체력, 레벨, 공격력 정보)

ㄴ OnAttacked 함수, SetStat 함수를 여기에 구현

 

싱글톤처럼 어디서든 GameInstance를 받아올 수 있는 방법

auto MyGameInstance = Cast<UMyGameInstance>(UGameplayStatics::GetGameInstance(GetWorld()));

 

UI

UI 프리팹마다 1대1로 대응되는 스크립트를 만들어 관리하는 것이 좋다. (Widget 클래스 상속)

 

HP UI를 3D로 캐릭터에 붙이는 코드 (MyCharacter.cpp)

HpBar = CreateDefaultSubobject<UWidgetComponent>(TEXT("HPBAR")); 
HpBar->SetupAttachment(GetMesh());
HpBar->SetRelativeLocation(FVector(0.f, 0.f, 200.f));
HpBar->SetWidgetSpace(EWidgetSpace::Screen); // World는 3D 세상의 UI, Screen은 화면에 항상 보이는 2D UI



static ConstructorHelpers::FClassFinder<UUserWidget> UW(TEXT("WidgetBlueprint'/Game/UI/WBP_HpBar.WBP_HpBar_C'"));
if (UW.Succeeded())
{
HpBar->SetWidgetClass(UW.Class); 
HpBar->SetDrawSize(FVector2D(200.f, 50.f));
}

 

UI를 만드는 여러가지 방식

1. UHUD 클래스를 상속받는 방법

ㄴ 언리얼 4 이전 버전에서 사용하던 방법

2. UserWiget 클래스를 상속받는 방법 (UMG)

ㄴ 비주얼 툴을 이용하여 UI를 만든다.

'언리얼 5 > 정리' 카테고리의 다른 글

라이팅 설정  (0) 2022.10.05
컨테이너  (0) 2022.09.15
AI Controller & Behavior Tree  (0) 2022.09.14
애니메이션  (0) 2022.09.13
Unreal의 기초  (0) 2022.09.12

 

애니메이션 기초

Skeletal Mesh의 Animation 속성을 활용한다.

ㄴ 애니메이션 블루프린트 클래스와 연결한다.

애니메이션 인스턴스를 활용할 때는 애니메이션 블루프린트라는 별도의 창에서 만들어야 한다.

캐릭터에 애니메이션 관련 코드를 넣는게 아니라 애니메이션 인스턴스에서 캐릭터의 상태를 읽어서 동작을 지정하는 방식을 쓰자

스테이트 머신

애니메이션 상태 관리는 웬만하면 블루프린트를 사용한다.

 

애니메이션 몽타주

애니메이션을 편집해서 또 다른 애니메이션을 만드는 기법

ㄴ 여러가지 애니메이션을 연결하여 하나의 긴 애니메이션을 만들 수 있다.

ㄴ 여러 개의 애니메이션을 섹션으로 구분하여 호출하고 싶은 섹션의 애니메이션을 재생할 수 있다.

스켈레탈 메시 -> 에셋 생성 -> 애님 몽타주

 

델리게이트

어떤 행동이 끝났을때 어떤 기능을 호출하고 싶을 때 사용함

 

DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnMontageEndedMCDelegate, UAnimMontage*, Montage, bool, bInterrupted); // Unreal의 델리게이트 선언 (Montage가 끝날 때 등록된 함수를 호출하는 델리게이트)

...

FOnMontageEndedMCDelegate OnMontageEnded; 

 

void AMyCharacter::BeginPlay()
{
Super::BeginPlay();

AnimInstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
AnimInstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);

}

ㄴ 애니메이션 몽타주가 끝날때 호출될 함수(OnAttackMonrageEnded)를 추가한다.

 

애니메이션 노티파이

애니메이션 클립 중간에 노티파이를 설정하여 애니메이션 중 원하는 타이밍에 함수를 호출할 수 있도록 한다.

ㄴ AnimatorInstance 클래스에 AnimNotify_[노티파이 이름]() 의 함수를 정의하면 된다.

ㄴ Montage_JumpToSection 함수를 활용하면 노티파이 이름

 

블렌드 스페이스

가중치에 따라 애니메이션을 섞는다.

ㄴ 캐릭터의 걷기 애니메이션 (상하좌우)를 섞어 블렌드 스페이스를 만들면 플레이어의 움직임을 자연스럽게 만들 수 있다.

'언리얼 5 > 정리' 카테고리의 다른 글

라이팅 설정  (0) 2022.10.05
컨테이너  (0) 2022.09.15
AI Controller & Behavior Tree  (0) 2022.09.14
충돌과 UI  (0) 2022.09.14
Unreal의 기초  (0) 2022.09.12

Unreal 엔진의 기초

Unreal은 월드 안의 요소(게임 객체)들의 유형이 정해져 있다.

Unity는 컴포넌트를 조립하여 요소의 유형을 결정한다.

 

Unreal은 C++ 게임 객체를 만들 때 부모 클래스의 종류를 정해주며 시작한다. (만들 때 부모 클래스를 지정한다.) 

Unity는 아무것도 없는 객체에 컴포넌트를 붙이는 방식이라면 Unreal은 종류가 정해진 객체에 컴포넌트를 붙이는 방식

이런 관점에서는 Unity가 Unreal보다 자유도가 더 높다.

 

Object (Unreal 게임 객체의 최상위 클래스)

ㄴ Actor

    ㄴ Pawn

        ㄴ Character

 

Actor 클래스 (AActor를 상속받음)

ㄴ BeginPlay() : 스폰될 때 한 번 실행되는 함수

ㄴ Tick() : 매 프레임 호출되는 함수

 

Unreal 특징

ㄴ C++ 클래스를 삭제하려면 엔진을 끄고 파일 탐색기에서 삭제해야 한다.

ㄴ 컴포넌트들을 스마트포인터 멤버로 관리한다.

ㄴ 컴포넌트를 추가할 때 컴포넌트들 중 하나는 루트 컴포넌트여야 한다.

ㄴ 빌드는 Visual Studio에서 해도 되고 엔진의 컴파일 버튼을 눌러도 된다.

ㄴ 유니티와 비슷하게 멤버를 private으로 관리하고 리플렉션 기능을 활용하여 엔진에서 수정할 수 있다.

ex) UPROPERTY(VisibleAnywhere) UPROPERTY(EditAnywhere, Category=BattleStat)

 

로그와 디버깅

로그

UE_LOG(카테고리, 로그 수준, 형식, 인자)

UE_LOG(LogTemp, Warning, TEXT("hello %d"), 3);

카테고리별로 로그를 볼 수 있다.

 

디버깅

엔진 끄고 솔루션 구성 Development editor나 debuggame editor로 설정 후 디버깅 시작하면 엔진이 켜짐

엔진의 플레이 버튼 누르면 중단점에 걸림

 

솔루션 구성의 Debug와 Development는 debug와 release의 관계와 비슷하다.

editor와 editor가 안붙은 것의 차이 

ㄴ editor 붙은 건 dll을 만들고 안 붙은건 exe를 만든다.

 

게임플레이 프레임워크

GameModeBase 클래스

ㄴ 게임의 규칙을 정의하는 클래스

월드 세팅

 

ctrl + n 단축키로 map을 생성할 수 있다.

ㄴ 세팅 -> 프로젝트 세팅 -> 맵&모드 -> 기본 맵 세팅

 

Pawn 클래스 (입력을 받을 수 있는 객체)

축과 액션에 대한 정보 세팅

ㄴ 세팅 -> 프로젝트 세팅 -> 엔진-입력 -> 축 매핑 이름 맞춰주기

 

Character 클래스

카메라가 캐릭터를 3인칭 시점으로 보이게 하기

ㄴ SpringArm은 CapsuleComponent에 붙인다.

ㄴ Camera는 SpringArm에 붙인다.

 

BluePrint

C++만을 사용하여 게임을 만들 수도 있지만 C++와 BluePrint를 적절히 섞어 사용하여 게임을 만들 수도 있다.

컴포넌트를 붙이거나 규칙을 정하는 과정을 시각화하여 표현한 것이다.

블루프린트 클래스가 C++ 클래스에 비해 느리긴 해도 유용하게 사용될 수 있다. 외형을 둘러볼 수도 있고 속성을 에디터에서 변경하여 적용해 볼 수도 있다.

기존에 만들어져 있는 C++ 클래스를 상속받는 블루프린트 클래스를 만들 수도 있다. 

 

'언리얼 5 > 정리' 카테고리의 다른 글

라이팅 설정  (0) 2022.10.05
컨테이너  (0) 2022.09.15
AI Controller & Behavior Tree  (0) 2022.09.14
충돌과 UI  (0) 2022.09.14
애니메이션  (0) 2022.09.13

+ Recent posts