U
tab 02Nhân vật & Chiến đấu9 bài — chạm để mở
09 / 09 · 24 phút
Nhân vật & Chiến đấu★ bài tập

Bài tập: một trận đánh có thể thua

dự án của bạn tới lúc này

Assets/

Scripts/

SkillShapeRespawner.cs

everything from tab 01–02

đã có sẵnbài này thêm

bài tập3–4 giờ

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ì

CharacterControllerdi chuyểnAnimator + blend treeAnimator và blend treeScriptableObject skillsskill bằng ScriptableObjectCooldown + manahồi chiêu và manaProjectile + poolđạn và poolEquipment → final statstrang bị → chỉ số cuốiEvents → health barsự kiện → thanh máu
sơ đồ động

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.

ba asset phải tạo
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ả
thêm một trường là ba skill hoạt động khác nhau
//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.

Respawner.cs — on each dummy
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ì.

C# script
//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êuVì sao
Thời gian hạ bù nhìn 120 máu4–8 sDướ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 msChậ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 skill0 BPool đạn và số sát thương; kiểm tra trong Profiler.

Muốn làm thêm

thêm 1

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 2

Thêm skill thứ tư để hồi máu — dùng lại SkillData với sát thương âm.

thêm 3

Cho Nova hất bù nhìn ra bằng AddExplosionForce.

thêm 4

Hiện tooltip dựng bằng BuildTooltip khi rê chuột lên icon artifact.