

결합도 감소
확장성 향상
다형성 극대화
TArray<IItemInterface*> Items와 같은 인터페이스 포인터 배열로 관리하면, 아이템 종류가 무엇이든 같은 함수를 호출하여 다룰 수 있다.// 인터페이스를 UObject 시스템에서 사용하기 위한 기본 매크로
UINTERFACE(MinimalAPI)
class UItemInterface : public UInterface
{
GENERATED_BODY()
};
// 실제 C++ 레벨에서 사용할 함수 원형(시그니처)를 정의
class SPARTAPROJECT_API IItemInterface
{
GENERATED_BODY()
public:
// 플레이어가 이 아이템의 범위에 들어왔을 때 호출
virtual void OnItemOverlap(AActor* OverlapActor) = 0;
// 플레이어가 이 아이템의 범위를 벗어났을 때 호출
virtual void OnItemEndOverlap(AActor* OverlapActor) = 0;
// 아이템이 사용되었을 때 호출
virtual void ActivateItem(AActor* Activator) = 0;
// 이 아이템의 유형(타입)을 반환 (예: "Coin", "Mine" 등)
virtual FName GetItemType() const = 0;
};
아이템 인터페이스 구현 -> 아이템 부모 클래스 구현 -> 코인 부모 클래스 구현 -> 빅,스몰코인 구현
충돌 영역
Overlap이벤트 vs Hit이벤트
랜덤으로 위치값 지정해서 아이템을 스폰해주었다.
레벨마다 각기 다른 확률 데이터를 적용
GameMode와 GameState의 연계 이해하기
GameMode
GameState
레벨 전환 시 GameState, GameMode와 같은 기본 클래스를 비롯해, 맵 내에서 생성된 대부분의 객체가 처음부터 다시 생성된다.
어떤 경우에는 이전 레벨의 상태를 모든 레벨에 걸쳐서 유지하고 싶을때 두가지 방법을 사용 GameInstace, Seamless Travel
Game Instance
Seamless Travel
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int calculateDate(string& date){
int year = stoi(date.substr(0, 4));
int month = stoi(date.substr(5, 2));
int day = stoi(date.substr(8, 2));
int answer = year*12 + month-1;
answer *= 28;
answer += day;
return answer;
}
vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
vector<int> answer;
unordered_map<char, int> monthTerm;
for (string& term : terms){
char t = term[0];
int month = stoi(term.substr(2));
monthTerm[t] = month;
}
int calToday = calculateDate(today);
for (int i = 0; i < privacies.size(); i++){
string date = privacies[i].substr(0, 10);
char termType = privacies[i][11];
int start = calculateDate(date);
int end = start + monthTerm[termType] * 28;
if (end <= calToday){
answer.push_back(i+1);
}
}
return answer;
}