Unity x ADX2LE Webプレーヤ時はUnity標準で再生する

Unity x ADX2LE Webプレーヤ時はUnity標準で再生する構想 2014-01-16更新

目次


Unity x ADX2LE Webプレーヤ時はUnity標準で再生する構想

思いつきのきっかけ

  • ADX2LE使うとWEBプレーヤで公開しても音でないのは寂しい
  • ADX2LE導入前にとりあえず自動変換パッチみたいのあると便利じゃね?
  • 完全互換とまではいかないまでも、単純再生くらいはできて良いのでは?
  • Unity標準との動作の違いが感じられるんじゃね?(リソースの管理方法による発音の変化など)

ADX2LE for Unityの動かせるプラットフォーム

  • Unity5からはPersonal版でも動く
  • Unity4.xのfreeでもiPhone/Android実機ではADX2LE動きます。
  • Unity4.x版freeで、制限されているのは、PCのエディタ上でのDLL呼び出し。Webプラグイン。
  • FuzeのプラグインのMidi Bridgeみたいに別アプリ経由なら動いてしまうかも。
  • Unity5でもWebでのプラグイン動作は・・・できない?

いくつか制限する

  • キュー名と波形名は同じ(拡張子除く)
  • AudioClipは特定のAssetsフォルダに入れておく。AtomCraftRoot/とか
  • Assetsのフォルダ階層→キューシートフォルダ名やキューシート名に
  • AudioClipの3D,2Dはインスペクタ上で指定しておく。

互換保証できそうなレベルについて

  • 単純1Shot音ならいける?
  • Loop音は怪しい
  • ブロック、AISACも無理

ほとんど単純再生だよね?

  • WEBプレーヤ時は、単純キュー再生と同じように再生する。
  • AtomSource→AudioSourceに置き換わる。
  • Volume,Pitchくらいは反映する。

ToDO

  • Editor拡張で(ADX2LE,Unity標準)相互ラッパー for WEBプレーヤ用
  • Editor拡張でADX2LEへマテリアル追加(ある程度Unity側でデータ構築し、ビルドのみADX2LEに頼る形)
  • package化して、ADX2LE Pluginインポート後に、入れるような形で公開

サンプル1 MyAudioSource.cs

MyAudioSource.cs

MyAudioSource.csは、AudioSourceとCriAtomSourceをラッパーしたクラスで、
Webプレーヤ時のみAudioSourceとして動作します。
単純に差し替えなので両方の全機能が使えます。
また、Playなど共通の関数定義のものはソースも共通化できますが、
足りないものはここに追加して適宜必要に応じて共有関数化してしまうのも手です。

using UnityEngine;
using System.Collections;
#if UNITY_WEBPLAYER
public class MyAudioSource : MonoBehaviour
{	
	private AudioSource _Mysource;
	public AudioSource source 
	{
		get
		{
			return _Mysource;
		}
	}	
	public void Awake()
	{
		if(_Mysource == null){
			_Mysource = gameObject.AddComponent<AudioSource>();			
			source.rolloffMode = AudioRolloffMode.Linear;	//3Dポジション時に音が小さくなるのを軽減
		}
	}	
#else	
public class MyAudioSource : CriAtomSource
{	
	public CriAtomSource source { 
		get
		{
			return this;
		}
	}
#endif		
}

使い方

ここでは、Resourcesフォルダ内にADX2のMaterialsフォルダの波形のコピーがあるものとしています。
Webブラウザ時は波形のパス指定、loopの指定を行っています。
Webブラウザ時は初回再生時にAudioClipをロードしています。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SoundManager : MonoBehaviour {
	MyAudioSource bgm;
	void AudioSetup()
	{
		if(bgm == null)bgm = gameObject.AddComponent<MyAudioSource>();
	}
	void PlayOpening()
	{
	if(bgm == null)AudioSetup();
#if UNITY_WEBPLAYER
		bgm.source.clip = GetAudioClipOrLoad("AudioForWeb/Materials/BGM/opening");
		bgm.source.loop = false;
#else
		bgm.source.cueName = "opening";
#endif
		bgm.source.Play();
	}
	Dictionary<string,AudioClip> audioClipList = new Dictionary<string, AudioClip>();	
	AudioClip GetAudioClipOrLoad(string path)
	{
		if(audioClipList.ContainsKey(path)){
			return 	audioClipList[path]; //既にロード済なら再利用
		} else
		{
			audioClipList.Add(path,Resources.Load(path, typeof(AudioClip)) as AudioClip);	
		}
		return 	audioClipList[path];
	}
}

ご意見はこちら

名前:
コメント: