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

قتال الزعيم

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 50 من 50.

يحرس غول حجري البوابة المؤدية إلى خارج الحلبة. يدبّ نحوك، وعندما تقترب منه يرفع قبضتيه لثانية ثم يضرب الأرض، ما يؤذيك إذا كنت لا تزال قريبًا. بعد الضربة يستريح، وعندها فقط يمكن لسيفك أن يؤذيه: جلده الحجري يصدّ كل ضربة بينما يمشي أو يستعد للضرب. يوضح لونه ما يفعله: رمادي أثناء المشي، وأحمر أثناء الاستعداد للضرب، وسماوي أثناء الاستراحة. اخفض صحته إلى 0 لتُفتح البوابة. يتتبّع الشريط أعلى الشاشة كل ضربة.

اكتب عقل الغول كآلة حالات، مع صنف لكل حالة: Boss، وChaseState وWindupState وRestState في BossStates.cs. اللاعب وشريط الصحة والبوابة وIState وStateMachine وIDamageable جاهزة.

challenge icon

التحدي

صعب

يُزوِّد المفتّش 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;
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity