본문 바로가기
# 게임/# UE

[UE4] 1일차

by 쁘레레레레레 2022. 6. 6.

언리얼에선 유니티와 달리 카테고리가 꽤 세분화 되어있다.

뭐.. 사실 유니티도 요즘 꽤 세분화 되어있지만, 언리얼이 꽤 불친절해서 그런가.. 암튼 그렇다.

 

예로들어 캐릭터를 만든다는 가정을 할때

유니티는 빈 오브젝트 - 캡슐 콜라이더와 리지드 바디, 캐릭터 움직임 관련 스크립트

뭐.. 이정도인데

 

언리얼의 경우 계층이 나뉘어 있는데, 예로들어 콘텐츠 브라우저에서 새 C++ 클래스 만들기를 선택했을때

여러가지가 나오는데 설명을 보면 계층을 대충 파악할 수 있다.

 

캐릭터의 경우 '걸어다니는 기능이 포함된 폰 유형' 이라고 되어있다.

 

배우면서 유니티와 기능은 같은데 창 이름이 달라서 그냥.. 비교 나열 해봤다.

언리얼 유니티
콘텐츠 브라우저(Contents Browser) Project
월드 아웃라이너(World Outliner) 하이어라키(Hierarchy)
디테일(detail) 인스펙터(Inspector)

 

우선 난 Actor라는 애를 만들었다.

여기서 MyActor.h를 만들면 당연히 cpp파일까지 만들어진다.

 

열면 아래와 같이 나온다.

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class SORCERESS_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

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) //월드아웃라이너(하이어라키 in Unity)에 띄워주는 용도
		// 유니티 기준 [Serializefield]와 흡사함. 다만 걔네처럼 수정은 안됨. 그냥 보여주는 용도
	UStaticMeshComponent* Mesh;

	UPROPERTY(EditAnywhere,Category="BattleStat")
		//유니티기준 [Header("")]역할
	int32 Hp;

	UPROPERTY(EditAnywhere,Category = "BattleStat")
		//VisibleAnywhere에서 edit기능이 있는것. 상단의 serializefield와 같다고 볼 수 있음.
	int32 Mp;
};

 

위부터 설명하겠다.

1. CoreMinimal.h 의 경우 예전 c++배울당시 어.. 뭐였더라.. 헤더를 모아놓는 파일이 있었는데 딱 그 역할을 한다.

실제로 f12를 눌러 파일을 찾아가보면 꽤 많은 헤더가 포함되어있는데 꼭 코어 미니멀을 안써도 된다.

대신 따로 헤더를 하나하나 추가해줘도 되는데  코어미니멀의 경우 하나하나 전부 참조해 불러들이기 때문에 시간이 오래걸린다고 한다.   물론 난 뉴비니까 그냥 둘 생각이다.

 

2. UCLASS() 이건 그냥 느낌상 아래가 무엇이라고 알려주는 느낌이다.

 

아래로 쭉 내려와서

 

3. UPROPERTY()

언리얼 문서 기준으로 프로퍼티 선언이라고 한다.

안에 올 수 있는 변수는 프로퍼티 | 언리얼 엔진 문서 (unrealengine.com) 해당 문서의 중단지점 프로퍼티 지정자에 가보면 되는데 난 현재 두가지만 사용했다.

 

3-1. UPROPERTY(VisibleAnywhere)

주석에 써있듯 유니티 기준으로 하이어라키 내 오브젝트에서 해당 프로퍼티를 가시적으로 보여주는 역할이다.

[SerializeField]와 비슷한 역할이나 값 변경은 불가하다.

 

3-2. UPROPERTY(EditAnywhere)

[SerializeField]와 아주 흡사하다. 똑같이 띄워주는 역할 + 수정까지 된다.

 

3-3. UPROPERTY(Category="ABCD")

유니티 기준 [Header("ABCD")]역할과 같다. 해당 카테고리를 넣어주지 않으면 해당 오브젝트의 명 혹은 스크립트 헤더 명으로 뜨는것 같다. 내 기준 MyActor로 떴었다.

 

4. UStaticMeshComponent * Mesh;

메쉬형 static Component용으로 쓰는것 같다.

 

cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyActor.h"

// Sets default values
AMyActor::AMyActor()
{
 	// 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;

	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));

	RootComponent = Mesh;

	static ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/Geometry/Meshes/1M_Cube.1M_Cube'"));

	if (SM.Succeeded())
	{
		Mesh->SetStaticMesh(SM.Object);
	}
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

1.Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));

헤더에서 선언한 Mesh에 CreateDefaultSubobject에 알맞게 넣어준 후 TEXT로 Mesh라고 생성해 넣어준다.

 

2. RootComponent = Mesh;

생성된 메쉬를 루트 컴포넌트로 지정한다.

 

3. static ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/Geometry/Meshes/1M_Cube.1M_Cube'"));

이건 음.. 아무래도 특정 에셋의 내용을 가져와서 넣기 위함인듯 하다.

ConstructorHelpers의 finder를 이용해 SM이라는 이름을 내가 임의로 정해줬고 TEXT를 이용해 " " 안에 경로를 넣어준것인데 아래 사진처럼 본인이 쓸 메쉬를 하나 선택한 후 복사(Ctrl+c)를 한 후 

TEXT란에 붙여넣기 해주면 알아서 경로가 들어간다. (개꿀)

 

그렇게 한 후

SM의 경로에 가서 성공적으로 불러온다면 -> set해라 라는 코드가 있음을 유추해 볼 수 있다.

 

오늘은 여기까지다.

 

음.. 뭔가 굉장히 좋은 퀄리티의 재료들만 있다면 질 좋은 게임을 만들 수 있을것 같다.

다만 UPROPERTY같은 애들 안에 인수들을 쓸때 자동완성이 없어서 굉장히 아쉽다.

 

이게 무거워서 뜨는데 시간이 걸리는건지... (집이 개똥컴... )

아니면 그냥 안뜨는건지 모르겠으나.. 아무튼.. VisibleAnywhere이런거 안떠서 ..ㅎㅎ...

 

엿같은 회사에서 VR작업보다 차라리 내 꿈을 위해 언리얼을 공부하는게 미래에 더 이득이 되길 바라며...

'# 게임 > # UE' 카테고리의 다른 글

[UE4] 곧 올릴 예정 애니메이션 ~ 충돌 / 사소한 UE 이슈들 ~ 구조  (0) 2022.07.11
[UE4] 2일차 - 디버깅  (0) 2022.06.07
뷰포트 구리다.  (0) 2022.01.05
Project SEED 1  (0) 2021.12.06