我们知道,在游戏中经常会遇到对话的情况,尤其是在RPG游戏中。

dialogue system for unity设置简单对话 unity触发对话_播放音频


这种对话一般是顺序性的,通过一段段的语音(对话)来判断是否结束。这部分代码的设计,重点用到了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 () {

    }
}