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();
    }
}
相关推荐
执笔论英雄5 小时前
【大模型学习cuda】入们第一个例子-向量和
学习
wdfk_prog6 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
懒人咖6 小时前
缺料分析时携带用料清单的二开字段
c#·金蝶云星空
在路上看风景6 小时前
4.5 顶点和片元
unity
bugcome_com7 小时前
深入了解 C# 编程环境及其开发工具
c#
Gary Studio8 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice8 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
lingggggaaaa8 小时前
安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征
学习·安全·web安全·免杀对抗
PP东8 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
学电子她就能回来吗8 小时前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github