virtual
부모 클래스에서 사용한다.
자식 클래스가 재정의 할 수 있다라는 뜻.
override
자식 클래스에서 사용한다.
부모 클래스에서 정의한 virtual(가상함수)를 사용하겠다.
virtual 자료형 함수이름() = 0;
순수 가상함수.
Property 선언
블루프린트, 에디터에서 사용하기 위해 선언하는 것.
블루프린트의 Class Settings - Parent Class에 해당 클래스가 맞는지 확인
EditAnywhere : 에디터상 어디서나 편집가능.
EditDefaultsOnly : 블루프린트 안에서만 가능, 디테일 창, 플레이에서 불가능
EditFixedSize : 배열의 사이즈를 변경 못하게 함.
*EditInline : 프로퍼티에 참조된 오브젝트의 프로퍼티를 편집할 수 있도록 합니다.
EditInstanceOnly : 게임 플레이 상황에만 편집 가능. (클래스가 인스턴스화 되었을 때)
VisibleAnywhere : 에디터상 어디서나 표시. 편집은 불가
VisibleDefaultsOnly : 블루 프린트 안에서만 가능.
VisibleInstanceOnly : 게임 플레이 상황에만 표시
SimpleDisplay : 디테일 패널에 바로 표시.
BlueprintReadOnly : 블루 프린트에서 수정 불가.
BlueprintReadWrite : 블루 프린트에서 수정 가능.
Category ="TopName|SubName|SubSubName" 카테고리를 만들 수 있음. '|' 이용.
프로퍼티 메타 데이터 지정자
meta =
AllowPrivateAccess="true" : Private형식이어도 블루 프린트에서 접근 가능하게 함.
ClampMin = n, ClampMax = m : 해당 값을 n과 m사이 값으로 고정함.
Displayname : c++내의 변수 명과 다르게 블루 프린트 상의 이름을 정함.
Tooltip : 해당 프로퍼티에 대한 설명을 쓸 수 있음.
TMap
TMap <key(자료형), 값(자료형)> TMap이름;
if 문을 사용하는 것은 존재하지 않는 TMap을 사용하는 에러를 방지하기 위함이다.
블루프린트에서 TMap을 사용할 경우, 미리 초기화 해주지 않으면, 에러가 발생한다.
따라서, TMap.Num()을 이용해서, 초기화를 해줘야 한다.
BeginPlay()에서 실행되므로 플레이 화면에서만 확인가능
BeginPlay()에서 쓰는 경우는 위의 생성자 이후에 사용하는 경우.
DELEGATE
Player Character 만들기
PlayerCharacter.h
Spring Arm과 Camera를 이용해 카메라를 설정할 생각이므로 변수를 만든다.
PlayerCharacter.cpp
Chracter는 기본적으로 Mesh, Capsule Component, Arrow Component를 갖고 있으므로, 메쉬를 따로 추가할 필요가 없다. 이것을 사용하기 위해서 메쉬를 찾아다 사용한다.
// 콘텐츠 브라우저에서 메쉬를 찾는다.
ConstructorHelpers::FObjectFinder<USkeletalMesh>PlayerMesh(TEXT("경로"));
경로 이름은 마우스 우클릭, CopyReference
GetMesh()->SetSkeletalMesh를 이용해서 찾은 메쉬를 넣어준다.
GetMesh()->SetWorldLocationAndRotation을 통해 위치와 회전을 통해 정면방향으로 한다.
CreateDefaultSubobject<컴포넌트형식>TEXT("컴포넌트이름")
컴포넌트 형식의 오브젝트를 컴포넌트 이름으로 생성한다.
SetupAttachment(붙일 위치)
컴포넌트가 붙일 위치를 정한다. RootComponent는 가장 상위 바로 밑
C++에서 정한 값은 블루프린트에서 바꿀 수 있다.
단, 블루프린트에서 바뀐 값이 C++에 저장되는 게 아니므로 주의하자.
Enhanced Input
Editor - Input - Enhanced Input
Enhanced Input
Editor - Input - Enhanced Input
Editor - Plugin - Enhanced Input
프로젝트이름.build.cs의 PublicDependencyModuleNames.AddRange({"EnhancedInput"});
프로젝트이름.build.cs의 PublicDependencyModuleNames.AddRange({"EnhancedInput"});
Generate Visual Studio Project file
CPP 파일
Enhanced Input을 사용하기 위해 Include
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubSystems.h"
#include "InputMappingContext.h"
Input, Input Mapping Context
static ConstructorHelpers::FObjectFinder<UInputMappingContext> InputContext(TEXT("/Script/EnhancedInput.InputMappingContext'/Game/Input/IMC_PlayerDefault.IMC_PlayerDefault'"));
if (InputContext.Object != nullptr)
{
DefaultContext = InputContext.Object;
}
static ConstructorHelpers::FObjectFinder<UInputAction> InputMove(TEXT("/Script/EnhancedInput.InputAction'/Game/Input/IA_Move.IA_Move'"));
if (InputMove.Object != nullptr)
{
MoveAction = InputMove.Object;
}
static ConstructorHelpers::FObjectFinder<UInputAction> InputLook(TEXT("/Script/EnhancedInput.InputAction'/Game/Input/IA_Look.IA_Look'"));
if (InputLook.Object != nullptr)
{
LookAction = InputLook.Object;
캐릭터에 EnhancedInput
if (APlayerController* PlayerController = Cast<APlayerController>(GetController()))
{
if (UEnhancedInputLocalPlayerSubsystem* SubSystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
{
SubSystem->AddMappingContext(DefaultContext, 0);
}
UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &APlayerCharacter::Move);
EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &APlayerCharacter::Look);
이동
const FVector2D MovementVector = value.Get<FVector2D>();
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
AddMovementInput(ForwardDirection, MovementVector.Y);
화면 회전
FVector2D LookAxisVector = value.Get<FVector2D>();
AddControllerYawInput(LookAxisVector.X * GetWorld()->DeltaTimeSeconds * mouseSpeed);
AddControllerPitchInput(LookAxisVector.Y * GetWorld()->DeltaTimeSeconds * -mouseSpeed);
SpringArm->bUsePawnControlRotation = true;
Visual Studio 단축키
Ctrl + / 전체 주석
Ctrl + K, O Header <-> cpp이동
Visual studio 연동 문제 생길 때
Engine이랑 Games Source위치에 존재하는 잘못 생성된 cpp, h파일 삭제.
탐색기 Source파일에 확인
프로젝트 파일 위치의 파일 4개 삭제, Generated visual studio
Visual Studio 열어서, 솔루션 정리
오류 발생 해결 순서
1. 오류 발생 Output 확인
2. 오류 위치 주석 처리
3. 오류 관련 로그 UE_LOG / GEngine->AddOnScreenDebugMessage()
🪽참고
UProperty 선언
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-uproperties?application_version=5.3
메타 데이터
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/metadata-specifiers-in-unreal-engine
TMap
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/tmap?application_version=4.27
DELEGATE
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/delegates-and-lambda-functions-in-unreal-engine