首页 > 其他分享 >Unity引擎2D游戏开发,音源设置和音效播放

Unity引擎2D游戏开发,音源设置和音效播放

时间:2023-12-31 13:22:37浏览次数:31  
标签:播放 void 音源 2D 音效 OnEventRaised Audio public

导入资源包

在Unity Assets Store当中,下载导入下面两个资源包到Unity中
image

在Unity中,下载导入到项目当中
image

新建一个文件夹,命名为Audio,将导入的两个文件夹放进来
image

挂载音效

打开Main Camera,能够发现该摄像机带有一个名为“Audio Listener”的组件
image
该组件用于监听音源发出的声音
当摄像机拥有监听组件时,只要摄像机的位置在音源播放的范围内,就能够捕捉到该声音

Audio Manager上添加Audio Source组件,该组件用于播放BGM
image
Play On Awake:启动时播放,一般用于当作BGM时使用
Loop:循环

再添加一个Audio Source,用于播放音效,取消勾选Play On Awake
image

编写代码控制音效的播放

用代码去获取不同的Audio Source播放不同的片段

创建名为AudioManager的C#脚本
image

挂载到Audio Manager
image

创建两个全局变量,用于挂在不同的Audio Source

// 背景音乐源
public AudioSource BGMSource;
// 音效源
public AudioSource FXSource;

将两个AudioSource拖入进行挂载
image

接下来以攻击为例,当Attack Area中任意一段启动的时候就需要播放音效,所以需要把音效挂载在它们之上。接着用它们去通知Audio Manager来播放需要执行的音效。因此,在这种跨物体传递的场景下,需要通过创建Event事件的方法,将需要的变量进行传递

新建一个PlayAudioEventSO C#脚本
image

在内部实现RaiseEvent()事件方法,由于需要传递AudioClip,所以UnityAction泛型写为AudioClip

using UnityEngine;
using UnityEngine.Events;

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

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

在Events文件夹内,创建两个Event,分别为BGM Audio EventFX Audio Event
image

接下来,需要在每一段攻击标记需要用哪一个Clip,并且还需要以事件的方式进行广播。因此,创建一个单独的代码,标记使用的音乐片段,命名为AudioDefiniton
image

创建三个全局变量

public PlayAudioEventSO playAudioEvent;
public AudioClip audioClip;
// 是否在启动时播放
public bool playOnEnable;

创建PlayAudioClip()方法用于执行音乐片段

public void PlayAudioClip()
{
    playAudioEvent.OnEventRaised(audioClip);
}

创建OnEnable()方法,判断在启动时进行播放

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

将Attack1、2、3分别选中FX Audio Event和各自的音效Audio Clip。并勾选上Play On Enable,只要物件激活时就开始播放
image

那么这时候事件广播已经创建好,那么接下来就要做事件监听的任务

AudioManager脚本中,添加两个事件监听的全局变量

[Header("事件监听")]
// 音效事件监听
public PlayAudioEventSO FXEvent;
// 背景音乐事件监听
public PlayAudioEventSO BGMEvent;

创建事件注册OnEnable()方法和注销OnDisable()方法的方法

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

private void OnDisable()
{
    FXEvent.OnEventRaised -= OnFXEvent;
}

将传入的Clip赋值给AudioSourceClip中,并执行Play()方法

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

设置好两个Event事件
image

此时,执行攻击动作就会有攻击的音效

同理,BGM的事件监听也写好

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

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

private void OnBGMEvent(AudioClip clip)
{
    BGMSource.clip = clip;
    BGMSource.Play();
}

创建一个Empty Object,命名为BGM。绑定Audio Definition脚本,设置好组件和片段后,勾选Play On Enable
image

此时,开始游戏重新启用下该组件即可有BGM

音效混音轨道

打开Window菜单,选中Audio,点击Audio Mixer
image

与此同时,在Settings文件夹下,创建Audio Mixer文件,命名为Main Mixer
image

想要为每一种声音建立各自轨道,那么点击Groups旁边的加号生成一条音轨
image

Audio Source中,点击Output即可选择刚才生成的音轨
image

标签:播放,void,音源,2D,音效,OnEventRaised,Audio,public
From: https://www.cnblogs.com/xinlindeyu/p/17937435

相关文章

  • Unity引擎2D游戏开发,摄像机跟随及攻击抖动实现
    安装摄像机插件打开PackageManager,输入Cinemachine进行搜索安装导入摄像机在Hierarchy窗口中,添加2DCamera会发现Game窗口没有任何东西,因为该摄像机并没有进行跟随、观看等相关的设置将Player拖进Follow、LookAt,并将LensOrthoSize设置为6此时Game窗口聚焦到了Playe......
  • Unity引擎2D游戏开发,血量更新逻辑的实现
    思路能够发现FillAmount就是控制血量条长度的控件,它是一个百分比值,则可以通过当前血量除以最大血量得到当前血量的百分比。那么,也就能控制血量条的长度了。编写基本的更新逻辑创建C#文件将C#文件挂载到PlayerStateBar上在C#文件中调用UI组件前,需要调用UI组件库usingU......
  • Unity引擎2D游戏开发,UI绘制创建人物状态栏
    下载并导入UI资源前往UnityAssetsStore中下载添加此资源打开Unity中的PackageManager,选择MyAssets,点击Import导入项目中取消选择Scene,其他的全都勾选上,然后点击Import然后在Assets文件夹下方会出现MStudio文件夹,此处就是插件的目录打开ColorPalette,能够看到不同前......
  • mac m1 编译cocos2d-x 在模拟器上运行 一些问题汇总
     如果涉及到侵权请联系本人删除 1  》〉/Users/yzfhkms-m/Library/Developer/Xcode/DerivedData/formi-dlcfwgxcmidqefdkxnvnfwfprpfs/Build/Products/Debug-iphonesimulator/formi-mobile.appisnotavalidpathtoanexecutablefile.Pleaserebuildtheprojectto......
  • Unity引擎2D游戏开发,敌人追击状态的转换
    思路:从敌人的位置发射一道射线或者一片区域来对玩家实体进行检测,如果检测倒玩家,则进行追击进攻利用BoxCast()即可实现BoxCast()官方文档:https://docs.unity3d.com/cn/2022.3/ScriptReference/Physics2D.BoxCast.html创建检测区域由于BoxCast需要众多参数,所以在Enemy中创建......
  • A2DP_AVDTP
    a2dp的架构常见的音频编解码:SBC、AAC、APTX等,负责对PCMrawdata进行编解码(编码就会有压缩率,即将rawdata减少)。经过编码后的rawdata会被传送到AVDTP层,加上这层的协议数据再传送到L2CAP层,最后会传到对端的A2DPsink,然后进过解码将rawdata丢到speaker中。 A2DP定义了两个......
  • Unity引擎2D游戏开发,有限状态机&抽象类多态
    状态机与抽象类观察如下代码:publicclassAttackFinish:StateMachineBehaviour{//OnStateEnteriscalledwhenatransitionstartsandthestatemachinestartstoevaluatethisstateoverridepublicvoidOnStateEnter(Animatoranimator,AnimatorStateIn......
  • 数据可视化结合2D地图能够给我们带来什么样的变化?
    在信息时代,数据可视化与2D地图的结合为我们的生活和工作带来了深刻的变革。这一强大的组合不仅为我们提供了全新的视角,更为各行各业的发展和决策提供了更为精准的指导。下面我就以可视化从业者的视角,来简单聊聊数据可视化和2D地图的结合。首先,结合2D地图的数据可视化为城市规划和......
  • Unity引擎2D游戏开发,受伤及死亡的逻辑和动画
    裁切素材制作受伤动画略制作死亡动画由于没有死亡动画素材,所以直接调整Alpha通道数值,使其逐渐消失在Animations中复制野猪受伤动画,命名为boarDeadAnimator中拖入boarDead动画点击AddProperty,选择Color将最后一帧的Alpha值改为0Animator连接动画逻辑从AnyState连接......
  • 2D triangle area
     *area3.c#include<stdio.h>#defineDET2(a)(a[0][0]*a[1][1]-a[0][1]*a[1][0])#definePOINT2_TYPE(type)structpoint2##type#defineSTRUCT_POINT2(type)\ POINT2_TYPE(type){\ typex;\ typey;\ }#defineAREA_3POINT2_NAME(type)are......