본문 바로가기

Unreal/개인플젝

[언리얼] 3번째. 스포너

오늘 한 것! 

시간마다 캐릭터 스폰하는 컨포넌트를 만듦

 

지들끼리 콜리전 안 끔 + 캐릭터 이동 안함 + 애니메이션 안넣음... 환장! 

 

스포너

(기본 스포너) 

일정한 시간당 n마리씩 특정 캐릭터를 스폰시킨다

 

(스폰 인터렉션)

캐릭터가 닿으면 

그 수를 사칙연산한다...

ㄴ 얘는 기존 캐릭터 Destroy하고 새 캐릭터 스폰하는거일텐데??

 

스폰캐릭터..

 

액터컴포넌트로 만들어야겠다.~ 둘 다 붙이게

 

ACharacterSpawnComponent

- float : TimeInternal

- TSubClassOf<ACharacter> : SpawnCharacterClass : 나중에 테이블로 바뀔 여지 있음.

 

- ESpawnType : + - * /  스포너로 늘이고 줄일 캐릭터 연산자 타입 

ㄴ 줄이는것도 있는데 스포너라는 말이 안어울리는 것 같음..

     ㄴ 걔는 디스포너야!!! 다른거야

 

 

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

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "MLCharacterSpawnComponent.generated.h"


class AMLCharacter;

UENUM(BlueprintType)
enum class ESpawnType : uint8
{
	None,
	Plus,
	Multiply,
};

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class CROPOUTSAMPLEPROJECT_API UMLCharacterSpawnComponent : public UActorComponent
{
	GENERATED_BODY()

public:	
	// Sets default values for this component's properties
	UMLCharacterSpawnComponent();

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

public:	
	// Called every frame
	virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

	void SpawnCharacter();

private:
	FTransform GetSpawnTransform();
private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	float SpawnTimeInternal = 1.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	float SpawnMinRadius = 10.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	float SpawnMaxRadius = 50.0f;


	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	TArray<TSubclassOf<AMLCharacter>> SpawnCharacterList;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	ESpawnType SpawnerType = ESpawnType::Plus;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	int32 SpawnCharacterMax = 1;
private:
	float CurrentTime = 0.f;
};

 

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


#include "Character/MLCharacterSpawnComponent.h"
#include "MLCharacterSpawnComponent.h"
#include "MLCharacter.h"

// Sets default values for this component's properties
UMLCharacterSpawnComponent::UMLCharacterSpawnComponent()
{
	// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
	// off to improve performance if you don't need them.
	PrimaryComponentTick.bCanEverTick = true;

	// ...
}


// Called when the game starts
void UMLCharacterSpawnComponent::BeginPlay()
{
	Super::BeginPlay();

	// ...
	
}


// Called every frame
void UMLCharacterSpawnComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
	Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

	CurrentTime += DeltaTime;
	if (CurrentTime > SpawnTimeInternal)
	{
		SpawnCharacter();
		CurrentTime = 0.f;
	}
	// ...
}

void UMLCharacterSpawnComponent::SpawnCharacter()
{
	if (SpawnCharacterList.Num() == 0)
	{
		//ML_LOG(Error, TEXT("SpawnCharacterList is Empty"));
		return;
	}

	const int32 CurrentSpawnCharacterNum = FMath::RandRange(1, SpawnCharacterMax);
	for (int i = 0; i < CurrentSpawnCharacterNum; ++i)
	{
		int32 SpawnCharacterIndex = FMath::RandRange(0, SpawnCharacterList.Num()-1);
		if (SpawnCharacterList[SpawnCharacterIndex] == nullptr)
		{
			continue;
		}
		GetWorld()->SpawnActor<AMLCharacter>(SpawnCharacterList[SpawnCharacterIndex], GetSpawnTransform());
	}
}

FTransform UMLCharacterSpawnComponent::GetSpawnTransform()
{
	FVector BaseVector  = GetOwner()->GetActorLocation();
	FVector RandomUnitVector = FMath::VRand();
	float RandomDistance = FMath::FRandRange(SpawnMinRadius, SpawnMaxRadius);
	FVector  ResultVector = BaseVector + RandomDistance * RandomUnitVector;
	FRotator ResultRotator = GetOwner()->GetActorRotation();
	return FTransform(ResultRotator, ResultVector);
}

 

+ 캐릭터풀도 필요함!!

 

* 캐릭터에 코드로 붙여놨던 카메라 떼어버리고, 

기본 빙의한 폰에만 붙여놨다.

 

+ 스폰 위치 코드로 박아놨었는데 에디터프리뷰 카메라 위치로 시작 폰 스폰되는거같다. 이유 확인하기.! 

 

'Unreal > 개인플젝' 카테고리의 다른 글

업데이트  (0) 2023.11.24
이벤트시스템  (1) 2023.11.24
언리얼버그속상해 - ActorComponent가 BeginPlay 에서 null일때  (2) 2023.09.07
인풋컨포넌트 분리함  (0) 2023.09.04
개인플젝 시작했다  (0) 2023.08.31