Menu
CoddyTech

קרב בוס

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 50 מתוך 50.

גולם אבן שומר על השער המוביל אל מחוץ לזירה. הוא צועד לעברך, וכשאתה מתקרב הוא מרים את אגרופיו לשנייה וחובט בקרקע, מה שפוגע בך אם אתה עדיין בקרבתו. אחרי חבטה הוא נח, ורק אז החרב שלך יכולה לפגוע בו: עור האבן שלו הודף כל פגיעה בזמן שהוא הולך או מתכונן לחבוט. הצבע שלו מציין מה הוא עושה: אפור כשהוא הולך, אדום כשהוא מתכונן לחבוט, וציאן כשהוא נח. הורד את בריאותו ל־0 והשער ייפתח. המד בראש המסך מתעדכן אחרי כל פגיעה.

כתוב את המוח של הגולם כמכונת מצבים, עם מחלקה לכל מצב: Boss, וכן ChaseState, WindupState ו־RestState בקובץ BossStates.cs. השחקן, מד הבריאות, השער, IState, StateMachine ו־IDamageable כבר מוכנים.

challenge icon

אתגר

קשה

החלון Inspector נותן ל־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