Menu
CoddyTech

제작 작업대

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 49번째.

생존 게임에서 제작대는 모은 재료를 사용할 수 있는 물건으로 바꿔 줍니다. 버튼 두 개로 나무와 돌을 모으고, 세 가지 조합법으로 재료를 더 유용한 물건으로 만들 수 있습니다. 나무 두 개로 널빤지를 만들고, 널빤지 하나와 돌 두 개로 도끼를 만들며, 널빤지 네 개로 뗏목을 만듭니다. 조합법에 필요한 모든 재료가 인벤토리에 있을 때만 해당 조합법의 버튼을 누를 수 있으며, 제작하면 재료가 소모됩니다. 조합법은 Inspector에서 제작대에 입력하는 데이터이므로 새 조합법을 추가해도 코드를 새로 작성할 필요가 없습니다. 인벤토리는 변경될 때마다 수신 대기 중인 대상에게 알리고, 변경될 때마다 JSON으로 저장되므로 게임을 종료해도 아무것도 잃지 않습니다.

스크립트 두 개를 작성하세요. Backpack에 있는 Inventory와 Bench에 있는 CraftingBench입니다.

challenge icon

챌린지

어려움

Inventory:

  • public string item과 public int count를 가진 [System.Serializable] 클래스 ItemStack, 그리고 public List<ItemStack> stacks를 가진 [System.Serializable] 클래스 InventoryData. 인벤토리는 InventoryData 하나를 보관합니다.
  • public event Action Changed: 변경이 있을 때마다 발생합니다.
  • public int Count(string item): 해당 아이템을 몇 개 보유하고 있는지 반환하며, 하나도 없으면 0을 반환합니다.
  • public void Add(string item, int amount)는 아이템 스택에 수량을 더하거나, 목록 끝에 새 스택을 추가합니다. public void Remove(string item, int amount)는 스택에서 수량을 빼며, 수량이 0이 된 스택은 목록에서 제거됩니다.
  • public string Describe()는 스택을 순서대로 Wood 3, Plank 1 형식으로 나열하거나 empty를 반환합니다.
  • 변경 사항은 모두 Application.persistentDataPath의 inventory.json에 InventoryData의 JsonUtility.ToJson 결과로 즉시 저장됩니다. Awake는 해당 파일이 있으면 불러옵니다.

Inspector에서 inventory, recipes, recipeButtons(레시피마다 하나씩, 같은 순서로), woodButton, stoneButton, inventoryText를 할당하는 CraftingBench:

  • public string item과 public int amount를 가진 [System.Serializable] 클래스 Ingredient, 그리고 public string result와 public List<Ingredient> needs를 가진 [System.Serializable] 클래스 Recipe. 벤치의 recipes는 씬에서 채우는 List<Recipe>입니다.
  • 채집 버튼은 Wood 또는 Stone을 하나씩 추가합니다. 각 레시피 버튼은 해당 레시피의 인덱스를 사용해 public void Craft(int index)를 호출합니다.
  • 인벤토리에 레시피에 필요한 재료가 하나라도 부족하면 Craft는 아무 작업도 하지 않습니다. 그렇지 않으면 모든 재료를 제거하고 결과 아이템 하나를 추가한 다음, Crafted Axe와 같이 로그를 출력합니다.
  • 시작할 때와 인벤토리가 변경될 때마다, 레시피를 제작할 수 있는 경우에만 해당 레시피 버튼을 클릭할 수 있습니다. 또한 inventoryText에는 Inventory라는 단어 뒤에 설명이 표시되며, Inventory: Wood 3, Plank 1 또는 Inventory: empty와 같은 형식입니다.

Play를 눌러 뗏목을 채집하고 제작한 다음, Stop을 누르고 다시 Play를 누른 후 Check를 누르세요.

직접 해보기

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class CraftingBench : MonoBehaviour
{
    [SerializeField] private Inventory inventory;
    [SerializeField] private Button[] recipeButtons;
    [SerializeField] private Button woodButton;
    [SerializeField] private Button stoneButton;
    [SerializeField] private TMP_Text inventoryText;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨