2024-04-11
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
C++ 클래스에서 블루프린트와 리플렉션 하는 방법을 배웠다. 그리고 SpawnActor로 C++ 클래스에서 특정 스태틱 메시 컴포넌트를 가져올 수 있다. 그리고 템플릿이기 때문에 타입을 추가해주어야한다.
발사체를 얻기 위해서 쓴다. 클래스 타입을 나타내는 c++ 변수를 갖게 되었다
타입은 AProjectile이고 블루프린트 클래스도 이걸 바탕으로 만든다
UClass 타입을 저장한다. UClass에는 c++와 블루프린트 사이 리플렉션을 가능하게 하는 함수가 내장되어 있다.
왜 TSubcalssOf 인가? 이거 템플릿임
C++과 블루프린트 사이에 리플렉션이 가능하게 하려고 쓴다.
BasePawn.h 헤더파일에 private 변수로 다음을 추가해주자.
private:
UPROPERTY(EditDefaultsOnly, Category = "Combat")
TSubclassOf<class AProjectile> ProjectileClass;
void ABasePawn::Fire()
{
// ProjectileSpawnPoint로 발사 위치를 알고 있으니까 GetComponentLocation로 해당 위치를 가져온다.
FVector Location = ProjectileSpawnPoint->GetComponentLocation();
// ProjectileSpawnPoint로 발사 위치를 알고 있으니까 GetComponentLocation로 해당 회전을 가져온다.
FRotator Rotation = ProjectileSpawnPoint->GetComponentRotation();
// AProjectile로 Location, Rotation을 넘긴다.
GetWorld()->SpawnActor<AProjectile>(ProjectileClass, Location, Rotation
}
// 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;
};
// 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);
}