프로젝트
Inventory / Item 변경 + ItemTable 생성
ItemTable
게임에서 사용할 아이템의 효과를 미리 설정해두는 목적으로 생성
스케일이 큰 게임이라면 따로 파일에 적어 파싱을 하지만 미니 프로젝트인 만큼 솔루션 안에서 정의했다.
//================= cpp ==================
#include "pch.h"
#include "ItemTable.h"
#include "Item.h"
void ItemTable::Init()
{
// 아이템 "붕대" 추가
Item* Bandage = new Item();
Bandage->GetItemInfo().name = "붕대";
Bandage->GetItemInfo().price = 50;
Bandage->GetItemInfo().effectType = ItemEffectType::Heal;
Bandage->GetItemInfo().effectValue = 50;
table["붕대"] = Bandage;
delete Bandage;
// 아이템 "아드레날린" 추가
Item* Adrenaline = new Item();
Adrenaline->GetItemInfo().name = "아드레날린";
Adrenaline->GetItemInfo().price = 150;
Adrenaline->GetItemInfo().effectType = ItemEffectType::AttackUp;
Adrenaline->GetItemInfo().effectValue = 10;
table["아드레날린"] = Adrenaline;
delete Adrenaline;
}
Item* ItemTable::GetItem(string itemName) const
{
for (const auto& pair : table)
{
if (pair.first == itemName)
{
return pair.second;
}
}
return nullptr;
}
//================= header ==================
Item
아이템 생성자에서 받는 파라미터가 많아 가독성이 떨어지는 점도 있고 다른 부분에서 받아 쓰기에도 편하게 아이템 수량을 제외하고 구조체로 묶었다.
#pragma once
using namespace std;
// 아이템 효과 타입
enum class ItemEffectType
{
None,
Heal, // 체력회복
AttackUp // 공격력 증가
};
struct ItemInfo
{
string name = ""; // 아이템 이름
int price = 0; // 아이템 가격
ItemEffectType effectType = ItemEffectType::None; // 아이템 효과 타입
int effectValue = 0; // 효과 수치
};
class Item
{
private:
ItemInfo info;
int itemCount; // 수량
public:
Item(); // 생성자
// Getter
ItemInfo& GetItemInfo();
int GetiItemCount() const;
// Setter
void SetItemInfo(const ItemInfo& InInfo);
void SetsItemCount(const int& ItemCount_);
void AddItemCount(int amount); // 아이템 수량 증가
void ReduceItemCount(int amount); // 아이템 수량 증가
};
Inventory
아이템 테이블을 생성함에 따라 인벤토리에서 아이템을 추가하는 로직을 변경하고 UI에서 띄우기 편하게 보유 아이템 목록을 vector<string> 타입에 저장하고 반환하는 함수 생성
// =================== cpp ====================
#include "pch.h"
#include "Inventory.h"
#include "ItemTable.h"
Inventory::Inventory() : capacity(6)
{
items.reserve(capacity); // 인벤토리 최대용량 초기화
}
Inventory::~Inventory()
{
}
vector<shared_ptr<Item>> Inventory::GetInventory() const
{
return items;
}
vector<string> Inventory::GetItemList()
{
vector<string> nameList;
int i = 0;
for (const auto& data : items)
{
nameList[i] = data->GetItemInfo().name;
i++;
}
return nameList;
}
void Inventory::AddItem(Item* Item_, const int& itemCount_)
{
string itemName_ = Item_->GetItemInfo().name;
// 인벤토리 남은 자리 확인
if (items.size() >= capacity)
{
return;
}
// 동일 아이템 확인
for (const auto& item_ : items)
{
if (item_->GetItemInfo().name == itemName_)
{
// 개수 만큼 추가
item_->AddItemCount(itemCount_);
break;
}
}
// 아이템 추가
items.push_back(shared_ptr<Item>(Item_));
}
void Inventory::RemoveItem(const string& itemName_, const int& itemCount_)
{
for (auto inventorySlot = items.begin(); inventorySlot != items.end(); )
{
auto& item_ = *inventorySlot; // item_ 타입 : shared_ptr<Item>&
if (item_->GetItemInfo().name == itemName_)
{
// 개수 만큼 감소
item_->ReduceItemCount(itemCount_);
if (item_->GetiItemCount() <= 0)
{
inventorySlot = items.erase(inventorySlot);
}
}
}
}
// =================== header ====================
#pragma once
#include <map>
#include "Item.h"
using namespace std;
class Item;
class Inventory
{
private:
vector<shared_ptr<Item>> items; // 인벤토리 저장소
int capacity; // 인벤토리 용량
public:
Inventory(); // 생성자
~Inventory(); // 소멸자
vector<shared_ptr<Item>> GetInventory() const; // Getter
vector<string> GetItemList(); // 아이템 리스트
void AddItem(Item* Item_, const int& itemCount_); // 인벤토리에 아이템 추가
void RemoveItem(const string& itemName_, const int& itemCount_); // 인벤토리에 있는 아이템 삭제
};
오늘의 한줄평
팀내에 잘하시는 분이 계셔서 코드를 짜고 방향성을 잡아 주셔서 코드를 짜는 것에 길을 찾아주셔서 좋고 그것을 경험으로 더 나은 코딩을 할 수 있게되어 좋았다.
'언리얼' 카테고리의 다른 글
| [2025.01.06] Unreal_7기 27 일차 | C++ 3 주차 (0) | 2026.01.06 |
|---|---|
| [2025.01.05] Unreal_7기 26 일차 | C++ 3 주차 (0) | 2026.01.05 |
| [2025.12.31] Unreal_7기 24 일차 | C++ 3 주차 (0) | 2025.12.31 |
| [2025.12.30] Unreal_7기 23 일차 | C++ 3 주차 (0) | 2025.12.30 |
| [2025.12.29] Unreal_7기 22 일차 | C++ 3 주차 (0) | 2025.12.29 |
