[12. Actors and Actor Components]
![](https://blog.kakaocdn.net/dn/cL62V9/btrLiqMEbqx/WZpQ0oMKDpXJ90slBz6g71/img.png)
4.26 버전 기준으로 새로운 폴더를 만들어서 C++ 클래스를 넣는 경우 핫 리로드가 실패하게 된다. IDE에서 컴파일도 안된다.
// Floater.cpp
#include "GameplayActors/Floater.h" // 이렇게 되어있는것을
#include "Floater.h" // 이렇게 변경
폴더 경로를 지워주면 정상적으로 작동한다.
다른 클래스에서 해당 클래스를 포함하려 한다면 그때는 경로가 있어야 한다.
MyFloat의 헤더파일과 cpp파일이 같이 있으므로 경로가 필요 없던것 뿐이지 다른곳에서는 당연히 경로가 필요하다.
반대로 MyFloat에서 다른 클래스에 접근하려면 마찬가지로 경로를 지정해 주어야 한다.
// Floater.h
UPROPERTY(VisibleAnywhere, Category = "ActorMeshComponents")
UStaticMeshComponent* StaticMesh;
![](https://blog.kakaocdn.net/dn/cI2Ybg/btrLhuhYiaC/R3qkok7LmLCrqNG4B5jws1/img.png)
해당 코드만 추가해서는 아직 StaticMesh 컴포넌트가 생성되지 않는다.
// Floater.cpp
AFloater::AFloater()
{
// 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;
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("CustomStaticMesh"));
}
![](https://blog.kakaocdn.net/dn/cqgS3W/btrLkavPcLO/4Rje5kvkqHPiCZZvXrs7gk/img.png)
생성자에서 CreateDefaultSubobject를 통해 새로운 컴포넌트를 생성해주면 컴포넌트가 추가된다.
이후 디테일 탭에서 Static Mesh를 아무거나 고르고 월드에 배치하면 해당 메시가 잘 보여진다. 여러개도 배치할 수 있다.
Static Mesh가 루트 컴포넌트이므로 End키로 바닥에 딱 붙일수도 있다. (Default Component가 루트 컴포넌트인 경우에는 절반이 파묻힘)
[13. Position Vector]
벡터는 기본적으로 공간의 한 점을 나타내는 방법이다.
오브젝트를 고르고 Shift를 누른 상태로 위치를 변경하면 해당 오브젝트에 카메라가 고정된 상태로 변경된다.
[14. The FVector #1]
void AFloater::BeginPlay()
{
Super::BeginPlay();
FVector InitialLocation = FVector(0.f, 0.f, 0.f);
SetActorLocation(InitialLocation);
}
MyFloat의 위치를 어떻게 배치하던간에 실행 시 원점으로 자동 배치된다.
FVector는 구조체로 만들어져있다.
[15. FVector #2]
FVector는 일반적으로 포인터로 선언되지 않는다.
// Floater.h
UPROPERTY(EditInstanceOnly, BlueprintReadWrite, Category = "FloaterVectors")
FVector InitialLocation = FVector(0.f, 0.f, 0.f);
EditInstanceOnly는 월드상에 배치된 오브젝트의 디테일 패널에서 값을 수정 가능하게 한다.
![](https://blog.kakaocdn.net/dn/ddnhBo/btrLjit1Y6o/RdSBHWqut6ZltnjX3b5Yak/img.png)
여담으로 Edit와 Visible의 차이는 readwrite, readonly 정도의 차이이다.
위는 EditInstanceOnly, 아래는 VisibleInstanceOnly.
// Floater.h
// Location of the Actor when dragged in from the editor
UPROPERTY(VisibleInstanceOnly, BlueprintReadWrite, Category = "Floater Variables")
FVector PlacedLocation;
// 블루프린트 디테일 창에서만 볼 수 있음
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Floater Variables")
bool bInitialzeFloatLocations;
// Floater.cpp
AFloater::AFloater()
{
// 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;
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("CustomStaticMesh"));
InitialLocation = FVector(0.f);
PlacedLocation = FVector(0.f);
bInitialzeFloatLocations = false;
}
// Called when the game starts or when spawned
void AFloater::BeginPlay()
{
Super::BeginPlay();
PlacedLocation = GetActorLocation();
if (bInitialzeFloatLocations)
{
SetActorLocation(InitialLocation);
}
}
![](https://blog.kakaocdn.net/dn/cCOP3q/btrLhf6oNBe/90RzWwTOBnQ7t5WXjekXzk/img.png)
인스턴스의 디테일 창에서는 뜨지 않고 블루프린트의 디테일 창에서만 뜨게 된다.
해당 값을 True로 설정한 경우에만 시작시 인스턴스에서 지정한 InitializeLocation 위치로 이동할 것이고 False인 경우에는 이동하지 않게 된다.
UPROPERTY의 속성값에 따라 인스턴스, 블루프린트에서 표시하거나 ReadWrite, ReadOnly를 통해 읽기전용/읽고쓰기를 설정할 수 있게된다.
[16. FVector #3]
// Floater.h
UPROPERTY(VisibleDefaultsOnly, BlueprintReadWrite, Category = "Floater Variables")
FVector WorldOrigin;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Floater Variables")
FVector InitialDirection;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Floater Variables")
bool bShouldFloat;
// Floater.cpp
AFloater::AFloater()
{
WorldOrigin = FVector(0.f);
InitialDirection = FVector(0.f);
bInitialzeFloatLocations = false;
}
void AFloater::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (bShouldFloat)
{
FHitResult HitResult;
AddActorLocalOffset(InitialDirection, false, &HitResult);
}
}
![](https://blog.kakaocdn.net/dn/pu6gv/btrLhhwlEac/XnXfZs9M5h9X9bO16bvdAk/img.png)
블루프린트 클래스에서 Should Float를 True로 바꿔주면 조건이 충족되어서 오브젝트들이 매 틱마다 FVector만큼 이동한다.
![](https://blog.kakaocdn.net/dn/uvu5f/btrLgRLBfC5/0hZUdbM2K24PB7q9FkDQak/img.png)
인스턴스에서 Initial Direction을 설정해주면 된다. 여러개의 블루프린트 클래스를 배치하고 각기 다른 값을 주면 서로 다른 방향으로 날아가게 된다.
'언리얼 엔진 > UE4 C++' 카테고리의 다른 글
[UE C++] The Pawn Class #1 (0) | 2022.09.04 |
---|---|
[UE C++] The Actor Class #2 (0) | 2022.09.04 |
[UE C++] Intro to Unreal Engine C++ (0) | 2022.09.03 |
[UE C++] Download UE4, and Intro to the Engine (0) | 2022.09.03 |
[UE C++] Unreal Engine C++ The Ultimate Game Developer Course 시작 (0) | 2022.09.03 |