Menu
CoddyTech

שולחן יצירה

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 49 מתוך 50.

במשחק הישרדות, שולחן יצירה הופך את מה שאוספים לדברים שאפשר להשתמש בהם. שני כפתורים אוספים עץ ואבן, ושלושה מתכונים הופכים אותם לדברים נוספים: שתי יחידות עץ יוצרות קרש, קרש ושתי יחידות אבן יוצרים גרזן, וארבעה קרשים יוצרים רפסודה. אפשר ללחוץ על כפתור של מתכון רק כאשר יש במלאי את כל מה שהמתכון דורש, והיצירה צורכת את הפריטים האלה. הנתונים של המתכונים ממלאים את השולחן ב-Inspector, ולכן הוספת מתכון חדש אינה דורשת קוד חדש. המלאי מודיע על כל שינוי לכל מי שמאזין, והוא נשמר כ-JSON בכל פעם שהוא משתנה, כך שיציאה מהמשחק אינה גורמת לאובדן דבר.

כתבו שני סקריפטים: Inventory, שמוצמד ל-Backpack, ו-CraftingBench, שמוצמד ל-Bench.

challenge icon

אתגר

קשה

Inventory:

  • מחלקה [System.Serializable] בשם ItemStack עם public string item ו-public int count, ומחלקה [System.Serializable] בשם InventoryData עם public List<ItemStack> stacks. המלאי שומר 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.
  • כל שינוי נשמר מיד בקובץ inventory.json שב-Application.persistentDataPath, באמצעות JsonUtility.ToJson של InventoryData. Awake טוענת את הקובץ אם הוא קיים.

CraftingBench, שה-Inspector מספק לו את inventory, recipes, recipeButtons (אחד לכל מתכון, באותו סדר), woodButton, stoneButton ו-inventoryText:

  • מחלקה [System.Serializable] בשם Ingredient עם public string item ו-public int amount, ומחלקה [System.Serializable] בשם Recipe עם public string result ו-public List<Ingredient> needs. 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