שולחן יצירה
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 49 מתוך 50.
במשחק הישרדות, שולחן יצירה הופך את מה שאוספים לדברים שאפשר להשתמש בהם. שני כפתורים אוספים עץ ואבן, ושלושה מתכונים הופכים אותם לדברים נוספים: שתי יחידות עץ יוצרות קרש, קרש ושתי יחידות אבן יוצרים גרזן, וארבעה קרשים יוצרים רפסודה. אפשר ללחוץ על כפתור של מתכון רק כאשר יש במלאי את כל מה שהמתכון דורש, והיצירה צורכת את הפריטים האלה. הנתונים של המתכונים ממלאים את השולחן ב-Inspector, ולכן הוספת מתכון חדש אינה דורשת קוד חדש. המלאי מודיע על כל שינוי לכל מי שמאזין, והוא נשמר כ-JSON בכל פעם שהוא משתנה, כך שיציאה מהמשחק אינה גורמת לאובדן דבר.
כתבו שני סקריפטים: Inventory, שמוצמד ל-Backpack, ו-CraftingBench, שמוצמד ל-Bench.
אתגר
קשה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;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי