Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 파이썬서버
- 카렌
- 레베카
- 으
- Express
- flask
- Jinja2
- 언리얼뮤지컬
- 마인크래프트뮤지컬
- 게임개발
- 정글사관학교
- 스마일게이트
- 미니프로젝트
- 스터디
- 언리얼프로그래머
- VUE
- 프린세스메이커
- Enhanced Input System
- 언리얼
- Bootstrap4
- 알고풀자
- 프메
- EnhancedInput
- 디자드
- JWT
- R
- Unseen
- Ajax
- 데이터베이스
- node
Archives
- Today
- Total
Showing
[Unreal] enum을 이용한 enemy 이름짓기 본문
위 사진과 같이 핑크색 차는 Pink, 트럭은 Truck으로 설정하여 코드와 블루프린트의 통일성과 유지보수를 위한 가독성을 높이고 싶다면 enum을 이용한 이름짓기를 활용해볼 수 있다.
EnemyActor.h
아래와 같이 Enum 처리를 통해 enemy에 DisplayName을 달아준다.
UENUM(BlueprintType)
enum class EEnemyType : uint8
{
E_Yellow UMETA(DisplayName = "Yellow"),
E_Pink UMETA(DisplayName = "Pink"),
E_Red UMETA(DisplayName = "Red"),
E_Truck UMETA(DisplayName = "Truck")
};
EnemyActor.h
public:
UPROPERTY(EditAnywhere)
EEnemyType spawnType;
EnemyFactory.h
기존 enemy 생성은 EnemyFactory에서 spawnIndex으로 처리하고 있었다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "EnemyActor.h"
#include "EnemyFactory.generated.h"
UCLASS()
class GIT_TEMP_API AEnemyFactory : public AActor
{
GENERATED_BODY()
public:
AEnemyFactory();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnyWhere)
float delayTime = 5.0f;
UPROPERTY(EditAnyWhere)
TSubclassOf<class AEnemyActor> enemy;
UPROPERTY(EditAnyWhere)
TArray<TSubclassOf<class AEnemyActor>> cars;
UPROPERTY(EditAnyWhere)
int spawnIndex;
UPROPERTY(EditAnyWhere, Category = ArrayStudy)
TArray<float> coolTimes;
UPROPERTY(EditAnyWhere, Category = ArrayStudy)
bool isOddIndex;
UPROPERTY(EditAnyWhere, Category = ArrayStudy)
TArray<int32> oddNumbers;
UPROPERTY(EditAnyWhere, Category = ArrayStudy)
TArray<int32> evenNumbers;
private:
float currentTime = 0;
};
EnemyFactory.cpp
spawnActor->spawnType = static_cast<EEnemyType>(spawnIndex);
spawnInde를 EEnemyType으로 타입캐스팅하여 spawnActor->spawnType로 설정해준다.
void AEnemyFactory::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (spawnIndex>=0 && spawnIndex<cars.Num()) {
if (currentTime > delayTime) {
currentTime = 0;
AEnemyActor* spawnActor = GetWorld()->SpawnActor<AEnemyActor>(cars[spawnIndex], GetActorLocation(), GetActorRotation());
spawnActor->spawnType = static_cast<EEnemyType>(spawnIndex);
spawnActor->carIndex = spawnIndex;
}
else {
currentTime += DeltaTime;
}
}
else {
//UE_LOG(logtemp, "spawnIndex를 재조정해주세요");
}
}
이제 spawnActor마다 spawnType이 있기 때문에
Bullet들이 Hit 하는 Enemy에 있는 spawn Type에 따라 다른 인터랙션을 발동시키는 것이 가능하다.
enum은 역시나 int로 변환가능하기 때문에 enemy마다 다른 점수를 적용하는 로직으로 사용해보도록 한다.
void ABullet::OnBulletOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OhterBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
//OtherActor가 존재하는데 == 뭔가 어떤 Actor랑 Overlapped 함
AEnemyActor* enemy = Cast<AEnemyActor>(OtherActor);
//OtherActor를 AEnemy 클래스로 취급해서, (형변환)
// enemy 주소에 넣어봄
//만약에 enemy 주소가 비어있지 않다면,
if (enemy != nullptr) {
OtherActor->Destroy();
//OtherActor는 enemy이다.
// bullet -> Kill Enemy -> Add Score
AddScore((int)enemy->spawnType);
}
//무언가랑 오버랩하면 총알 삭제
Destroy();
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), explosionFX, GetActorLocation(),
GetActorRotation());
}
void ABullet::AddScore(int enemyType)
{
int score;
UE_LOG(LogTemp, Warning, TEXT("increasing Score!!!"));
if (enemyType == (int)EEnemyType::E_Yellow ) {
score = 10;
}
else if (enemyType == (int)EEnemyType::E_Pink)
{
score = 100;
}
else if (enemyType == (int)EEnemyType::E_Red)
{
score = 1000;
}
else if (enemyType == (int)EEnemyType::E_Truck)
{
score = 5000;
}
mainGameMode->AddScore(score);
}
enemy 코드 전문
// Fill out your copyright notice in the Description page of Project Settings.
#include "Bullet.h"
#include "EnemyActor.h"
#include "Components/SphereComponent.h"
#include "Components/StaticMeshComponent.h"
#include "Kismet/GameplayStatics.h"
#include "ShootingGameModeBase.h"
// Sets default values
ABullet::ABullet()
{
PrimaryActorTick.bCanEverTick = true;
sphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("Sphere Collider"));
SetRootComponent(sphereComponent);
sphereComponent->SetSphereRadius(6.0f); // 추가
sphereComponent->SetCollisionProfileName("Bullet"); // 추가
meshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("static meshComp"));
meshComp->SetupAttachment(RootComponent);
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereMeshAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere"));//추가
if (SphereMeshAsset.Succeeded())
{
meshComp->SetStaticMesh(SphereMeshAsset.Object);
meshComp->SetRelativeScale3D(FVector(0.1f, 0.1f, 0.1f));
meshComp->SetRelativeLocation(FVector(0.0f, 0.0f, -5.0f));
}
}
void ABullet::AddScore(int enemyType)
{
int score;
UE_LOG(LogTemp, Warning, TEXT("increasing Score!!!"));
if (enemyType == (int)EEnemyType::E_Yellow ) {
score = 10;
}
else if (enemyType == (int)EEnemyType::E_Pink)
{
score = 100;
}
else if (enemyType == (int)EEnemyType::E_Red)
{
score = 1000;
}
else if (enemyType == (int)EEnemyType::E_Truck)
{
score = 5000;
}
mainGameMode->AddScore(score);
}
// Called when the game starts or when spawned
void ABullet::BeginPlay()
{
Super::BeginPlay();
//AddDynamic -> Dynamic 동적, bind
sphereComponent->OnComponentBeginOverlap.AddDynamic(this, &ABullet::OnBulletOverlap);
// UGameplayStatics : UGameplay의 상수들(플레이어 컨트롤러도 포함!)
// 현재 월드의 게임모드를 찾는다(블루 프린트의 Get Game Mode)
mainGameMode = Cast<AShootingGameModeBase>(UGameplayStatics::GetGameMode(GetWorld()));
}
// Called every frame
void ABullet::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 새 위치(P) = 이전(현) 위치(P0) + 속도(velocity= 방향 * 속력) * Time (DeltaTime)
FVector newLocation = GetActorLocation() + GetActorForwardVector() * moveSpeed * DeltaTime;
SetActorLocation(newLocation);
}
void ABullet::OnBulletOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OhterBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
//OtherActor가 존재하는데 == 뭔가 어떤 Actor랑 Overlapped 함
AEnemyActor* enemy = Cast<AEnemyActor>(OtherActor);
//OtherActor를 AEnemy 클래스로 취급해서, (형변환)
// enemy 주소에 넣어봄
//만약에 enemy 주소가 비어있지 않다면,
if (enemy != nullptr) {
OtherActor->Destroy();
//OtherActor는 enemy이다.
// bullet -> Kill Enemy -> Add Score
AddScore((int)enemy->spawnType);
}
//무언가랑 오버랩하면 총알 삭제
Destroy();
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), explosionFX, GetActorLocation(),
GetActorRotation());
}
'Unreal' 카테고리의 다른 글
[Unreal] 언리얼 VFX 에디터 나이아가라(Niagara) (0) | 2023.11.07 |
---|---|
[Unreal] 언리얼 멀티플레이어 세팅(1) (0) | 2023.11.01 |
[Unreal] 이중 포문을 활용한 총알 패턴 적용 (1) | 2023.10.27 |
[Unreal] UI Change Control (0) | 2023.10.27 |
[Unreal] 델리게이트를 활용하여 Bullet으로 enemy 제거 (1) | 2023.10.24 |