Audio Toolkit在其官方网站的一些说明,我做了写汉化,因为自己记性差,到下次用的时候可能就又要返回头去看说明,所以索性就先翻译一下,方便以后查阅。都是按自己的理解翻译的,如果有什么错误,可以指出。
How To Use:
* 创建一个GameObject命名为”AudioController”,并添加AudioComtroller脚本。这个对象唯一。
* 创建一个AudioObject prefab包含以下组件:Unity本身的AudioSource,AudioObject,PoolableObject(如果你想用pool的话)
*然后在这个prefab上自定义你的AudioSource参数。下一步,指定你的自定义的这个prefab到AudioController中的“audio Object”参数上:
*创建你的音频目录,在AudioController的属性面板中。比如”Music”,”SFX”等等。
*audio要能执行需要创建一个”audio item” 在指定的目录中,并且是需要唯一名称。
你也可以从project面板中选择多个audio片段然后点击”Add Selected Audio clips”.这会为每个片段创建一个audio item.
*如果你愿意,你也可以为你的audio Item创建多个子item.一个子item指向实际的音频文件。如果拥有了超过一个的子item,则Audio Toolkit将会随机播放,或按照一定的顺序播放,你可以进行设置。
你也可以从Project视图中选择多个audio片段,然后点击”Add Selected audio clips”按钮,你就会为每个片段都创建为一个子item。
要播放一个audio item, 只需要调用static function:
AudioController.Play( “MyUniqueAudioItemName” )
使用AudioController.PlayMusic( “MusicAudioItemName” )来播放音乐,这个函数保证在同一时间只能有一个音乐文件在播放,在音乐转换时可以由淡入淡出的效果,可以再AudioController中配置。
进一步的例子:
AudioController.Play( “MySoundEffect1” );
AudioController.Play( “MySoundEffect2”, new Vector3( posX, posY, posZ ) );
AudioController.PlayMusic( “MusicTrack1” );
AudioController.SetCategoryVolume( “Music”, 0.5f );
AudioController.PauseMusic();
///PoolableObject文件头说明///////////////////////////////////////////////////////////////////////////////////////////
用法:
把PoolableObject脚本组件添加到想要入池的prefab上。你可以在属性面板中设置该对象在池中的最大值。
替换所有Instantiate(prefab)的地方,替换为 ObjectPoolController.Instantiate(prefab).
替换所有Destroy(objectInstance)为 ObjectPoolController.Destroy(objectInstance)
注意Awake() 与 OnDestroy()也会被调用,不管怎样,要确保所有组件数据在Awake中能够初始化所有可能在生命历程中会被改变的数据。
Start()也会被调用,紧随Awake()在ObjectPoolController.Instaniate(…)中,不会在下一帧调用。
如果一个池中物的父节点是非池中物,则这个父节点必须使用ObjectPoolController.Destroy(…)来进行destroy操作。
要明白OnDestroy()会被调用多次:
a) 当object被添加到池中的时候会调用 ObjectPoolController.Destroy()
b) 当object确实被销毁的时候,比如加载新的场景时。
引用一个池中的对象不会变为null一旦一个object已经被”destroyed”并移到池中,使用PoolableReference如果你需要一些check。
PoolableObject说明:
添加这个脚本到你的prefab使他成为池中物。
查看ObjectPoolController来了解怎么设置池中的prefab.
下面这些消息是向池中物对象发送的:
Awake(),OnDestroy(),是当池中对象被active或deactive时。
这个方式就类似于一般behaviour的instantiated与destroy.
只有当 sendAwakeStartOnDestroyMessage 被选中时才会发送这两个消息。
OnPoolInstanceAwake 与 OnPoolableInstanceDestroy 是在当对象是确实的被实例化与销毁时调用。
因为当前Unity的机制问题,OnPoolableInstanceDestroy在Flash中不起作用。
OnPoolableObjectActivated 与 OnPoolableObjectDeactivated 是在池中对象active与deattive时调用。
这两个消息只有当 sendPoolableActivateDeactivateMessage被选中时才发送。
ObjectPoolController说明:
一个静态类用于创建与销毁池中对象。
什么是池?。。。
池怎么工作?。。。
怎么在池中设置一个prefab:
首先是给这个prefab添加PoolableObject脚本组件。你可以在属性面板中设置这个prefab在池中的最大数量。
替换Instantiate(myprefab)为ObjectPoolController.Intantiate(myprefab)
替换Destroy(myObjectInstance)为ObjectPoolController.Destroy(myObjectInstance)
注意,要理解下面这个:
所有数据必须在Awake,Start中被初始化。
OnDestroy将会在这个object被Unity删除的时候被调用第二次。
如果一个池中物对象的父对象不是一个池中物,那这个扶对象被删除的时候也必须使用ObjectPoolControler.Destroy(…).
如果你持有一个池中物对象的引用,则ObjectPoolControll.Destroy之后这个引用不会被变为null,就像一般Unity对象的用法一样。这是因为这个对象仍然存在—只是在池中。
要确保你持有的这个池中物的引用是可用的,你必须使用PoolableReference
PoolableReference说明:
辅助类,用于解决当持有一个池中物的引用,但该池中物被ObjectPoolController.Destroy移回到池中时该引用变为null的情况。
一个组件要替掉一般的脚本组件的引用而是用池中物对象:
MyScriptComponent scriptComponent = PoolableObjectController.Instantiate(prefab).GetComponent<MyScriptComponent>();
var myReference = new PoolableReference<MyScriptComponent>(scriptComponent);
if(myReference.Get() != null) // 将会检测这个实例化的是否仍属于源对象
{
myReferrence.Get().MyComponentFunction();
}