본문 바로가기
언리얼 최고/언리얼 c++

이득우의 언리얼 C++ 정리 - 2 (액터의 설계)

by Lee_story_.. 2022. 8. 16.
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);

}

선언하고 값을 선언해줍시다.

 

 

 

그리고  아래의 사이트에서 소스코드와 기타 파일들을 받아

 

이득우의 언리얼 C++ 게임 개발의 정석

언리얼 엔진 학습에 목말라하는 게임 개발자에게 단비 같은 언리얼 엔진 프로그래밍 책이다.

www.acornpub.co.kr

 

 

 

게임에 추가하고 해당 컴포넌트들에 넣어줍시다.

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);
	}
    
// ~ ~ ~ //
}

 

해당 위치는 에셋 >> 우클릭 >> 레퍼런스 복사를 위해 찾을수 있습니다

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글