首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Unity3D 劍擊特效實現:觸發器檢測、物體銷毀、粒子特效與音效聯動完整教程

     編輯:程式設計疑難解答

核心需求

Player 揮劍時,前方敵人/物體 (Cube) 消失,並播放擊中特效 (粒子系統) 和音效。

實現方案概覽

  1. 劍尖掛載 Trigger Collider:作為攻擊判定區域。
  2. 動畫事件觸發攻擊邏輯:在揮劍動畫關鍵幀調用 C# 方法。
  3. Physics.OverlapSphere / OnTriggerEnter 檢測目標。
  4. 實例化特效 Prefab、播放音效、銷毀目標物體。

完整代碼實現

1. 劍腳本 (掛載在劍模型或劍尖空物體上)

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);
    }
}

2. 動畫事件設置 (關鍵步驟)

  1. 打開揮劍動畫導入設置 (Model -> Animations -> 編輯動畫剪輯)。
  2. 在時間軸揮劍伸直的幀位置,右鍵添加 **Event**。
  3. Function 選擇 OnAttackStart (無參數)。
  4. Apply 保存。

3. 目標物體 (Cube) 設置

  • 添加 Rigidbody (可勾選 Is Kinematic 避免物理干擾)。
  • 添加 BoxCollider (非 Trigger)。
  • Layer 設置為 Breakable (或自定義層),並在劍腳本 targetLayer 中勾選。

進階優化建議

  • 對象池:頻繁實例化/銷毀特效會產生 GC,使用對象池複用 hitEffectPrefab。
  • 攻擊判定優化:長武器可使用 Physics.Raycast 多點掃描或 SphereCast 滑動檢測,避免高速穿透。
  • 擊退/擊暈:在 ProcessHit 中給目標 Rigidbody 施加 AddForce 或觸發動畫狀態機。
  • 音效管理器:統一使用 AudioManager 播放 3D 音效,支持音量控制、混音組。

學習資源推薦

  • Unity 官方教程:Unity Learn (免費、權威、中文)。
  • B站 / YouTube 搜索:「Unity 劍擊系統」、「Unity Animation Events」、「Unity Particle System」。
  • 蠻牛網 (manew.com) 國內老牌 Unity 社區,資源豐富。

總結

核心流程:**動畫事件觸發 → 物理檢測 (OverlapSphere/Trigger) → 實例化特效/播放音效 → 銷毀/損傷目標**。掌握動畫事件與物理觸發器的配合,是 Unity 戰鬥系統開發的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved