[ Unreal Engine 5 / #1 개념 + 움직임 ]

SeungWoo·2024년 8월 28일
0
post-thumbnail

  • Java, C#
    • 특징
      • IL를 거쳐 컴파일 하기 때문에 느리다
      • One Source, Multi use
      • IL(Intermediat Language) : 중간 언어를 만들고, 컴파일 한다
      • VM, .NET : 가비지 컬렉션, 메모리할당, 해제등을 당담한다
  • C, C++
    • 특징
      • 바로 기계어로 컴파일 하기 때문에 빠르다

  • Unreal C++
    • 특징
      • new 할당을 하는 것 아니라서 메모리 할당, 해제를 신경 X

Unreal Script

기본 언리얼 C++ 스크립트

UCLASS(Blueprintable)
class MYPROJECT_API AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    // 클래스의 생성자
    AMyCharacter();

    // 클래스의 속성과 메서드를 정의
};

  • CLASS()
    Unreal Engine의 리플렉션(reflection) 시스템과 함께 사용됩니다. 이 매크로는 언리얼 엔진의 여러 시스템이 클래스에 대해 메타데이터( MetaInfo )를 생성하고, 이를 기반으로 다양한 기능을 제공

    • 주요 기능
      • 리플렉션 시스템 지원
        • 리플렉션 시스템은 런타임에 클래스의 메타데이터를 확인하고, 클래스나 멤버 변수, 함수에 접근할 수 있도록 합니다. 이를 통해 블루프린트에서 C++ 클래스를 노출하거나, 다양한 엔진 시스템과의 상호작용이 가능해집니다.
      • 가비지 컬렉션
        • UCLASS() 매크로로 선언된 클래스는 언리얼 엔진의 가비지 컬렉션 시스템에 의해 관리됩니다. 이는 메모리 누수를 방지하고, 객체 수명을 자동으로 관리하는 데 도움을 줍니다.
      • 블루프린트 노출
        • UCLASS()와 함께 사용되는 특정 매크로(Blueprintable, BlueprintType 등)를 통해, C++ 클래스를 블루프린트에서 사용할 수 있도록 노출할 수 있습니다. 이를 통해 게임 디자이너들이 블루프린트에서 해당 클래스를 기반으로 새로운 오브젝트를 생성하고 사용할 수 있습니다.
  • 언리얼 생성자가 하는 일

    • Class Default Object => Copy 하면서 더 빠르게 작업이 가능하다 => CDO
    • 에디터가 로드되는 순간에 CDO가 로드 된다
    • 기본적으로 File에 올려놓아진 파일을 미리 로드 하면서 객체를 만든다 ( Pool )

  • UObject
    • 메모리관리
    • UObject를 상속 받기 때문에 Actor, Component UPROPETY()를 사용한다
    • 구조체는 UObject를 상속받지 않기 때문에 스마트 포이너터를 사용 한다
    • 스마트 포인터
      • 할당 해제를 해주는 코드로 메모리를 관리하기 위해 사용하는 API
      • 할당할때 Ref Count를 주고 해제할땐 그 카운터를 주면서 참조 카운터를 ++ -- 해서 0이면 해제하는 방법
      • TSharedPTR

  • Visible, Eidt
    • DefaultsOnly
      • class
    • InstanceOnly
      • instance
    • Anywhere
      • class, instance
  • Object Pool
    • 총알 ( Instance )
    • Stream ( 데이터를 주고 받는 통로 )
    • Class

  • Actor를 상속받은 Pawn 상속받은 character
    • 하나의 Player만 다룬다
    • playerController가 하나의 Pawn에게 Possess 한다

몸체 설정 C++

.h

public:
	// box collision comp
	// 메타데이터로 올려놓으면 메모리관리에 올라가 빠르게 가져온다
	UPROPERTY(VisibleAnywhere)
	class UBoxComponent* BoxComp;

	UPROPERTY(VisibleAnywhere)
	class UStaticMeshComponent* BodyMesh;
  • UBoxComponent* 전방선언

.cpp

ACPlayer::ACPlayer()
{
 	// Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComp"));
	RootComponent = BoxComp;
	
	// box 사이즈
	BoxComp->SetBoxExtent(FVector(50));
	// boxComp 충돌처리
	BoxComp->SetCollisionProfileName(TEXT("OverlapAll"));

	BodyMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyMesh"));
	BodyMesh->SetupAttachment(BoxComp);

	// 에셋 등록 
	ConstructorHelpers::FObjectFinder<UStaticMesh> TempMesh
	(TEXT("/Script/Engine.StaticMesh'/Engine/BasicShapes/Cube.Cube'"));
	// 에셋이 정상 로드 되면
	if (TempMesh.Succeeded())
	{
		// -> 스택틱메시 할당
		BodyMesh->SetStaticMesh(TempMesh.Object);
	}

	// Matrial 로드하기
	ConstructorHelpers::FObjectFinder<UMaterial> TempMat
	(TEXT("/Script/Engine.Material'/Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial'"));
	if (TempMat.Succeeded())
	{
		// -> 스택틱메시 할당
		BodyMesh->SetMaterial(0,TempMat.Object);
	}	
	BodyMesh->SetCollisionProfileName(TEXT("NoCollision"));
}
  • BoxComponent 와 StaticMesh를 할당하고 Size와 에셋을 로딩한다

움직임

오른쪽 움직이기

void ACPlayer::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	// 등속운동, 등가속운동
	// P = P0 + vt
	FVector newVector(0, 1, 1);
	FVector P0 = GetActorLocation();
	FVector vt = newVector * 500 * DeltaTime;
	
	FVector P = P0 + vt;
	SetActorLocation(P);
}
profile
This is my study archive

0개의 댓글