مواجهة الزعيم
جزء من قسم هندسة الألعاب في 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)
{
// تُحتسب الضربات فقط أثناء راحته: اطرح مقدار الضرر، وأطلق حدث 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التعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity