我们知道,在游戏中经常会遇到对话的情况,尤其是在RPG游戏中。
这种对话一般是顺序性的,通过一段段的语音(对话)来判断是否结束。这部分代码的设计,重点用到了audio.isPlaying(语音是否结束)这个属性。对话有触发形式(手动点击)和顺序播放形式(自动播放,直到播放完毕)。
代码设计如下:
/*********************************************************************************
*Copyright(C) 2015 by #AUTHOR#
*All rights reserved.
*Author: #YangYadong#
*Version: #2.0#
*UnityVersion:#5.2.2#
*Date: #2017.1.12#
*Description: 管理一组音乐的播放、暂停、
*History: 分为自动播放音频对话和触发两种,切换场景后都是自动播放对话的,当出现触发键后,点击播放对话
**********************************************************************************/
using UnityEditor;
using System.Collections.Generic ;
using UnityEngine;
using System.Collections;
public class AudioManage : MonoBehaviour {
[MenuItem("导演/音频/自动播放")]
static void AutomaticPlay()
{
means = 0;
}
[MenuItem("导演/音频/触发播放")]
static void TriggerPlay()
{
means = 1;
}
//音乐播放器
public AudioSource music;
//要播放的音乐(顺序)
public static int audioNumber = 0;
//调用方法
public static int means = -1;
//音乐文件组
public AudioClip[] allMusic;
void Start()
{
//music.clip = allMusic[audioNumber];
//music.Play();
}
//控制顺序播放开关
public static bool isAutomatic = false;
//顺序播放的方法
void AutomaticMusic()
{
music.clip = allMusic[audioNumber];
music.Play();
Debug.Log("播放音乐" + audioNumber);
}
//触发播放的方法
void TriggerMusic()
{
if (audioNumber < allMusic.Length)
{
AutomaticMusic();
audioNumber++;
}
else
{
audioNumber = 0;
}
}
//逻辑处理
void Update()
{
if (means != -1)
{
if (means == 0)
{
Debug.Log("自动播放音乐");
if (audioNumber < allMusic.Length)
{
AutomaticMusic();
audioNumber++;
isAutomatic = true;
}
else
{
isAutomatic = false;
audioNumber = 0;
}
}
if (means == 1)
{
Debug.Log("触发播放音乐");
TriggerMusic();
}
means = -1;
}
if (isAutomatic == true)
{
//当不播放的时候,再次调用播放方法
if (!music.isPlaying) means = 0;
}
}
}
相对而言,顺序播放比触发式播放多了些自我判断。而且此处audioNumber我只写了一个,由触发式和自动式公用;如果需要的话,可以改为两个不同的值。如果需要在其他代码中引用的话,只需要改变means的值就可以了。
大家感兴趣的话,可以去我的资源下载demo试试~下载地址:
也可以用递归协程来实现
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEditor;
public class DialogueAudio : MonoBehaviour {
private AudioType aType;//音频播放形式
public AudioSource sound; //音频播放器
private static int audioNumber = 0;//顺序播放指针
private List <AudioClip> allMusic; //音频文件组,用xml表获取到的长度与名字加载
public static float StartTime = 5;//音频开始时间,可以在其他地方更改
private static bool isPlayAudio = true ;//音频锁,在播放音频的时候点击无效
private static float audioTime = 0;//记录当前播放的音频时间
//将xml表中要读取的音频加载到allMusic里面(此处代替)
public void AddAudio()
{
allMusic = new List<AudioClip>();
allMusic.Add(Resources.Load("0") as AudioClip);
allMusic.Add(Resources.Load("1") as AudioClip);
allMusic.Add(Resources.Load("2") as AudioClip);
}
//在n秒之后顺序播放音频,播放完之后解除音频锁
IEnumerator StartPlayAudio()
{
yield return new WaitForSeconds(StartTime);
StartCoroutine(PlayMusic());
}
//顺序播放音频,并进入音频锁状态;退出的时候解除
IEnumerator PlayMusic()
{
//当不是首位音频的时候,等待当前音频长度值,否则等待0
if (audioNumber != 0 ) yield return new WaitForSeconds(audioTime);
else yield return 0;
//当allMusic有值得时候
if (allMusic.Count != 0)
{
audioTime = allMusic[audioNumber].length;//获取播放长度
sound.clip = allMusic[audioNumber];//赋值音频
sound.Play();//开始播放
audioNumber++;//播放指针移动到下一位
}
//当指针小于播放长度的时候递归并进入音频锁,否则解除音频锁,并将指针归零
if (audioNumber < allMusic.Count)
{
StartCoroutine(PlayMusic());
isPlayAudio = true;
}
else
{
isPlayAudio = false;
audioNumber = 0;
}
}
//音频锁解锁的时候,点击按钮触发顺序播放
public void OnAudioClick()
{
if (isPlayAudio == false ) StartCoroutine(PlayMusic());
}
// Use this for initializations
void Start () {
AddAudio();
StartCoroutine(StartPlayAudio());
}
// Update is called once per frame
void Update () {
}
}