קרב הבוס
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 64 מתוך 64.
גולם אבן שומר על השער שמחוץ לזירה. הוא צועד לעברך, וכשאתה מתקרב הוא מרים את אגרופיו לשנייה ומטיח אותם בקרקע, מה שפוגע בך אם עדיין לא התרחקת. אחרי ההטחה הוא נח, ורק אז החרב שלך יכולה לפגוע בו: עור האבן שלו הודף כל פגיעה בזמן שהוא הולך או מתכונן להטחה. הצבע שלו מראה מה הוא עושה: אפור כשהוא הולך, אדום כשהוא מתכונן להטחה, ותכלת כשהוא נח. הורד את בריאותו ל־0 והשער ייפתח. המד בסרגל שבראש המסך מתעדכן אחרי כל פגיעה.
כתוב את המוח של הגולם כמכונת מצבים, עם מחלקה לכל מצב: Boss, ו־ChaseState, WindupState ו־RestState בתוך BossStates.cs. השחקן, מד הבריאות, השער, IState, StateMachine ו־IDamageable מוכנים, ו־Boss כבר יוצר את המצבים שלו ומתקדם בין המצבים במכונה.
אתגר
קשהכתבו את המצבים של הגולם ב־BossStates.cs.
ChaseState:Tint(Color.gray); לכו לעבר השחקן במהירותspeed; כשתהיו בטווחslamRange, התכוננו למתקפה.WindupState:Tint(Color.red); לאחרwindupTime, הציגו ביומןSlam!, פגעו בשחקן שבטווח ב־slamDamage, ונוחו.RestState:Tint(Color.cyan); לאחרrestTime, רדפו.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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין