“声音”音源设置和音效播放

学习如何使用音效系统,背景音乐和其他特别的音效,跳跃攻击等等

学习如何在unity当中使用整套的音效系统,使用之前,我们先来确定一下我们要使用的音乐和音效,在Unity Asset Store当中搜索,添加到我们的unity当中

在unity中下载导入资源

音效全部导入

背景音乐只导入第一个

在Project中创建一个新的文件夹,起名为Audio;将导入的音频添加到这个文件夹下方

这些音乐和音效我们都可以点击,然后在屏幕右侧,点击屏幕右下角的双横线,然后就可以播放了

接下来我们来实现这些音频的资源

添加一个新物体,在Hierarchy窗口Create Empty,命名为Audio Manager;放入manager的分类下边

在Add Component--Audio(这个分类里面有非常多的内容;Audio Listener,可以听到所有的内容,但是需要一个媒体来播放音乐,就是Audio Source一个音频资源,在资源当中可以播放不同的声音片段,例如攻击跳跃等等)

我们首先先看一下我们的Main Camera 中,默认有Audio Listener组件,代表我们的摄像机就是耳朵,走到哪听到哪

接下来我们到场景当中去放置音源,然后用这些音源来播放不同的声音片段,就能够实现音效的效果了

在我们这个2D项目当中,我们直接在Audio Manager身上挂载音源,来持续不断地播放就好了

摄像机上有Audio Listener原因就是有时候可以使用一些3D的音效,只有走进的时候,才会播放,这样的话,我们就会挂载特殊的物体身上,比如野猪来回巡逻的时候,可能会发出喘息声和走路的声音,在他身上会有一个移动的音效,他也有一定的范围,只有我们的摄像机进入这个范围之后,才能够监听这个音效,

接下来我们来简单设置一下,学习如何来使用这些组件

首先在Audio Manager上面添加Audio Sorce

里面有非常多的内容(Audio Clip音频片段,Play On Awake运行游戏时自动播放,Loop循环)

下面还要有关于3D的音效暂时不用;BGM背景音乐要循环播放,且在游戏一开始就播放;可以添加音乐片段到Audio Clip中,运行测试一下效果

我们其他的音效,攻击跳跃等等,不会持续不断的播放,也不会在游戏一开始就播放,所以我们再添加另外一个Audio Source,这个取消勾选Play On Awake和Loop,用这个来播放其他的音效

然后,我们要用代码来控制什么时候把哪个片段放到对应的Audio Source里面去播放来实现我们想要的效果

在Script文件夹下再创建一个文件夹Audio,在此文件夹内创建一个代码AudioManager(音频管理脚本)

创建好了之后,将代码挂载到我们的Audio Manager身上

我们要在不同的AudioSource里面播放不同的片段,首先要获得这两个不同的AudioSource

打开代码进行编写

想要使用音频相关的内容,要调用这个命名空间UnityEngine.Audio(此命名空间为了使用AudioMixer),这样我们就可以使用所有的Audio的组件了

然后我们继续创建变量,首先是AudioSource,一个BGMSource,一个FXSource

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;

public class AudioManager : MonoBehaviour
{
    public AudioSource BGMSource;
    public AudioSource FXSource;
}

保存返回unity

对这两个变量进行赋值

首先将标记Loop的AudioSource拖拽进去;不被标记的拖拽到FXSource

实现游戏音乐和音效的播放方式有非常多的方法,根据不同的项目有不同的实现功能

我们先以攻击为例子,找到Player--Attack1,2,3;每次启动的时候,我们都要播放一下这个音效,所以我们可以把要播放的音效直接挂载这三个身上,然后用他们去通知我们的AudioManager接下来要播放这个音效了(跨代码,跨物体的播放和传递数据,创建Event事件的方法,通过这个事件,同时带着我们的这个变量参数传递进去)

还是要用ScriptableObject的方法,在ScriptableObject文件夹下创建代码PlayAudioEventSO(传递音频文件的事件)

打开代码

先调用UnityEngine.Event

代码中要实现的是ScriptableObject

在上方使用CreateAssetMenu

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;


[CreateAssetMenu(menuName ="Event/PlayAudioEventSO")]
public class PlayAudioEventSO : ScriptableObject
{
   
}

接下来创建我们的unity Action,传递进来的变量类型就是每一个Audio Clip

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;


[CreateAssetMenu(menuName ="Event/PlayAudioEventSO")]
public class PlayAudioEventSO : ScriptableObject
{
    public UnityAction<AudioClip> OnEventRaised;

    public void RaiseEvent(AudioClip audioClip)
    {
        OnEventRaised?.Invoke(audioClip);
    }
}

这样我们就写好了这个事件方法

保存返回unity

在事件文件夹当中,我们来创建Event;先创建一个叫做FX Audio Event SO,在创建一个BGM Audio Event SO

可以看到我们用同一个类型的ScriptableEvent “PlayAudioEventSO”,可以创建多个资源文件,那么分别来播放不同的音效和背景音乐

我们先以Attack为例子,我们要在它身上标记Clip,而且我要通过时间的方式进行广播,所以我们要创建一个单独的代码,来标记我所使用的音乐,起名为AudioDefination(音频自定义脚本)在Audio文件夹下创建

然后将这个代码挂载在Attack1,2,3这三个物体上

打开代码,进行编写

首先我们要通过一个事件的方式,进行广播来传递,我们先来创建一下这个事件playAudioEvent,然后我们还要有音频的片段,还希望有一个布尔值的判断,判断这个内容是不是一开始就播放(FX不会在一开始就执行,所以要用在OnEnable当中去执行这个方法)

勾选Play OnEnable,那么就在OnEnable当中去播放这个音乐

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioDefination : MonoBehaviour
{
    public PlayAudioEventSO PlayAudioEvent;
    public AudioClip audioClip;
    public bool playOnEnable;

    private void OnEnable()
    {
        
    }


}

具体的音乐如何播放,我们创建一个单独的函数方法PlayAudioClip,如何我们让我们的PlayAudioEvent OnEventRaised把我们的AudioClip传递进去,这样我们就成功的传递了这个片段

如果我们要在这个物体启动的时候播放的话,我们来判断一下,如果Play OnEnable就PlayAudioClip

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioDefination : MonoBehaviour
{
    public PlayAudioEventSO PlayAudioEvent;
    public AudioClip audioClip;
    public bool playOnEnable;

    private void OnEnable()
    {
        if (playOnEnable)
            PlayAudioClip();
    }

    public void PlayAudioClip()
    {
        PlayAudioEvent.RaiseEvent(audioClip);
    }
}

保存返回unity

首先这三个物体所要使用的这个PlayAudioEvent就是FX的Events,我们希望通过这个事件的通道将音效传递过去

Attack1,选择音效46;Attack2,3选择47

这三个都要勾选上Play OnEnable,这个物体一激活,inspector窗口显示出来,就要播放我们的音效,

广播有了,接下来回到AudioManager代码当中添加对应的监听,

创建两个同样类型的监听

监听的时候我们就要加入这个事件,把函数注册到这个事件的启动当中,OnDisable注销这个函数方法

用编译器帮助生成OnFXEvent,将clip传递进来,当前clip为这个clip,然后让器进行播放play单次播放

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;

public class AudioManager : MonoBehaviour
{
    [Header("事件监听")]
    public PlayAudioEventSO FXEvent;
    public PlayAudioEventSO BGMEvent;

    public AudioSource BGMSource;
    public AudioSource FXSource;

    private void OnEnable()
    {
        FXEvent.OnEventRaised += OnFXEvent;
    }

    private void OnDisable()
    {
        FXEvent.OnEventRaised -= OnFXEvent;
    }
    private void OnFXEvent(AudioClip clip)
    {
        FXSource.clip = clip;
        FXSource.Play();
    }
}

保存返回unity,

把AudioManager上的事件监听添加进去

运行测试,注意观察FX AudioSource会自动获得Clip

回到代码,再写一个函数的方法,添加BGM

我们希望每一个场景当中都有一个空物体告诉我们的AudioManager当前要播放的音乐是啥;我们继续创建这个方法,把它加到我们的这个事件当中

这个新创建的函数方法和我们刚才实现的是一样的,只不过变成了BGM

现在我们就成功写好了我们的AudioManager,有了事件的监听,给变量也简单做一个分类

public class AudioManager : MonoBehaviour
{
    [Header("事件监听")]
    public PlayAudioEventSO FXEvent;
    public PlayAudioEventSO BGMEvent;
    [Header("组件")]
    public AudioSource BGMSource;
    public AudioSource FXSource;

    private void OnEnable()
    {
        FXEvent.OnEventRaised += OnFXEvent;
        BGMEvent.OnEventRaised += OnBGMEvent;
    }

   
    private void OnDisable()
    {
        FXEvent.OnEventRaised -= OnFXEvent;
        BGMEvent.OnEventRaised -= OnBGMEvent;
    }
     private void OnBGMEvent(AudioClip clip)
     {
        BGMSource.clip = clip;
        BGMSource.Play();
     }


    private void OnFXEvent(AudioClip clip)
    {
        FXSource.clip = clip;
        FXSource.Play();
    }
}


    private void OnFXEvent(AudioClip clip)
    {
        FXSource.clip = clip;
        FXSource.Play();
    }
}

保存返回unity

BGM我们要怎样做呢(目前我们只有一个场景,后续还需要创建下一个场景)

在这个场景当中,我们场景一个新的GameObject-Create Empty,命名为BGM,在这个物体上只挂载我们的Audio Definition,所添加的事件就是BGMAudioClip,AudioClip我们就选择我们要使用的BGM的那个背景音乐,勾选Play OnEnable

运行游戏测试一下

还无法实现BGM,因为我们还没有使用场景的加载,所以一个场景加载的时候,所有的物体会被重新启动,我们将BGM关掉,重新启动一下就会有背景音乐

这样我们就成功播放了这个音乐

这个音效有的时候,我们不容易控制它的声音的大小,稍后我们制作一个暂停的菜单来控制整体的音效

我们先学习如何把不同的音效输入到不同的轨道,然后进行混音的输出,所以接下来我们要学习的重要内容就是AudioMixer

window菜单--Audio--AudioMixer(混音台)打开这个窗口

可以上下调节音乐,然后将他们整体输出

接下来,我们要来创建一下AudioMixer,在Setting文件夹下创建一个新文件夹AudioMixer

点击“ + ”,创建一个AudioMixer文件,他也是一个资产文件,起名为MainMixer

选中MainMixer,我们就可以在AudioMixer的窗口下看到它的内容

目前只有一个轨道MainMixer主输出的音轨,然后我们希望有多条音轨,一个是监听我们的BGM,一个是监听FX;很可能我们还需要监听其他各种各样的功能,比如人声或者环境音,白噪音等等

那我们用Groups添加子轨道,目前只有一个Master,点击“ + ”;然后就会创建一个子轨道起名为BGM;再次选中Master,点击“ + ”,这样会创建一个平级的子轨道起名为FX

我们选择AudioManager物体,接下来我们来看看这两个AudioSource组件下有一个选项OutPut,要把当前这个音源输出到AudioMixer的哪个Groups

第一个是BGM,第二个是FX

无论你的声音效果怎么样,我们都可以通过调音台去调整整体的音量

还可以使用主音轨输出,调节整个游戏的声音,一半游戏都会有音量条件;我们把主音轨的音量拉下来,那么BGM和FX的声音都会减小;拉大都会拉大(还可以通过很多其他的方式来调整我慢慢的音效)

目前我们可以运行测试一下;可以根据自己的要求调整一下音效

再做一个小调整

我们的野猪在一开始播放的时候,他会有一个暂停,然后马上一个回头

打开一下Enemy的代码,一开始的waitTimeCounter,一旦这个waitTime大于0的话,他就会持续不断地在这TimeCounter中进行相减,所以我们要把这个注销掉,不在一开始的时候给他重置时间,这样他会一开始的时候就正常走动

有的时候我们的设备在播放这个项目的时候,摄像机跟随人物移动会有一些类似的抖动;如果你认为画面有抖动的感觉,可以选择mainCamera,在inspector窗口--Update Method更新的方式;默认情况下选择的是Smart Update,可以改成Fixed Update,抖动的效果会好一些,根据需求去修改

特等奖标准成品论文(Word无水印纯净版) 硬核结构:全文包含完整的摘要、问题重述与分析、模型假设、符号说明、模型建立与求解、灵敏度分析及结论。 即插即用:排版严格遵循官方规范,逻辑严密。拿到手即可作为绝佳的高分参考模板,稍作替换与个性化润色即可极速完稿,彻底解决写论文难的痛点。 双源硬核解题代码(Python与MATLAB双版本) 拒绝假代码:提供底层逻辑清晰、模块化设计的全套可运行源码。 全流程覆盖:涵盖从前期数据清洗预处理,到中期核心数学模型训练,再到后期启发式算法寻优。 傻瓜式运行:代码自带详尽的逐行中文注释,并支持一键生成高质量结果可视化图表,编程小白也能轻松复现与二次开发。 全量数据与结果展示表 所有中间处理数据、模型输出参数以及最终结论,均已精细整理成高质量表格。直观呈现性能评估指标与多模型对比分析,可直接作为论文正文或附件使用,极大提升学术说服力。 独家硬核思路解析 深入浅出剖析出题人意图,详细拆解每一小问的数学本质与底层逻辑,让你不仅知其然更知其所以然。 【四大核心产品优势】 高效实用:所有代码与论文均经过严格测试,确保结果精准无误、完全可复现,省去熬夜试错的时间。 全栈覆盖:从思路分析到跑出结果,再到写出高质量论文,提供一站式全流程资料矩阵。 排版辅助:资料内提供专业的论文排版一键转换工具与官方标准模板,告别格式调整的繁琐。 持续迭代:网盘直发,开赛后资料库将持续滚动更新,所有用户均可免费同步获取最新包。 【适用人群】 想要打破建模瓶颈的参赛队长与主攻手;急需高质量底层代码的编程小白;目标直指特等奖需要高分模板对标的精英团队。
内容概要:本文围绕计及风电不确定性的电力系统黑启动与负荷恢复协同优化问题展开研究,提出一种融合风电出力随机特性的系统恢复策略。通过构建包含机组启动顺序、网络路径重建与负荷分阶段恢复的多目标协同优化模型,采用Matlab编程实现相应的优化算法,有效处理风电波动带来的系统不确定性,提升黑启动过程中系统的安全性、鲁棒性与恢复效率。研究充分考虑实际电网运行约束条件,如机组爬坡能力、网络潮流限制、启动电源可用性等,具备较强的工程应用前景与理论参考价值。; 适合人群:电力系统自动化、新能源科学与工程、能源动力工程等领域的高校研究生、科研机构研究人员,以及从事电网调度管理、电力系统应急恢复、新能源并网技术等相关工作的工程技术人员。; 使用场景及目标:①为含高比例风电的现代电力系统制定灾后黑启动预案提供优化方法支持;②支撑新能源富集地区电网在极端故障下的快速、安全恢复决策;③作为电力系统恢复领域学术研究、高水平论文复现与科研项目申报的技术基础。; 阅读建议:建议结合Matlab代码与电力系统分析专业知识进行深入学习,重点理解模型中对风电不确定性建模的方法(如场景削减、鲁棒优化或分布鲁棒优化等),并通过不同案例仿真对比验证所提策略的有效性与优越性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhaokuangkuang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值