Unity类银河战士恶魔城学习总结(P153 Audio Manager音频)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节添加了循环播放的BGM,并且给武器攻击加上了音效

音频管理器

AudioManager.cs

1. 类的功能

  • 核心目标 :管理游戏中的音频播放,包括:
    • 播放和停止 音效(SFX)
    • 播放、停止或随机播放 背景音乐(BGM)
  • 单例模式 :确保在场景中只有一个 AudioManager 实例。

2. 核心逻辑

Awake()
  • 确保单例模式:
    • 如果已有一个 AudioManager 实例,则销毁新创建的实例,避免重复。
    • 如果没有实例,则将当前实例设为唯一实例。
Update()
  • 每帧检查 playBgm
    • 如果 playBgmfalse,停止所有背景音乐。
    • 如果 playBgmtrue 且当前音乐未播放,则播放指定的背景音乐。
PlaySFX(int _sfxIndex)
  • 播放指定索引的音效:
    • 随机调整音调(pitch),让音效有更多变化感(范围:0.851.15)。
    • 播放指定音效。
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;

    [SerializeField] private AudioSource[] sfx;//音效
    [SerializeField] private AudioSource[] bgm;//背景音乐


    public bool playBgm;
    private int bgmIndex;


    private void Awake()
    {
        if(instance != null)
            Destroy(instance.gameObject);
        else
            instance = this;
    }


    private void Update()
    {
        if (!playBgm)
            StopAllBGM();
        else
        {
            if(!bgm[bgmIndex].isPlaying)//如果背景音乐没有播放
                PlayBGM(bgmIndex);
        }
    }


    public void PlaySFX(int _sfxIndex)//播放音效
    {
        if (_sfxIndex < sfx.Length)
        {
            sfx[_sfxIndex].pitch = Random.Range(.85f, 1.15f);//设置音效的音调
            sfx[_sfxIndex].Play();
        }
    }

    public void StopSFX(int _index) => sfx[_index].Stop();//停止音效


    public void PlayRandomBGM()//播放随机背景音乐
    {
        bgmIndex = Random.Range(0, bgm.Length);
        PlayBGM(bgmIndex);
    }



    public void PlayBGM(int _bgmIndex)//播放背景音乐
    {
        bgmIndex = _bgmIndex;

        StopAllBGM();
        bgm[bgmIndex].Play();
    }


    public void StopAllBGM()
    {
        for (int i = 0; i < bgm.Length; i++)
        {
            bgm[i].Stop();
        }
    }

    
}

为了防止听相同的音效听腻,所以加上了随机音调的效果

cs 复制代码
sfx[_sfxIndex].pitch = Random.Range(.85f, 1.15f);//设置音效的音调

PlayerAnimationTriggers.cs

添加了攻击触发的音效

cs 复制代码
AudioManager.instance.PlaySFX(2);//播放音效
cs 复制代码
using UnityEngine;

public class PlayerAnimationTriggers : MonoBehaviour
{
    private Player player => GetComponentInParent<Player>();

    private void AnimationTrigger()
    {
        player.AnimationTrigger();
    }

    private void AttackTrigger()//攻击触发函数
    {
        AudioManager.instance.PlaySFX(2);//播放音效

        Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//检测区域内的敌人

        foreach (var hit in colliders)//遍历检测到的对象
        {
            if (hit.GetComponent<Enemy>() != null)
            {
                EnemyStats _target = hit.GetComponent<EnemyStats>();//判断是否是敌人

                if (_target != null) //对敌人造成伤害
                    player.stats.DoDamage(_target);


                ItemData_Equipment weaponData = Inventory.instance.GetEquipment(EquipmentType.Weapon);

                if (weaponData != null)//应用武器特殊效果
                    weaponData.Effect(_target.transform);

            }
        }
    }


    private void ThrowSword()
    {
        SkillManager.instance.sword.CreateSword();
    }
}
相关推荐
虾球xz7 分钟前
游戏引擎学习第247天:简化DEBUG_VALUE
c++·学习·游戏引擎
爱编程的鱼1 小时前
C# 类(Class)教程
开发语言·c#
superior tigre1 小时前
C++学习:六个月从基础到就业——模板编程:模板特化
开发语言·c++·学习
·醉挽清风·1 小时前
学习笔记—双指针算法—移动零
c++·笔记·学习·算法
艾醒(AiXing-w)1 小时前
探索大语言模型(LLM):自监督学习——从数据内在规律中解锁AI的“自学”密码
人工智能·学习·语言模型
小赖同学啊3 小时前
Unity 和 Unreal Engine(UE) 两大主流游戏引擎的核心使用方法
unity·游戏引擎·虚幻
搏博3 小时前
机器学习之三:归纳学习
人工智能·深度学习·学习·机器学习
工藤新一¹3 小时前
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 14)
开发语言·c++·游戏引擎·游戏开发·sdl·实践项目
钢铁男儿4 小时前
C#核心技术解析:静态类型、dynamic与可空类型
开发语言·c#
AgilityBaby4 小时前
unity Animation学习,精准控制模型动画播放
学习·3d·unity·游戏引擎