Player 揮劍時,前方敵人/物體 (Cube) 消失,並播放擊中特效 (粒子系統) 和音效。
using UnityEngine;
public class SwordAttack : MonoBehaviour
{
[Header("特效與音效預製體")]
public GameObject hitEffectPrefab; // 粒子特效 Prefab
public AudioClip hitSound; // 擊中音效
public float effectDuration = 1f; // 特效存活時間
[Header("攻擊參數")]
public float attackRadius = 0.5f; // 檢測半徑
public LayerMask targetLayer; // 可攻擊層 (如 Enemy, Breakable)
public int damage = 1; // 傷害值 (可擴展)
private AudioSource audioSource;
private Collider swordCollider; // 劍的 Trigger Collider
void Awake() {
audioSource = GetComponent();
if (!audioSource) audioSource = gameObject.AddComponent();
swordCollider = GetComponent();
if (swordCollider) swordCollider.isTrigger = true; // 確保是 Trigger
}
// 由動畫事件調用:開始攻擊判定
public void OnAttackStart() {
// 方法一:球形檢測 (適合瞬間判定)
Collider[] hits = Physics.OverlapSphere(transform.position, attackRadius, targetLayer);
foreach (var hit in hits) {
ProcessHit(hit.transform);
}
}
// 方法二:持續 Trigger 檢測 (需在 Inspector 勾選 IsTrigger)
private void OnTriggerEnter(Collider other) {
if (((1 << other.gameObject.layer) & targetLayer) != 0) {
ProcessHit(other.transform);
}
}
private void ProcessHit(Transform target) {
// 1. 播放特效
if (hitEffectPrefab) {
GameObject effect = Instantiate(hitEffectPrefab, target.position, Quaternion.identity);
Destroy(effect, effectDuration);
}
// 2. 播放音效
if (hitSound && audioSource) {
audioSource.PlayOneShot(hitSound);
}
// 3. 銷毀目標 (或調用目標的受損接口)
// 簡單演示:直接銷毀
Destroy(target.gameObject);
// 進階:若目標有血量系統
// var health = target.GetComponent();
// if (health) health.TakeDamage(damage);
}
// 編輯器下可視化攻擊範圍
void OnDrawGizmosSelected() {
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, attackRadius);
}
}
OnAttackStart (無參數)。Rigidbody (可勾選 Is Kinematic 避免物理干擾)。BoxCollider (非 Trigger)。Breakable (或自定義層),並在劍腳本 targetLayer 中勾選。hitEffectPrefab。Physics.Raycast 多點掃描或 SphereCast 滑動檢測,避免高速穿透。ProcessHit 中給目標 Rigidbody 施加 AddForce 或觸發動畫狀態機。核心流程:**動畫事件觸發 → 物理檢測 (OverlapSphere/Trigger) → 實例化特效/播放音效 → 銷毀/損傷目標**。掌握動畫事件與物理觸發器的配合,是 Unity 戰鬥系統開發的基石。