Menu
CoddyTech

Üretim Tezgâhı

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 49 / 50.

Bir hayatta kalma oyununda, üretim tezgâhı topladıklarını kullanabileceğin eşyalara dönüştürür. İki düğme odun ve taş toplar, üç tarif de bunları başka eşyalara dönüştürür: iki odun bir tahta eder, bir tahta ve iki taş bir balta eder, dört tahta bir sal eder. Bir tarifin düğmesine yalnızca envanterde tarifin gerektirdiği her şey varsa basılabilir; üretim sırasında bu malzemeler tüketilir. Tarifler, Inspector'da tezgâha girilen verilerdir; bu nedenle yeni bir tarif için yeni kod gerekmez. Envanter, her değişikliği dinleyenlere bildirir ve her değiştiğinde JSON olarak kaydedilir; böylece oyundan çıkmak hiçbir şeyin kaybolmasına yol açmaz.

İki betik yaz: Inventory, Backpack üzerinde; ve CraftingBench, Bench üzerinde.

challenge icon

Görev

Zor

Inventory:

  • Bir [System.Serializable] ItemStack sınıfı; public string item ve public int count alanlarına, ayrıca public List<ItemStack> stacks alanına sahip bir [System.Serializable] InventoryData sınıfı. Envanter bir InventoryData tutar.
  • Her değişiklikten sonra tetiklenen public event Action Changed.
  • public int Count(string item): envanterde bu eşyadan kaç tane bulunduğunu döndürür; hiç yoksa 0 döndürür.
  • public void Add(string item, int amount), eşyanın yığınına ekleme yapar veya listenin sonuna yeni bir yığın ekler. public void Remove(string item, int amount) yığından çıkarır ve sayısı 0'a ulaşan bir yığın listeden çıkarılır.
  • public string Describe() yığınları sırayla Wood 3, Plank 1 biçiminde listeler veya empty döndürür.
  • Her değişiklik, InventoryData'nın JsonUtility.ToJson çıktısı olarak Application.persistentDataPath içindeki inventory.json dosyasına hemen kaydedilir. Dosya varsa Awake bu dosyayı yükler.

CraftingBench; Inspector'ın atadığı inventory, recipes, (her tarif için bir tane ve aynı sırada) recipeButtons, woodButton, stoneButton ve inventoryText alanlarına sahiptir:

  • public string item ve public int amount alanlarına sahip bir [System.Serializable] Ingredient sınıfı ve public string result ile public List<Ingredient> needs alanlarına sahip bir [System.Serializable] Recipe sınıfı. Tezgâhın recipes alanı, sahnede doldurulan bir List<Recipe>'tir.
  • Toplama düğmeleri bir Wood veya bir Stone ekler. Her tarif düğmesi, tarifinin indeksiyle public void Craft(int index) metodunu çağırır.
  • Envanterde tarifin gerektirdiği herhangi bir şey yoksa Craft hiçbir şey yapmaz. Aksi takdirde tüm malzemeleri çıkarır, sonuçtan bir tane ekler ve Crafted Axe biçiminde günlük kaydı oluşturur.
  • Başlangıçta ve envanter her değiştiğinde, her tarif düğmesi yalnızca tarifi üretilebiliyorsa tıklanabilir olur; inventoryText, açıklamayı Inventory kelimesinden sonra Inventory: Wood 3, Plank 1 veya Inventory: empty biçiminde gösterir.

Play'e basın, malzeme toplayıp bir sal üretin, Stop'a ve ardından tekrar Play'e basın, sonra Check'e basın.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler