언리얼에선 유니티와 달리 카테고리가 꽤 세분화 되어있다.
뭐.. 사실 유니티도 요즘 꽤 세분화 되어있지만, 언리얼이 꽤 불친절해서 그런가.. 암튼 그렇다.
예로들어 캐릭터를 만든다는 가정을 할때
유니티는 빈 오브젝트 - 캡슐 콜라이더와 리지드 바디, 캐릭터 움직임 관련 스크립트
뭐.. 이정도인데
언리얼의 경우 계층이 나뉘어 있는데, 예로들어 콘텐츠 브라우저에서 새 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 |