728x90
* 아래의 책의 내용을 정리한 글입니다! *
월드란?
- 언리얼 프로젝트안의 가상 세계
- 공간, 시간, 물리 , 렌더링으로 구성되어있음
- 렌더링? >> 엔진이 제공하는 시각적인 기능, 빛과 이에 반응하는 머터리얼로 구성!
- 월드 세팅을 이용하여 수정가능
액터?
- 컨탠츠를 구성하는 최소단위의 물체
- 조작할수 있는, 없는 모든 것들을 보고 액터라한다.
- 이름, 유형(어떤 역할의 액터인지), 트랜스폼(방향과 회전성), 프로퍼티(액터의 속성), 게임로직(코드로 이루어진 행동 방식) 등으로 구성되어있다.
레벨?
- 월드보다는 작은 개념으로 하나의 스테이지, 그 안에 포함되어있는 모든 액터의 집합이라고 생각!
컴포넌트?
- 컴포넌트란 월드에 배치될수있는 오브젝트를 뜻하고 모든액터는 특정 컴포넌트로 정해져 있다.
- 스태틱메시 컴포넌트: 애니메이션이 없는 모델링 에셋. 시각적인 기능과 물리적인 기능 제공.
- 스켈레탈메시 컴포넌트: 애니메이션 정보가 있는 모델링 에셋. 시각적인 기능, 애니메이션, 캐릭터의 물리 기능을 제공하는 모듈이다.
- 콜리전 컴포넌트 : 구/박스/캡슐로 지정한 영역에 물리적인 기능을 설정하기 위해 제공하는 모듈이다. 시각적인 기능은 없다.
- 카메라 컴포넌트 : 현재 상황을 플레이어의 모니터 화면에 출력한다.
- 오디오 컴포넌트 : 소리를 발생시킨다.
- 파티클 시스템 컴포넌트 : 이펙트를 발생시킨다.
- 라이트 컴포넌트 : 물체에 광원 효과를 부여한다.
- 무브먼트 컴포넌트 : 물체에 특정한 움직임을 부여한다.
- 이중 여러개의 컴포넌트를 하나의 액터가 가지는 일도 가능하다!
실습! (분수대 액터 만들기)
하기전 언리얼 c++ 문법
- 클래스 선언 매크로 : 맨 윗줄에 UCLASS 매크로 선언, 클래스 내부에 GENERATED_BODY 매크로 선언
- 클래스 이름 접두사 : A는 액터 클래스에, U는 액터가 아닌 클래스에 사용!
- generated.h 헤더 파일 : 언리얼 오브젝트 선언의 마지막 #include 구문에 이 헤더파일을 선언
- 외부 모듈에의 공개 여부 : '모듈명_API' 라는 키워드를 클래스 선언 앞에 추가하여 다른 모듈에서 해당 객체에 접근할 수 있도록 한다.
기본적인 액터 헤더파일
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "EngineMinimal.h"
#include "GameFramework/Actor.h"
#include "Fountain.generated.h"
UCLASS()
class CPP_PORTFOLIO_API AFountain : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AFountain();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(VisibleAnywhere)// 바디 스태틱 컴포넌트
UStaticMeshComponent* Body;
UPROPERTY(VisibleAnywhere)// 워터 스태틱 컴포넌트
UStaticMeshComponent* Water;
UPROPERTY(VisibleAnywhere)// 라이트 라이트 컴포넌트
UPointLightComponent* Light;
UPROPERTY(VisibleAnywhere)// 스플래쉬 파티클 컴포넌트
UParticleSystemComponent* Splash;
UPROPERTY(EditAnywhere, Category=ID)// 현재 액터에 ID속성 추가
int32 ID;
};
해당 액터의 c++파일
// Fill out your copyright notice in the Description page of Project Settings.
#include "Fountain.h"
// Sets default values
AFountain::AFountain()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
Body = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BODY"));
Water = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WATER"));
Light = CreateDefaultSubobject<UPointLightComponent>(TEXT("Light"));
Splash = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("Splash"));
RootComponent = Body;
Water->SetupAttachment(Body);
Light->SetupAttachment(Body);
Splash->SetupAttachment(Body);
Water->SetRelativeLocation(FVector(0.0f, 0.0f, 135.0f));
Light->SetRelativeLocation(FVector(0.0f, 0.0f, 195.0f));
Splash->SetRelativeLocation(FVector(0.0f, 0.0f, 195.0f));
}
// Called when the game starts or when spawned
void AFountain::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AFountain::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
선언하고 값을 선언해줍시다.
그리고 아래의 사이트에서 소스코드와 기타 파일들을 받아
게임에 추가하고 해당 컴포넌트들에 넣어줍시다.
AFountain::AFountain(){
// ~ ~ ~ //
static ConstructorHelpers::FObjectFinder<UStaticMesh>
SM_BODY(TEXT("/Game/InfinityBladeGrassLands/Environments/Plains/Env_Plains_Ruins/StaticMesh/SM_Plains_Castle_Fountain_01.SM_Plains_Castle_Fountain_01"));
if (SM_BODY.Succeeded()) {
Body->SetStaticMesh(SM_BODY.Object);
}
static ConstructorHelpers::FObjectFinder<UStaticMesh>
SM_WATER(TEXT("/Game/InfinityBladeGrassLands/Environments/Plains/Env_Plains_Ruins/StaticMesh/SM_Plains_Castle_Fountain_02.SM_Plains_Castle_Fountain_02"));
if (SM_WATER.Succeeded()) {
Water->SetStaticMesh(SM_WATER.Object);
}
static ConstructorHelpers::FObjectFinder<UParticleSystem>
PS_SPLASH(TEXT("/Game/InfinityBladeGrassLands/Effects/FX_Ambient/Water/P_Water_Fountain_Splash_Base_01.P_Water_Fountain_Splash_Base_01"));
if (PS_SPLASH.Succeeded()) {
Splash->SetTemplate(PS_SPLASH.Object);
}
// ~ ~ ~ //
}
해당 위치는 에셋 >> 우클릭 >> 레퍼런스 복사를 위해 찾을수 있습니다
틀린점이 있다면 댓 달아주세요!
'언리얼 최고 > 언리얼 c++' 카테고리의 다른 글
이득우의 언리얼 C++ 정리 - 5 (폰의 제작과 조작) (0) | 2022.08.19 |
---|---|
이득우의 언리얼 C++ 정리 - 4 (게임플레이 프레임워크) (0) | 2022.08.17 |
언리얼 C++ 액터 삭제에 대해서! (0) | 2022.08.17 |
이득우의 언리얼 C++ 정리 - 3 (로깅 + 움직이는 액터) (0) | 2022.08.16 |
이득우의 언리얼 C++ 정리 - 1 (프로젝트 생성시 파일들) (0) | 2022.08.16 |
댓글