언리얼 엔진에서 순수 가상함수 선언
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AttackPattern.h"
#include "EnemyBase.generated.h"
UCLASS(Abstract, NotBlueprintable)
class BASIS_API AEnemyBase : public AActor, public IAttackPattern
{
GENERATED_BODY()
public:
AEnemyBase();
virtual ~AEnemyBase() = default;
virtual void ExecuteAttack() override;
protected:
virtual void Move() = 0;
virtual void Attack() = 0;
virtual void TriggerRandomEvent() = 0;
void PerformAttack();
void StartAttackLoop();
void CalculateDistance(const FVector& PlayerLocation);
FVector CurrentLocation;
float MoveSpeed;
float AttackInterval;
FTimerHandle AttackTimerHandle;
};
언리얼 엔진에서 클래스 설계를 연습할 겸 AI Enemy 클래스를 구현하는 과정에서 순수 가상 함수를 선언하였는데
위과 같은 오류가 발생해 5시간을 소비했다...
우선 문제는 EnemyBase 클래스가 순수 가상 함수를 포함하고 있어 Abstract Class(추상 클래스)로 간주되는데, 어디선가 이 클래스를 인스턴스화 하려 해서 오류가 발생되었다는 것이다.
방금 만든 따끈따끈한 클래스여서 어디 직접적으로 참조한 적도 없는데..혹시나 하는 마음에 에디터 블루프린트 클래스도 다 뒤져보고 GameMode도 살펴보고 다른 클래스 코드까지 다 살펴봤는데 문제점을 발견할 수 없었다.
기존에 다른 코드들과 혹시 문제가 있나 싶어서 새 프로젝트를 만들어서 EnemyBase 클래스를 동일하게 구현하였으나 같은 문제가 발생하였고, 어디선가 참조되고 있는 것이 아니라는 것을 확인했다.
virtual void Move() PURE_VIRTUAL(AEnemyBase::Move, );
virtual void Attack() PURE_VIRTUAL(AEnemyBase::Attack, );
virtual void TriggerRandomEvent() PURE_VIRTUAL(AEnemyBase::TriggerRandomEvent, );
우여곡절 끝에 갓피티가 해결 방안을 제시해줬다. PURE_VIRTUAL 매크로를 사용하는 것..
이전에도 N차례 오류 해결을 할 때도 GPT를 통해 해결 방안을 찾기도 했지만 이미 확인했던 사항들을 계속 되풀이 했었는데, 새로운 프로젝트를 만들어서도 동일한 오류가 발생함을 인지하고서는 PURE_VIRTUAL 매크로라는 정답을 이야기했다..
언리얼에서 UCLASS 매크로가 선언된 클래스는 리플렉션 시스템과 클래스 기본 값 설정을 위해 CDO를 생성하는데, CDO 생성 시에 해당 클래스의 모든 함수가 실행 가능한 상태여야 한다.
하지만 순수 가상 함수가 포함된 클래스는 구현부가 없기 때문에 (cannot instantiate abstract class) 오류가 발생하는 것이다.
PURE_VIRTUAL 매크로는 언리얼에서 CDO 생성 시 빈 구현을 사용하여 오류를 방지해주어, 순수 가상 함수 메서드를 안전하게 정의할 수 있도록 도와주는 매크로이다.
CodeCata
https://dong-grae.tistory.com/100
모의고사 / 완전 탐색
3명의 패턴이 달라서 크기가 다르기 때문에 각 사람마다 인덱스를 어떻게 접근해야할지 고민이 되었다.그래서 3명의 정답 개수를 세는 함수를 만들어서 한 사람마다 이 함수를 호출해 정답의 개
dong-grae.tistory.com
https://dong-grae.tistory.com/101
소수가 되는 경우 카운팅 (재귀호출)
문제를 보는 순간 모든 경우를 다 계산해봐야된다고 생각해서 재귀호출로 해결하고자 했다.근데 초기 작성 코드에서 결과 값이 기댓 값 보다 많이 커서 원하지 않는 중복이 발생했다고 생각했
dong-grae.tistory.com
https://dong-grae.tistory.com/102
덧칠하기
vector 'wall' 를 만들어서 색칠해야 하는 부분은 1로, 색칠하지 않아도 되는 부분은 0으로 만든 후 2중 for문을 통해 몇 번 칠해야하는지를 구하는 방식으로 문제를 풀었다.그런데 루프를 한 번만 사
dong-grae.tistory.com
Greedy 알고리즘
https://dong-grae.tistory.com/103
Greedy 알고리즘
Greedy 알고리즘이란? 현재 단계에서 가장 최선이라고 생각되는 선택을 반복적으로 수행하여 문제를 해결하는 방법이다.국소적으로 최적의 선택을 하면, 그것이 곧 전체적으로도 최적의 해가 된
dong-grae.tistory.com
'내배캠 > TIL' 카테고리의 다른 글
25.01.13 (월) (1) | 2025.01.13 |
---|---|
25.01.09(목) (0) | 2025.01.09 |
25.01.07 (화) (1) | 2025.01.07 |
25.01.06 (월) (1) | 2025.01.06 |
25.01.03 (금) (1) | 2025.01.03 |