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();
    }
}
相关推荐
LiuYaoheng43 分钟前
【Android】使用 Intent 传递对象的两种序列化方式
android·java·笔记·学习
向宇it1 小时前
【unity实战】简易的车辆控制系统
游戏·unity·c#·游戏引擎
九章数学体系1 小时前
九章数学体系:打破“吃苦悖论”,重构学习真谛
数据结构·学习·算法·数学建模·拓扑学
R-G-B1 小时前
【01】OpenCV C#——C#开发环境OpenCvSharp 环境配置 工程搭建 及代码测试
opencv·c#·opencvsharp·opencvsharp环境搭建·opencvsharp开发环境·opencv c#·opencvsharp代码测试
三千道应用题3 小时前
WPF&C#超市管理系统(4)入库管理
c#·wpf
饮浊酒3 小时前
初始C语言---第四讲(数组)
c语言·学习
智者知已应修善业3 小时前
【c#窗体荔枝计算乘法,两数相乘】2022-10-6
经验分享·笔记·算法·c#·.net
楞伽sr3 小时前
STM32学习记录--Day6
stm32·嵌入式硬件·学习
时光追逐者5 小时前
C#拾遗补漏之 Dictionary 详解
开发语言·c#·.net·.net core
【上下求索】12 小时前
学习笔记090——Ubuntu 中 UFW 防火墙的使用
笔记·学习·ubuntu