Bài tập: một trận đánh có thể thua
Assets/
Scripts/
everything from tab 01–02
đã có sẵnbài này thêm
Tiếp tục làm trong Arena.unity và cho mọi thứ của tab này chạy cùng lúc: Knight đi và có hoạt ảnh, ba skill có hồi chiêu, ba bù nhìn có thanh máu, hai artifact — và Mage với Archer vẫn còn đó ở phím 2 và 3.
dùng lại những gì
Mọi thứ của tab 02 chạy cùng lúc trong một cảnh.
Làm theo bốn lượt
Lượt 1 — nhân vật chạy được
Knight đã có model, CharacterController và CameraTarget từ bài 01 của tab này. Kiểm tra xem nó còn là prefab trong Assets/Prefabs không.
CharacterController vừa thân người, PlayerMovement có đi / chạy / nhảy và trọng lực.
Animator có blend tree Locomotion điều khiển bằng Speed, kèm Jump và Attack.
CharacterStats trên Knight: maxHealth 200, attack 25, defense 8, moveSpeed 5. Mage và Archer giữ SimpleMover, chưa có chỉ số — tạm thời chúng chỉ để làm cảnh.
Lượt 2 — ba skill khác nhau rõ rệt
Ba asset ScriptableObject, ba nhiệm vụ khác hẳn nhau. Nếu cả ba chỉ gây sát thương trong một quả cầu thì bạn chỉ có một skill mang ba cái tên.
Skill_Slash Q cooldown 1.5 mana 5 damage 30 range 3 cận chiến, hình cầu phía trước
Skill_Bolt E cooldown 4.0 mana 20 damage 55 đạn bay thẳng
Skill_Nova R cooldown 12 mana 45 damage 90 range 6 nổ quanh mình, trúng tất cả//trong SkillData.cs
public enum SkillShape { MeleeArc, Projectile, Nova }
public SkillShape shape = SkillShape.MeleeArc;
// trong SkillCaster.TryCast, thay lệnh ApplyDamage đơn lẻ
switch (s.shape)
{
case SkillShape.MeleeArc:
HitSphere(transform.position + transform.forward * s.range * 0.5f, s.range, s);
break;
case SkillShape.Projectile:
GameObject go = Instantiate(s.projectilePrefab, castPoint.position, castPoint.rotation);
go.GetComponent<Projectile>().Launch(gameObject, s.damage);
break;
case SkillShape.Nova:
HitSphere(transform.position, s.range, s);
break;
}
void HitSphere(Vector3 center, float radius, SkillData s)
{
foreach (Collider hit in Physics.OverlapSphere(center, radius, enemyLayers))
if (hit.TryGetComponent(out CharacterStats target))
target.TakeDamage(s.damage);
}Lượt 3 — bù nhìn phản kháng (một chút)
Ba bù nhìn ở layer Enemy, mỗi con có CharacterStats, thanh máu world-space và HitFlash.
Cho mỗi con maxHealth khác nhau: 80, 120, 200 — để cảm nhận được con số sát thương.
Khi chết, tắt bù nhìn rồi hồi sinh sau 3 giây để bạn còn thử tiếp.
using System.Collections;
using UnityEngine;
public class Respawner : MonoBehaviour
{
[SerializeField] private CharacterStats stats;
[SerializeField] private float delay = 3f;
[SerializeField] private GameObject[] toHide;
void OnEnable() => stats.OnDied += HandleDeath;
void OnDisable() => stats.OnDied -= HandleDeath;
void HandleDeath() => StartCoroutine(Revive());
IEnumerator Revive()
{
foreach (GameObject g in toHide) g.SetActive(false);
yield return new WaitForSeconds(delay);
stats.currentHealth = stats.finalMaxHp;
foreach (GameObject g in toHide) g.SetActive(true);
}
}Lượt 4 — hai artifact thấy rõ tác dụng
Artifact_Ember: +40 Attack cộng thẳng. Artifact_Swift: +25% MoveSpeed và +15% Attack.
Gán phím 7 và 8 để Equip / Unequip, bật tắt ngay trong lúc chơi.
Skill phải đọc finalAttack chứ không phải attack gốc — không thì trang bị vào chẳng đổi gì.
//trong SkillCaster
float outgoing = s.damage * (myStats.finalAttack / 100f + 1f);
target.TakeDamage(outgoing);Khi nào thì xong
- ✓Knight đi, giữ Shift để chạy, nhảy được, hoạt ảnh khớp với việc nó đang làm — và phím 2, 3 vẫn chuyển quyền điều khiển sang Mage với Archer.
- ✓Q, E, R làm ba việc khác nhau rõ ràng, mỗi cái có vòng hồi chiêu riêng trên UI.
- ✓Dùng skill khi thiếu mana hoặc đang hồi thì bị từ chối — và người chơi biết vì sao.
- ✓Mỗi cú trúng đều có số sát thương, chớp trắng, và thanh máu tụt.
- ✓Bù nhìn hết máu thì biến mất và 3 giây sau quay lại đầy máu.
- ✓Trang bị artifact làm finalAttack đổi trong Inspector VÀ số sát thương trên màn hình cũng đổi theo.
- ✓Tháo ra thì mọi con số trở về đúng như cũ — không bị lệch dần.
- ✓Đập đủ mọi phím trong hai phút mà Console vẫn không có lỗi.
Con số cần đạt
| Chỉ số | Mục tiêu | Vì sao |
|---|---|---|
| Thời gian hạ bù nhìn 120 máu | 4–8 s | Dưới 4 giây thì skill vô nghĩa; trên 8 giây thì lê thê. |
| Từ lúc bấm tới lúc thấy phản ứng | < 100 ms | Chậm hơn là người chơi tưởng nút hỏng. |
| Artifact làm sát thương đổi bao nhiêu | ≥ 20% | Phần thưởng mà không thấy được thì không phải phần thưởng. |
| Rác sinh ra mỗi lần dùng skill | 0 B | Pool đạn và số sát thương; kiểm tra trong Profiler. |
Muốn làm thêm
Cho một bù nhìn biết đuổi: bạn tới gần dưới 8 m thì nó đi theo.
Thêm skill thứ tư để hồi máu — dùng lại SkillData với sát thương âm.
Cho Nova hất bù nhìn ra bằng AddExplosionForce.
Hiện tooltip dựng bằng BuildTooltip khi rê chuột lên icon artifact.