تعمل المكوّنات معًا
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 4 من 50.
لا تزال المكوّنات الصغيرة بحاجة إلى بعضها. يحتاج Jetpack إلى Fuel على الكائن نفسه، لذا يعثر على Fuel مرة واحدة في Awake، ويحتفظ به في حقل، ويتواصل معه من خلال طريقتين عامتين صغيرتين:
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}تجعل [RequireComponent(typeof(Fuel))] Unity يضيف Fuel كلما أُضيف Jetpack، سواء في المحرر أو باستخدام AddComponent، وترفض إزالة Fuel ما دام Jetpack موجودًا. يتحقق Unity من ذلك لحظة إضافة Jetpack فقط، لذا فإن Jetpack الذي كان موجودًا على كائن قبل كتابة السمة يحتفظ بإعداده القديم. المكان المناسب لجلبه هو Awake: إذ يُشغَّل مرة واحدة، وتكون جميع مكوّنات الكائن نفسه موجودة عندها.
لا يغيّر Jetpack القيمة amount بنفسه أبدًا. يحدد Fuel معنى الحرق، مثل عدم الانخفاض مطلقًا عن 0، ولا يفعل Jetpack سوى الاستعلام. إذا عرض Fuel لاحقًا مقياسًا أو أعاد التعبئة من العناصر الملتقطة، فلن يحتاج Jetpack إلى التغيير.
التحدي
سهلاندفاع المتزلجة مجاني: يدفعها مفتاح Space إلى الأمام 3 وحدات (+z) كلما ضغطت عليه. اجعليه يستهلك قدرة التحمّل. تتحرك بالأسهم (Mover.cs جاهز)، وملف Stamina.cs يعيد بالفعل ملء current بمقدار regen في الثانية، حتى max (100).
- في Stamina، أضيفي دالة عامة
bool TrySpend(float cost). إذا كانتcurrentأكبر منcostأو تساويه، فإنها تطرحcostمنcurrentوتعيدtrue؛ وإلا، تتركcurrentكما هي وتعيدfalse. - اجعلي Dash يتطلب وجود Stamina على الكائن، بحيث تضيف Unity واحدًا كلما أُضيف Dash. اجلبيه مرة واحدة في Awake وخزّنيه في حقل.
- تكلفة الاندفاع هي
cost(تضبطها نافذة Inspector على 40). لا تنفذ Space اندفاعًا إلا عندما توافق TrySpend، وإلا فسجّليToo tired.
اضغطي Play ونفّذي الاندفاع حتى تتعب، ثم اضغطي Check.
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء