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)
    {
        // פגיעות נחשבות רק כשהגולם נח: הפחיתו את 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

תרגלו בעצמכם: Unity אונליין