[UE5] TIL - 19 <GetPlayerPawn, FTimerManager>

ChangJin·2024년 4월 11일
0

Unreal Engine5

목록 보기
46/102
post-thumbnail

2024-04-11

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
C++ 클래스에서 블루프린트와 리플렉션 하는 방법을 배웠다. 그리고 SpawnActor로 C++ 클래스에서 특정 스태틱 메시 컴포넌트를 가져올 수 있다. 그리고 템플릿이기 때문에 타입을 추가해주어야한다.

TIL

  • TSubclassOf
  • SpawnActor<>()

TSubclassOf

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/typed-object-pointer-properties-in-unreal-engine?application_version=5.3


  • 발사체를 얻기 위해서 쓴다. 클래스 타입을 나타내는 c++ 변수를 갖게 되었다

  • 타입은 AProjectile이고 블루프린트 클래스도 이걸 바탕으로 만든다

  • UClass 타입을 저장한다. UClass에는 c++와 블루프린트 사이 리플렉션을 가능하게 하는 함수가 내장되어 있다.

  • 왜 TSubcalssOf 인가? 이거 템플릿임

  • C++과 블루프린트 사이에 리플렉션이 가능하게 하려고 쓴다.

  • BasePawn.h 헤더파일에 private 변수로 다음을 추가해주자.


private:
	UPROPERTY(EditDefaultsOnly, Category = "Combat")
	TSubclassOf<class AProjectile> ProjectileClass;



SpawnActor<>()

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/spawning-actors-in-unreal-engine?application_version=5.3


  • 액터스폰하기란 이름으로 공식문서에서 굉장히 자세하게 다루는 내용이다.
  • 액터를 월드에 스폰하기 위해서 쓰인다.
  • "Actor 의 새 인스턴스를 생성하는 과정을 스폰 (spawn)이라 합니다. Actor 의 스폰은 UWorld::SpawnActor() 함수를 이용합니다. 이 함수는 지정된 클래스의 새 인스턴스를 생성한 다음 새로 생성된 Actor 로의 포인터를 반환합니다. UWorld::SpawnActor() 는 클래스 계층구조 내 Actor 클래스를 상속하는 클래스 인스턴스를 생성할 때만 사용해야 합니다." 라고 한다.

  • BasePawn.cpp 파일에 다음의 함수를 추가해준다.
  • 그러면 ProjectileSpawnPoint의 위치, 회전 방향으로 발사체가 생성된다.

void ABasePawn::Fire()
{
	// ProjectileSpawnPoint로 발사 위치를 알고 있으니까 GetComponentLocation로 해당 위치를 가져온다.
	FVector Location = ProjectileSpawnPoint->GetComponentLocation();
	// ProjectileSpawnPoint로 발사 위치를 알고 있으니까 GetComponentLocation로 해당 회전을 가져온다.
	FRotator Rotation = ProjectileSpawnPoint->GetComponentRotation();
	// AProjectile로 Location, Rotation을 넘긴다.
	GetWorld()->SpawnActor<AProjectile>(ProjectileClass, Location, Rotation
}

  • 발사체는 Projectile이라는 c++ 클래스를 만들어서 이 클래스를 기반으로 블루프린트를 만들었기 때문에 그 블루프린트를 가져와서 생성해야해서 위와같은 과정을 거쳤다.

  • 이건 Projectile.h 헤더파일이고

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

#pragma once

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

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

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

private:
	UPROPERTY(EditDefaultsOnly, Category = "Combat")
	class UStaticMeshComponent* ProjectileMesh;
	
public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

  • 이건 Projectile.cpp 파일이다.
  • 특이한 점은 여기서는 PrimaryActorTick.bCanEverTick가 false로 되어있다.
  • 매 프레임 액터를 업데이트하는 데 사용되는데 지금은 생성만 하고 있기때문에 false로 한다. true로 만들면 매 프레임마다 위치, 방향등을 업데이트할 수 있다.
// Fill out your copyright notice in the Description page of Project Settings.


#include "Projectile.h"
#include "Components/MeshComponent.h"

// Sets default values
AProjectile::AProjectile()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;

	ProjectileMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Projectile Mesh"));
	RootComponent = ProjectileMesh;

}

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

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

}


profile
Unreal Engine 클라이언트 개발자

0개의 댓글