Unity类银河战士恶魔城学习总结(P154 Audio Distance Limite音频距离限制)

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

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

本章节给骷髅战士加上了音频,并且限制了产生音效的范围

可爱的骷髅战士

AudioManager.cs

关键字段

  • AudioManager instance

    实现单例模式,确保全局只有一个 AudioManager 实例。

  • [SerializeField] private AudioSource[] sfx

    存储音效的 AudioSource 数组,每个元素对应一个音效。

  • [SerializeField] private AudioSource[] bgm

    存储背景音乐的 AudioSource 数组,每个元素对应一首背景音乐。

  • public bool playBgm

    控制背景音乐是否播放的开关。

  • private int bgmIndex

    当前播放的背景音乐索引。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;

    [SerializeField] private float sfxMinimumDistance;//音效最小距离
    [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,Transform _source)//播放音效
    {
        if(sfx[_sfxIndex].isPlaying)//如果音效正在播放
            return;


        if(_source!=null && Vector2.Distance(PlayerManager.instance.player.transform.position, _source.position) > sfxMinimumDistance)//距离过远不播放
            return;



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

    
}

PlayerAnimationTriggers.cs

攻击触发的音效

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

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

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

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

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

SkeletonIdleState.cs

怪物的音效

cs 复制代码
AudioManager.instance.PlaySFX(24,enemy.transform);
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SkeletonIdleState : SkeletonGroundedState
{

    public SkeletonIdleState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Enemy_Skelteon _enemy) : base(_enemyBase, _stateMachine, _animBoolName, _enemy)
    {
    }

    public override void Enter()
    {
        base.Enter();

        stateTimer = enemy.idleTime;
    }


    public override void Exit()
    {
        base.Exit();

        AudioManager.instance.PlaySFX(24,enemy.transform);
    }

    public override void Update()
    {
        base.Update();

        if (stateTimer < 0)
        {
            stateMachine.ChangeState(enemy.moveState);
        }

    }
}
相关推荐
斯是 陋室8 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
iFulling9 小时前
【计算机网络】第四章:网络层(上)
学习·计算机网络
香蕉可乐荷包蛋9 小时前
AI算法之图像识别与分类
人工智能·学习·算法
xiaoli232710 小时前
课题学习笔记1——文本问答与信息抽取关键技术研究论文阅读(用于无结构化文本问答的文本生成技术)
笔记·学习
人生游戏牛马NPC1号10 小时前
学习 Flutter (四):玩安卓项目实战 - 中
android·学习·flutter
inwith10 小时前
C#语法基础总结(超级全面)(二)
开发语言·c#
快乐觉主吖10 小时前
Unity网络通信的插件分享,及TCP粘包分包问题处理
tcp/ip·unity·游戏引擎
LGGGGGQ11 小时前
嵌入式学习-PyTorch(7)-day23
人工智能·pytorch·学习
stm 学习ing11 小时前
Python暑期学习笔记3
笔记·python·学习
屁股割了还要学11 小时前
【C语言进阶】内存函数
c语言·开发语言·学习·算法·青少年编程