Menu
CoddyTech
flag Ar iconالعربيةdown icon

منضدة التصنيع

جزء من قسم هندسة الألعاب في 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