(旧)コダフォンの日記ブログ(移転しました)

FC2ブログに移転しました。ここいる?

Unity BGMを流す 途中から流す ループさせる コードメモ

http://www.shibuya24.info/entry/2015/08/04/115000

1fgh.png

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.Linq;

///

/// 前奏とループが存在するBGMの実装

///

public class SoundManager : MonoBehaviour

{

[SerializeField]

private List _infoList;

[SerializeField]

private BgmDefine _currentBgmDefine;

private AudioSource _currentBgmSource;

///

/// BGMの登録

///

/// Define.

/// Clip.

public void RegisterBgm (BgmDefine define, AudioClip clip)

{

if (_infoList == null) {

_infoList = new List ();

}

var info = _infoList.Find (x => x.define.key == define.key);

if (info != null) {

Debug.LogError ("already exist key. " + define.key);

return;

}

info = new SoundInfo (define, clip);

_infoList.Add (info);

}

///

/// BGMの再生

///

/// Key.

public void PlayBgm (string key)

{

var info = _infoList.Find (x => x.clip.name == key);

if (info == null) {

return;

}

// 複数サウンド同時再生はこのサンプルでは考慮していません

var source = GetComponent ();

if (source == null) {

source = gameObject.AddComponent ();

}

source.clip = info.clip;

source.Play ();

// 再生するBGMのstartTimeのセット

source.time = info.define.startTime;

_currentBgmDefine = info.define;

_currentBgmSource = source;

}

void Update ()

{

// 再生中のBGMの再生時間を監視する

if (_currentBgmDefine != null && _currentBgmSource != null && _currentBgmSource.isPlaying) {

if (_currentBgmSource.time >= _currentBgmDefine.endTime) {

_currentBgmSource.time = _currentBgmDefine.loopTime;

}

}

}

}

///

/// BGM定義ファイルとAudioClipをセットにしたクラス

///

[System.Serializable]

public class SoundInfo

{

public BgmDefine define;

public AudioClip clip;

public SoundInfo (BgmDefine define, AudioClip clip)

{

this.define = define;

this.clip = clip;

// Clip名はdefine.keyに強制的に変更する。オペミスで異なった時のため

this.clip.name = define.key;

}

}

///

/// BGM定義クラス

/// 最終的にはアセットバンドルと同梱するテキストファイルになる予定

///

[System.Serializable]

public class BgmDefine

{

///

/// ユニークキー

///

public string key;

///

/// BGMのスタート時間

///

public float startTime;

///

/// ループポイント時間

///

public float loopTime;

///

/// BGMの終了時間

///

public float endTime;

}

using UnityEngine;

using System.Collections;

public class Main : MonoBehaviour

{

public float end= 90f;

public float start = 5f;

public float loop=5f;

public AudioClip clip;

private SoundManager _mng;

void Start ()

{

_mng = gameObject.AddComponent ();

BgmDefine def = new BgmDefine ();

def.endTime = end;

def.startTime = start;

def.loopTime = loop;

def.key = "testBgm";

_mng.RegisterBgm (def, clip);

_mng.PlayBgm ("testBgm");

}

/*void OnGUI ()

{

if (GUILayout.Button ("Play BGM")) {

_mng.PlayBgm ("testBgm");

}

}*/

}