Trận đấu với trùm
Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 64 trên 64.
Một người đá khổng lồ canh giữ cánh cổng dẫn ra khỏi đấu trường. Nó giậm chân tiến về phía bạn, khi bạn đến gần, nó giơ nắm đấm lên trong chốc lát rồi đập xuống đất, khiến bạn bị thương nếu vẫn còn ở gần. Sau cú đập, nó nghỉ ngơi, và chỉ lúc đó kiếm của bạn mới có thể làm nó bị thương: lớp da đá của nó chịu được mọi đòn đánh khi nó đang đi hoặc lấy đà. Màu sắc cho biết nó đang làm gì: màu xám khi đi, màu đỏ khi lấy đà, màu lục lam khi nghỉ ngơi. Hạ máu của nó xuống 0 để mở cổng. Thanh ở đầu màn hình cập nhật sau mỗi đòn đánh.
Viết bộ não của người đá khổng lồ dưới dạng máy trạng thái với một lớp cho mỗi trạng thái: Boss, và ChaseState, WindupState cùng RestState trong BossStates.cs. Người chơi, thanh máu, cánh cổng, IState, StateMachine và IDamageable đã sẵn sàng, còn Boss đã tạo các trạng thái và cập nhật máy trạng thái.
Thử thách
KhóViết các trạng thái của golem trong BossStates.cs.
ChaseState:Tint(Color.gray); tiến về phía người chơi với tốc độspeed; khi ở trong phạm vislamRange, bắt đầu lấy đà.WindupState:Tint(Color.red); sauwindupTime, ghi nhật kýSlam!, gây sát thươngslamDamagecho người chơi trong phạm vi, rồi nghỉ.RestState:Tint(Color.cyan); saurestTime, đuổi theo.Boss.TakeDamagechỉ tính sát thương khi ở trạng tháirest: trừ đi lượng sát thương, phát sự kiệnHealthChanged, gọiFall()khi máu còn 0.
Nhấn Chơi rồi tấn công khi nó đang nghỉ. Sau đó nhấn Kiểm tra.
Tự làm thử
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)
{
// Chỉ tính đòn đánh khi nó nghỉ: trừ máu theo amount, kích hoạt HealthChanged, gọi Fall() khi máu về 0
}
// Đã sẵn sàng: golem ngã xuống, cổng mở ra và golem rời đấu trường.
void Fall()
{
Debug.Log("The golem falls");
onDefeated.Invoke();
gameObject.SetActive(false);
}
// Khoảng cách đến người chơi tính trên mặt đất.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// Màu xám khi nó di chuyển, đỏ khi chuẩn bị tung đòn, xanh lơ khi nghỉ.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến trúc trò chơi trong Unity
1Thành phần, không phải hệ thống phân cấp
Thành phần nhỏTập lệnh kẻ địch cơ sởThành phần trừu tượngCác thành phần phối hợp với nhauÔn tập: tháp pháo mô-đunÔn tập: pháo nòng đôi4Dữ liệu tuần tự hóa
Lớp có thể tuần tự hóaDanh sách trong InspectorKiểu liệt kê trong InspectorÔn tập: Bảng vật phẩm rơiÔn tập: Quay vật phẩm2Giao diện trong Unity
IDamageableGiao diện và TryGetComponentGetComponentsÔn tập: phím tương tácÔn tập: đối tượng gần nhất trong tầm với5ScriptableObjects
Tài sản dữ liệuChỉ số vũ khíCài đặt dùng chungLưu gióSóng dưới dạng dữ liệuÔn tập: Cơ sở dữ liệu vật phẩmÔn tập: Mua hàng từ cửa hàng8Code có thể tái sử dụng
Phương thức mở rộngSingleton tổng quátCác hàm hỗ trợ tổng quátÔn tập: FindNearest3Sự kiện
Sự kiện C# trong UnityĐăng ký trong OnEnableCác trường UnityEventSự kiện điều khiển UIÔn tập: Cửa sổ bật lên thành tíchÔn tập: Bộ hẹn giờ cửa sổ bật lên6Lưu dữ liệu bằng JSON
JsonUtilityLưu trò chơiTải dữ liệu và giá trị mặc địnhÔn tập: các ô lưuChọn và xóa một ô lưu9Tái sử dụng đối tượng bằng pool
Vì sao cần pool đối tượngPool dùng hàng đợiObjectPool của UnityÔn tập: pool đạnTự luyện tập: Playground Unity