프로그래밍 파트 회의결과 최고의 퍼포먼스를 위하여 기존의 블루 프린트 에서 C++로 프로젝트를 변경하려고 한다.
그 첫번째로 Enemy 를 만들고
적이 캐릭터를 추적하는 로직을 만들어 보았다.
우선 C++클래스를 생성하고 .
Enemy.h 라는 헤더파일.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Enemy.generated.h"
UCLASS()
class PROJECTDECIDE_API AEnemy : public ACharacter
{
GENERATED_BODY()
public:
//캐릭터 속성의 기본값을 설정.
AEnemy();
protected:
// 게임이 시작되거나 스폰될 때 호출.
virtual void BeginPlay() override;
public:
// 매 프레임마다 호출됨.
virtual void Tick(float DeltaTime) override;
private:
//플레이어를 추적하는 함수.
void FollowPlayer(float DeltaTime);
//추적 속도
UPROPERTY(EditAnywhere, Category = "Enemy")
float speed = 1.0f;
//플레이어 컨트롤러
APlayerController* PlayerController;
//플레이어를 추적 중인지 여부
bool bIsFollowingPlayer;
};
Enemy.cpp 파일
// Fill out your copyright notice in the Description page of Project Settings.
#include "Enemy.h"
#include "GameFramework/PlayerController.h"
#include "GameFramework/Character.h"
#include "Kismet/GameplayStatics.h"
// 기본값 설정
AEnemy::AEnemy()
{
// 매 프레임마다 Tick()을 호출하도록 이 문자를 설정합니다. 필요하지 않은 경우 이 기능을 꺼서 성능을 향상시킬 수 있음.
PrimaryActorTick.bCanEverTick = true;
}
// 게임이 시작되거나 스폰이 될 때 호출
void AEnemy::BeginPlay()
{
Super::BeginPlay();
//플레이어의 컨트롤러를 찾기(위치값 받아오는 용도)
PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
}
//매 프레임마다 호출
void AEnemy::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FollowPlayer(DeltaTime);
}
//플레어를 추적하는 함수
void AEnemy::FollowPlayer(float DeltaTime)
{
if(PlayerController)
{
//플레이어 캐릭터 가져오기
ACharacter* PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);
//플레이어 캐릭터가 유효한지 확인
if(PlayerCharacter)
{
//플레이어의 위치 가져오기
FVector PlayerLocation = PlayerCharacter -> GetActorLocation();
//플레이어의 위치로 부드럽게 이동
FVector NewLocation = FMath::VInterpTo(GetActorLocation(),PlayerLocation, DeltaTime, speed);
SetActorLocation(NewLocation);
}
}
}
위와 같이 만들면 우선 플레이어를 따라오는 코드는 만들었다. 이제 적을 스폰 하는 스포너를 만들어보자.