caution!!
this document is made in unreal 4.14
-------------------------------------------------------------------------------------------------------
목표
1 월드 내에 Spawner(world 상에 있는 액터)를 만들어 Monster(액터지만 world상에 없는) 를 월드에 출현 시킨다.
-------------------------------------------------------------------------------------------------------
Speudo Code
SpawnerLocating이 MyMonster을 World에 출현시킨다.
각 클래스에 있는 Mesh와 Material은 단순히 테스트 실행시 보여주기 쉽기 위해 집어 넣었을 뿐이다.
SpawnPointer라는 MyMoster형의 포인터를 생성하고 거기에 동적으로 메모리를 할당하고 그것을 월드상에 출현 시킨다.
-------------------------------------------------------------------------------------------------------
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "MyMonster.h"
#include "GameFramework/Actor.h"
#include "SpawnerLocating.generated.h"
UCLASS()
class STUDY_0207_API ASpawnerLocating : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ASpawnerLocating();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
public:
#pragma region custom Variable
//component
UStaticMeshComponent* Mesh;
UPROPERTY(EditAnywhere, Category = "Actor0")
bool objectState;
//AMyMonster * SpawnPointer;
AMyMonster* SpawnPointer;
#pragma endregion
};
+++++++++++++++
// Fill out your copyright notice in the Description page of Project Settings.
#include "Study_0207.h"
#include "SpawnerLocating.h"
// Sets default values
ASpawnerLocating::ASpawnerLocating()
{
// 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;
#pragma region custom Component
// 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;
//create root component
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("Roooot"));
//create staticmesh component
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
Mesh->SetupAttachment(RootComponent);
//set mesh and material to staticmesh
//StaticMesh'/Engine/BasicShapes/Cylinder.Cylinder'
//Material'/Engine/EngineDebugMaterials/BoneWeightMaterial.BoneWeightMaterial'
static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeFinder(TEXT("/Engine/BasicShapes/Cylinder"));
static ConstructorHelpers::FObjectFinder<UMaterial> MateFinder(TEXT("/Engine/EngineDebugMaterials/BoneWeightMaterial"));
if (CubeFinder.Object&&MateFinder.Object)
{
Mesh->SetStaticMesh(CubeFinder.Object);
Mesh->SetMaterial(0, MateFinder.Object);
Mesh->SetRelativeScale3D(FVector(1.f));
}
#pragma endregion
}
// Called when the game starts or when spawned
void ASpawnerLocating::BeginPlay()
{
Super::BeginPlay();
#pragma region SpawnCode
/////////////////////////////////SpawnPointer
if (GetWorld() && objectState == true)
{
FActorSpawnParameters MyMonsterSpawnParam;
//Spawn Monster Naming
FString NewActorName = "021517HowtoLocating object";
MyMonsterSpawnParam.Name = FName(*NewActorName);
//Spawn Monster Locating
FVector SpawnLocation = GetActorLocation() + FVector(1.f, 0.f, 0.f) * 300.f;
SpawnPointer = GetWorld()->SpawnActor<AMyMonster>(SpawnLocation, FRotator(0.f), MyMonsterSpawnParam);
}
/////////////////////////////////////SpawnPointer2
#pragma endregion
}
// Called every frame
void ASpawnerLocating::Tick( float DeltaTime )
{
#pragma region move to Spawn
Super::Tick(DeltaTime);
SpawnPointer->SetActorLocation(SpawnPointer->GetActorLocation() + FVector(1.f, 0, 0));
#pragma endregion
FVector aa;
}
+++++++++++++++++++++++++++++++++++++++
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "GameFramework/Actor.h"
#include "MyMonster.generated.h"
UCLASS()
class STUDY_0207_API AMyMonster : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyMonster();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
#pragma region custom Component
public://component
UPROPERTY(EditAnywhere, Category = "Actor0")
UStaticMeshComponent* Mesh;
#pragma endregion
};
++++++++++++++++++++++++++++++
// Fill out your copyright notice in the Description page of Project Settings.
#include "Study_0207.h"
#include "MyMonster.h"
// Sets default values
AMyMonster::AMyMonster()
{
// 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;
#pragma region custom Component
// 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;
//create root component
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("Roooot"));
//create staticmesh component
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
Mesh->SetupAttachment(RootComponent);
//set mesh and material to staticmesh
//StaticMesh'/Engine/BasicShapes/Cone.Cone'
//Material'/Engine/EngineDebugMaterials/BoneWeightMaterial.BoneWeightMaterial'
static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeFinder(TEXT("/Engine/BasicShapes/Cone"));
static ConstructorHelpers::FObjectFinder<UMaterial> MateFinder(TEXT("/Engine/EngineDebugMaterials/BoneWeightMaterial"));
if (CubeFinder.Object&&MateFinder.Object)
{
Mesh->SetStaticMesh(CubeFinder.Object);
Mesh->SetMaterial(0, MateFinder.Object);
Mesh->SetRelativeScale3D(FVector(1.f));
}
#pragma endregion
}
// Called when the game starts or when spawned
void AMyMonster::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyMonster::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
-------------------------------------------------------------------------------------------------------
Monster 클래스의 경우 단순한 Mesh 와 Material만 붙여 놓았기에 설명하지 않겠습니다.
-------------------------------------------------------------------------------------------------------
SpawnerLocating 클래스를 설명하겠습니다,
헤더 파일부터 살펴봅니다.
상단의 #include "MyMonster.h" 는 MyMonster 클래스 형태의 포인터를 만들기 위해 받아옵니다.
중요한 것은
#include "SpawnerLocating.generated.h"
위에 선언을 해주어야 한다는 것입니다. generated 헤더가 가장 마지막으로 불려져야 언리얼 코드가 꼬이지 않고 실행됩니다.
AMyMonster* SpawnPointer;
몬스터형 포인터를 선언합니다. 이 후 이 포인터에 실재 몬스터를 할당해서 이후 월드에 출현시킵니다
------------------------------------------------------------------------------------------------------
/////////////////////////////////SpawnPointer
if (GetWorld() && objectState == true)
{
FActorSpawnParameters MyMonsterSpawnParam;
//Spawn Monster Naming
FString NewActorName = "021517HowtoLocating object";
MyMonsterSpawnParam.Name = FName(*NewActorName);
//Spawn Monster Locating
FVector SpawnLocation = GetActorLocation() + FVector(1.f, 0.f, 0.f) * 300.f;
SpawnPointer = GetWorld()->SpawnActor<AMyMonster>(SpawnLocation, FRotator(0.f), MyMonsterSpawnParam);
일단은 GetWorld로 월드가 있는지 판단하고. 저 objectState는 제가 단순히 만든 실행 bool 스위치입니다. true일경우 방금 만든 저 위의 코드들이 다 실행됩니다.
FActorSpawnParameters MyMonsterSpawnParam
FActorSpawnParameters 형의 MyMonsterSpawnParam를 선언합니다.
FActorSpawnParameters 는 액터의 파라미터가 담긴 형태입니다. 기본적인 Name 등등이 담겨있습니다.
그래서 FString으로 문자열을 만듭니다. 이 후 이 문자열은 Name으로 사용합니다.
FName형의 생성자에 방금 쓴 문자열을 넣습니다.
FVector는 벡터형을 담는 구조체입니다.
SpawnLocation이라는 벡터형에 Getworld()->SpawnActor<출현시킬 클래스액터>(벡터형 위치, 벡터형 회전,넣을 액터 파라미터)
Getworld()는 world의 메소드들을 담고 있습니다(?)
SpawnActor라는 메소드를 실행시키면 출현시킬 클래스 액터를 지정하고 매개변수로 출현 위치, 각도, 파라미터를 넣습니다.