제작 작업대
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 49번째.
생존 게임에서 제작대는 모은 재료를 사용할 수 있는 물건으로 바꿔 줍니다. 버튼 두 개로 나무와 돌을 모으고, 세 가지 조합법으로 재료를 더 유용한 물건으로 만들 수 있습니다. 나무 두 개로 널빤지를 만들고, 널빤지 하나와 돌 두 개로 도끼를 만들며, 널빤지 네 개로 뗏목을 만듭니다. 조합법에 필요한 모든 재료가 인벤토리에 있을 때만 해당 조합법의 버튼을 누를 수 있으며, 제작하면 재료가 소모됩니다. 조합법은 Inspector에서 제작대에 입력하는 데이터이므로 새 조합법을 추가해도 코드를 새로 작성할 필요가 없습니다. 인벤토리는 변경될 때마다 수신 대기 중인 대상에게 알리고, 변경될 때마다 JSON으로 저장되므로 게임을 종료해도 아무것도 잃지 않습니다.
스크립트 두 개를 작성하세요. Backpack에 있는 Inventory와 Bench에 있는 CraftingBench입니다.
챌린지
어려움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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.