04_Unity音频常用接口
Posted 打工人小棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04_Unity音频常用接口相关的知识,希望对你有一定的参考价值。
介绍
本文共分为两部分内容,第一部分介绍了Unity音频的常用接口,第二部分对这些接口进行二次封装,提炼出一个通用框架,方便大家使用,欢迎抄作业。
通用接口
官方文档: https://docs.unity3d.com/ScriptReference/AudioSource.html
下面仅罗列出一些常用的接口
// 停止播放
audiosource.Stop();
// 开始播放
audioSource.Play();
// 暂停播放
audioSource.Pause();
// 设置audioSources的音频源
audioSource.clip = clip;
// 在一个audioSource上播放多个声音
audioSource.PlayOneShot(clip);
// 设置音量大小
audioSource.volume = volume;
通用框架
准备
- 创建一个全局管理器GameManager.cs
- GameManager设置为单例,方便使用
- 在GameManager身上挂一个AudioSource,用来播放通用音频
实现逻辑
具体实现逻辑,附注释:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
// GameManager 身上挂一个: audioSource
private AudioSource audioSource;
// GameManager 设置为单例
private GameManager instance;
// dictAudio 用来缓存已经加载过的音频源
private Dictionary<string, AudioClip> dictAudio;
void Awake()
instance = this;
void Start()
dictAudio = new Dictionary<string, AudioClip>();
audioSource = GetComponent<AudioSource>();
// 辅助函数:加载音频,需要确保音频文件放在Resources文件夹下
public AudioClip LoadAudio(string path)
return (AudioClip)Resources.Load(path);
// 辅助函数:查看下dictAudio是否缓存过该音频,已经有的不需要重新加载
private AudioClip GetAudio(string name)
if (!dictAudio.ContainsKey(name))
dictAudio[name] = LoadAudio(name);
return dictAudio[name];
// 播放背景音乐(可以设置音量)
public void PlayBGM(string name, float volume = 1.0f)
audioSource.Stop();
audioSource.clip = GetAudio(name);
audioSource.Play();
// 用物体身上的audioSource播放声音碎片(可以设置音量)
public void PlaySound(AudioSource audioSource, string path, float volume = 1.0f)
audioSource.PlayOneShot(LoadAudio(path));
audioSource.volume = volume;
// 用GameManager身上的audioSource播放声音碎片(可以设置音量)
public void PlaySound(string path, float volume = 1.0f)
this.audioSource.PlayOneShot(LoadAudio(path));
this.audioSource.volume = volume;
使用案例
假设Resources文件夹下面有三个音频文件:
- bgm : 背景音乐
- common : 通用声音
- sound : 物体发出的声音,比如:鸡你太美
// 播放背景音乐
GameManager.instance.playBGM("bgm", 1)
// 播放通用声音
GameManager.instance.PlaySound("common", 1)
// 播放物体身上的声音
// 假设物体是: kunObject
GameManager.instance.PlaySound(kunObject.getComponent(AudioSource), "common", 1)
结语
你学废了吗?
关注我,一起进步吧~
游戏开发实验Unity音频效果可视化显示(GetSpectrumData接口)
文章目录
一. 前言
我们可以在音频软件中可以看到音频一些特效效果,比如这样:
在Unity
中如何制作类似的这种效果呢。
我做了个简易的效果(虽然效果很简单,但我相信懂了原理之后,上面这种效果也可以做出来了),如下:
Demo
工程我已上传到GitHub
,大家可以下载下来学习:
https://github.com/linxinfa/Unity-AudioDance
二. GetSpectrumData接口
AudioSources
有一个接口,用于采样声谱数据块:
public static void GetSpectrumData(float[] samples, int channel, FFTWindow window);
参数说明:
samples
: 函数返回值。将音频样本数据传送至samples数组,数组大小必须为2的n次方,最小64,最大8192。
channel
: 一般设置为0。
window
: 转换信号所用的窗函数,算法越复杂,声音越柔和,但速度更慢。
用法 :
先声明一个浮点数组:
public float[] samples = new float[8192];
在Update方法里面使用方法:
audiosource.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);
三. 具体制作
准备资源:
1 一个音频文件
2 一个材质球
3 一个Main脚本(脚本代码见文章下面)
材质球效果自己看着喜欢设置,我的材质球设置如下:
场景中,创建一个物体,命名为LienRenderer
,挂上LienRenderer
组件,并给设置材质球:
给Main Camera
挂上Main
脚本,并赋值Audioclip
和Linerender
:
Main.cs
脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
private AudioSource m_audiosource;
public AudioClip audioclip;
public float[] samples;
public LineRenderer linerender;
private readonly int LINERENDER_POINT_CNT = 32;
void Start()
m_audiosource = gameObject.GetComponent<AudioSource>();
m_audiosource.clip = audioclip;
m_audiosource.Play();
samples = new float[1024];
linerender.positionCount = LINERENDER_POINT_CNT;
linerender.startWidth = 0.02f;
linerender.endWidth = 0.02f;
// Update is called once per frame
void Update()
m_audiosource.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);
for (int i = 0, cnt = LINERENDER_POINT_CNT; i < cnt; ++i)
var v = samples[i];
linerender.SetPosition(i, new Vector3((i - LINERENDER_POINT_CNT / 2) * 0.2f, v * 20, -5));
最后运行Unity即可看到效果。
以上是关于04_Unity音频常用接口的主要内容,如果未能解决你的问题,请参考以下文章
TYPESDK手游聚合SDK客户端设计思路与架构之四:unity开发平台部分结构设计和思路
在 Agora.io 视频通话后 Unity VideoPlayer 音频中断
Unity 浏览选择指定格式文件(可设置格式:图片视频音频等等,自己设置)浏览选择文件夹打开指定文件夹——以上功能都会返回路径