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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp 前奏とループが存在するBGMの実装相关的知识,希望对你有一定的参考价值。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

/// <summary>
/// 前奏とループが存在するBGMの実装
/// </summary>
public class SoundManager : MonoBehaviour
{
	[SerializeField]
	private List<SoundInfo> _infoList;
	[SerializeField]
	private BgmDefine _currentBgmDefine;

	private AudioSource _currentBgmSource;

	/// <summary>
	/// BGMの登録
	/// </summary>
	/// <param name="define">Define.</param>
	/// <param name="clip">Clip.</param>
	public void RegisterBgm (BgmDefine define, AudioClip clip)
	{
		if (_infoList == null) {
			_infoList = new List<SoundInfo> ();
		}

		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);
	}

	/// <summary>
	/// BGMの再生
	/// </summary>
	/// <param name="key">Key.</param>
	public void PlayBgm (string key)
	{
		var info = _infoList.Find (x => x.clip.name == key);
		if (info == null) {
			return;
		}

		// 複数サウンド同時再生はこのサンプルでは考慮していません
		var source = GetComponent<AudioSource> ();
		if (source == null) {
			source = gameObject.AddComponent<AudioSource> ();
		}
		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;
			}
		}
	}

}

/// <summary>
/// BGM定義ファイルとAudioClipをセットにしたクラス
/// </summary>
[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;
	}
}

/// <summary>
/// BGM定義クラス
/// 最終的にはアセットバンドルと同梱するテキストファイルになる予定
/// </summary>
[System.Serializable]
public class BgmDefine
{
	/// <summary>
	/// ユニークキー
	/// </summary>
	public string key;
	/// <summary>
	/// BGMのスタート時間
	/// </summary>
	public float startTime;
	/// <summary>
	/// ループポイント時間
	/// </summary>
	public float loopTime;
	/// <summary>
	/// BGMの終了時間
	/// </summary>
	public float endTime;
}
using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
{
	public AudioClip clip;
	private SoundManager _mng;

	void Start ()
	{
		_mng = gameObject.AddComponent<SoundManager> ();
		BgmDefine def = new BgmDefine ();
		def.endTime = 10f;
		def.startTime = 3;
		def.loopTime = 4f;
		def.key = "testBgm";
		_mng.RegisterBgm (def, clip);
	}

	void OnGUI ()
	{
		if (GUILayout.Button ("Play BGM")) {
			_mng.PlayBgm ("testBgm");
		}
	}
}

以上是关于csharp 前奏とループが存在するBGMの実装的主要内容,如果未能解决你的问题,请参考以下文章

markdown メール机能の実装

php simplyscrollの実装スライダー

python Chainerによる畳み込みニューラルネットワークの実装

vbscript 的ActiveXコントローラーでタブ移动の実装サンプル

python Chainerによる多层パーセプトロンの実装

php 【ゼロから作る深度学习】2.5.2 XORゲートの実装(多层パーセプトロン)