Menu
CoddyTech

مواجهة الزعيم

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

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

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

challenge icon

التحدي

صعب

اكتب حالات الغول في BossStates.cs.

  1. ChaseState: Tint(Color.gray)؛ تحرّك نحو اللاعب بسرعة speed؛ وعندما تكون المسافة ضمن slamRange، ابدأ الاستعداد للضربة.
  2. WindupState: Tint(Color.red)؛ بعد windupTime، سجّل Slam!، وألحق الضرر بلاعب يقع ضمن المدى بمقدار slamDamage، ثم استرح.
  3. RestState: Tint(Color.cyan)؛ بعد restTime، طارِد اللاعب.
  4. لا يُحتسب Boss.TakeDamage إلا في حالة rest: اطرح المقدار، وأطلق HealthChanged، واستدعِ Fall() عند الوصول إلى 0.

اضغط «العب» وهاجم أثناء استراحته. ثم اضغط «تحقق».

جرّب بنفسك

using System;
using UnityEngine;
using UnityEngine.Events;

public class Boss : MonoBehaviour, IDamageable
{
    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 StateMachine machine;
    public IState chase;
    public IState windup;
    public IState rest;

    private int health;

    void Awake()
    {
        health = maxHealth;
        machine = new StateMachine();
        chase = new ChaseState(this);
        windup = new WindupState(this);
        rest = new RestState(this);
    }

    void Start()
    {
        HealthChanged?.Invoke(health, maxHealth);
        machine.ChangeState(chase);
    }

    void Update()
    {
        machine.Tick();
    }

    public void TakeDamage(int amount)
    {
        // تُحتسب الضربات فقط أثناء راحته: اطرح مقدار الضرر، وأطلق حدث HealthChanged، واستدعِ Fall() عند وصول الصحة إلى 0
    }

    // جاهز: يسقط الغول، وتُفتح البوابة، ويغادر الغول الساحة.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // مدى بُعد اللاعب على امتداد الأرض.
    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

تدرّب بنفسك: Playground لـ Unity