قتال الزعيم
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 50 من 50.
يحرس غول حجري البوابة المؤدية إلى خارج الحلبة. يدبّ نحوك، وعندما تقترب منه يرفع قبضتيه لثانية ثم يضرب الأرض، ما يؤذيك إذا كنت لا تزال قريبًا. بعد الضربة يستريح، وعندها فقط يمكن لسيفك أن يؤذيه: جلده الحجري يصدّ كل ضربة بينما يمشي أو يستعد للضرب. يوضح لونه ما يفعله: رمادي أثناء المشي، وأحمر أثناء الاستعداد للضرب، وسماوي أثناء الاستراحة. اخفض صحته إلى 0 لتُفتح البوابة. يتتبّع الشريط أعلى الشاشة كل ضربة.
اكتب عقل الغول كآلة حالات، مع صنف لكل حالة: Boss، وChaseState وWindupState وRestState في BossStates.cs. اللاعب وشريط الصحة والبوابة وIState وStateMachine وIDamageable جاهزة.
التحدي
صعبيُزوِّد المفتّش Boss بـ player وspeed (2) وslamRange (2.5) وwindupTime (1) وrestTime (2) وslamDamage (2) وmaxHealth (6)، ويربط UnityEvent الخاص بـ onDefeated بالدالة Open الخاصة بالبوابة. الدالتان PlayerDistance() وTint(color) جاهزتان.
- يطبّق
BossالواجهةIDamageable. فيAwake، يضبط صحته علىmaxHealthوينشئStateMachineوحالاته الثلاث، ويحفظها في الحقول العامةmachineوchaseوwindupوrest(تتلقى كل حالة الزعيم في مُنشئها). فيStart، يطلقHealthChangedمع صحته وmaxHealthويبدأ بحالةchase؛ وفي كل إطار، يستدعي تحديث الآلة. ChaseState: يلوّن الغول بـColor.grayويجعله يمشي نحو اللاعب على الأرض بسرعةspeed. عندما يصبح اللاعب ضمنslamRange، ينتقل إلى حالة الاستعداد.WindupState: يلوّنه بـColor.redويجعله ثابتًا لمدةwindupTimeثانية. ثم يسجلSlam!، ويلحق باللاعب ضررًا بمقدارslamDamageعبرIDamageableالخاص به إذا ظل اللاعب ضمنslamRange، ثم ينتقل إلى حالة الراحة.RestState: يلوّنه بـColor.cyanوينتظرrestTimeثانية، ثم يعود إلى حالة المطاردة. تستمر كل فترة استعداد وكل فترة راحة طوال مدتها كاملة.- لا تُحتسب
TakeDamageإلا عندما يكون الغول في حالة الراحة ولا يزال واقفًا: تُنقص صحته بمقدار الضرر وتطلقHealthChanged. عند وصول صحته إلى 0، يسجلThe golem falls، ويستدعيonDefeatedويعطّل نفسه.
اضغط Play، وتفادَ الضربات ثم اضربه أثناء راحته، وبعدها اضغط Check.
جرّب بنفسك
using System;
using UnityEngine;
using UnityEngine.Events;
public class Boss : MonoBehaviour
{
public Transform player;
public float speed = 2f;
public float slamRange = 2.5f;
public float windupTime = 1f;
public float restTime = 2f;
public int slamDamage = 2;
public int maxHealth = 6;
public event Action<int, int> HealthChanged;
public UnityEvent onDefeated;
// مدى بُعد اللاعب على امتداد الأرض.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// رمادي أثناء سيره، وأحمر أثناء استعداده للهجوم، وسماوي أثناء استراحته.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء