오늘 한 것!
시간마다 캐릭터 스폰하는 컨포넌트를 만듦
지들끼리 콜리전 안 끔 + 캐릭터 이동 안함 + 애니메이션 안넣음... 환장!
스포너
(기본 스포너)
일정한 시간당 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 |