SoundComponent.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using GameFramework;
  8. using GameFramework.Resource;
  9. #if UNITY_5_3
  10. using GameFramework.Scene;
  11. #endif
  12. using GameFramework.Sound;
  13. using System.Collections.Generic;
  14. using UnityEngine;
  15. using UnityEngine.Audio;
  16. using UnityEngine.SceneManagement;
  17. namespace UnityGameFramework.Runtime
  18. {
  19. /// <summary>
  20. /// 声音组件。
  21. /// </summary>
  22. [DisallowMultipleComponent]
  23. [AddComponentMenu("Game Framework/Sound")]
  24. public sealed partial class SoundComponent : GameFrameworkComponent
  25. {
  26. private const int DefaultPriority = 0;
  27. private ISoundManager m_SoundManager = null;
  28. private EventComponent m_EventComponent = null;
  29. private AudioListener m_AudioListener = null;
  30. [SerializeField]
  31. private bool m_EnablePlaySoundUpdateEvent = false;
  32. [SerializeField]
  33. private bool m_EnablePlaySoundDependencyAssetEvent = false;
  34. [SerializeField]
  35. private Transform m_InstanceRoot = null;
  36. [SerializeField]
  37. private AudioMixer m_AudioMixer = null;
  38. [SerializeField]
  39. private string m_SoundHelperTypeName = "UnityGameFramework.Runtime.DefaultSoundHelper";
  40. [SerializeField]
  41. private SoundHelperBase m_CustomSoundHelper = null;
  42. [SerializeField]
  43. private string m_SoundGroupHelperTypeName = "UnityGameFramework.Runtime.DefaultSoundGroupHelper";
  44. [SerializeField]
  45. private SoundGroupHelperBase m_CustomSoundGroupHelper = null;
  46. [SerializeField]
  47. private string m_SoundAgentHelperTypeName = "UnityGameFramework.Runtime.DefaultSoundAgentHelper";
  48. [SerializeField]
  49. private SoundAgentHelperBase m_CustomSoundAgentHelper = null;
  50. [SerializeField]
  51. private SoundGroup[] m_SoundGroups = null;
  52. /// <summary>
  53. /// 获取声音组数量。
  54. /// </summary>
  55. public int SoundGroupCount
  56. {
  57. get
  58. {
  59. return m_SoundManager.SoundGroupCount;
  60. }
  61. }
  62. /// <summary>
  63. /// 获取声音混响器。
  64. /// </summary>
  65. public AudioMixer AudioMixer
  66. {
  67. get
  68. {
  69. return m_AudioMixer;
  70. }
  71. }
  72. /// <summary>
  73. /// 游戏框架组件初始化。
  74. /// </summary>
  75. protected override void Awake()
  76. {
  77. base.Awake();
  78. m_SoundManager = GameFrameworkEntry.GetModule<ISoundManager>();
  79. if (m_SoundManager == null)
  80. {
  81. Log.Fatal("Sound manager is invalid.");
  82. return;
  83. }
  84. m_SoundManager.PlaySoundSuccess += OnPlaySoundSuccess;
  85. m_SoundManager.PlaySoundFailure += OnPlaySoundFailure;
  86. if (m_EnablePlaySoundUpdateEvent)
  87. {
  88. m_SoundManager.PlaySoundUpdate += OnPlaySoundUpdate;
  89. }
  90. if (m_EnablePlaySoundDependencyAssetEvent)
  91. {
  92. m_SoundManager.PlaySoundDependencyAsset += OnPlaySoundDependencyAsset;
  93. }
  94. m_AudioListener = gameObject.GetOrAddComponent<AudioListener>();
  95. #if UNITY_5_4_OR_NEWER
  96. SceneManager.sceneLoaded += OnSceneLoaded;
  97. SceneManager.sceneUnloaded += OnSceneUnloaded;
  98. #else
  99. ISceneManager sceneManager = GameFrameworkEntry.GetModule<ISceneManager>();
  100. if (sceneManager == null)
  101. {
  102. Log.Fatal("Scene manager is invalid.");
  103. return;
  104. }
  105. sceneManager.LoadSceneSuccess += OnLoadSceneSuccess;
  106. sceneManager.LoadSceneFailure += OnLoadSceneFailure;
  107. sceneManager.UnloadSceneSuccess += OnUnloadSceneSuccess;
  108. sceneManager.UnloadSceneFailure += OnUnloadSceneFailure;
  109. #endif
  110. }
  111. private void Start()
  112. {
  113. BaseComponent baseComponent = GameEntry.GetComponent<BaseComponent>();
  114. if (baseComponent == null)
  115. {
  116. Log.Fatal("Base component is invalid.");
  117. return;
  118. }
  119. m_EventComponent = GameEntry.GetComponent<EventComponent>();
  120. if (m_EventComponent == null)
  121. {
  122. Log.Fatal("Event component is invalid.");
  123. return;
  124. }
  125. if (baseComponent.EditorResourceMode)
  126. {
  127. m_SoundManager.SetResourceManager(baseComponent.EditorResourceHelper);
  128. }
  129. else
  130. {
  131. m_SoundManager.SetResourceManager(GameFrameworkEntry.GetModule<IResourceManager>());
  132. }
  133. SoundHelperBase soundHelper = Helper.CreateHelper(m_SoundHelperTypeName, m_CustomSoundHelper);
  134. if (soundHelper == null)
  135. {
  136. Log.Error("Can not create sound helper.");
  137. return;
  138. }
  139. soundHelper.name = "Sound Helper";
  140. Transform transform = soundHelper.transform;
  141. transform.SetParent(this.transform);
  142. transform.localScale = Vector3.one;
  143. m_SoundManager.SetSoundHelper(soundHelper);
  144. if (m_InstanceRoot == null)
  145. {
  146. m_InstanceRoot = new GameObject("Sound Instances").transform;
  147. m_InstanceRoot.SetParent(gameObject.transform);
  148. m_InstanceRoot.localScale = Vector3.one;
  149. }
  150. for (int i = 0; i < m_SoundGroups.Length; i++)
  151. {
  152. if (!AddSoundGroup(m_SoundGroups[i].Name, m_SoundGroups[i].AvoidBeingReplacedBySamePriority, m_SoundGroups[i].Mute, m_SoundGroups[i].Volume, m_SoundGroups[i].AgentHelperCount))
  153. {
  154. Log.Warning("Add sound group '{0}' failure.", m_SoundGroups[i].Name);
  155. continue;
  156. }
  157. }
  158. }
  159. private void OnDestroy()
  160. {
  161. #if UNITY_5_4_OR_NEWER
  162. SceneManager.sceneLoaded -= OnSceneLoaded;
  163. SceneManager.sceneUnloaded -= OnSceneUnloaded;
  164. #endif
  165. }
  166. /// <summary>
  167. /// 是否存在指定声音组。
  168. /// </summary>
  169. /// <param name="soundGroupName">声音组名称。</param>
  170. /// <returns>指定声音组是否存在。</returns>
  171. public bool HasSoundGroup(string soundGroupName)
  172. {
  173. return m_SoundManager.HasSoundGroup(soundGroupName);
  174. }
  175. /// <summary>
  176. /// 获取指定声音组。
  177. /// </summary>
  178. /// <param name="soundGroupName">声音组名称。</param>
  179. /// <returns>要获取的声音组。</returns>
  180. public ISoundGroup GetSoundGroup(string soundGroupName)
  181. {
  182. return m_SoundManager.GetSoundGroup(soundGroupName);
  183. }
  184. /// <summary>
  185. /// 获取所有声音组。
  186. /// </summary>
  187. /// <returns>所有声音组。</returns>
  188. public ISoundGroup[] GetAllSoundGroups()
  189. {
  190. return m_SoundManager.GetAllSoundGroups();
  191. }
  192. /// <summary>
  193. /// 获取所有声音组。
  194. /// </summary>
  195. /// <param name="results">所有声音组。</param>
  196. public void GetAllSoundGroups(List<ISoundGroup> results)
  197. {
  198. m_SoundManager.GetAllSoundGroups(results);
  199. }
  200. /// <summary>
  201. /// 增加声音组。
  202. /// </summary>
  203. /// <param name="soundGroupName">声音组名称。</param>
  204. /// <param name="soundAgentHelperCount">声音代理辅助器数量。</param>
  205. /// <returns>是否增加声音组成功。</returns>
  206. public bool AddSoundGroup(string soundGroupName, int soundAgentHelperCount)
  207. {
  208. return AddSoundGroup(soundGroupName, false, false, 1f, soundAgentHelperCount);
  209. }
  210. /// <summary>
  211. /// 增加声音组。
  212. /// </summary>
  213. /// <param name="soundGroupName">声音组名称。</param>
  214. /// <param name="soundGroupAvoidBeingReplacedBySamePriority">声音组中的声音是否避免被同优先级声音替换。</param>
  215. /// <param name="soundGroupMute">声音组是否静音。</param>
  216. /// <param name="soundGroupVolume">声音组音量。</param>
  217. /// <param name="soundAgentHelperCount">声音代理辅助器数量。</param>
  218. /// <returns>是否增加声音组成功。</returns>
  219. public bool AddSoundGroup(string soundGroupName, bool soundGroupAvoidBeingReplacedBySamePriority, bool soundGroupMute, float soundGroupVolume, int soundAgentHelperCount)
  220. {
  221. if (m_SoundManager.HasSoundGroup(soundGroupName))
  222. {
  223. return false;
  224. }
  225. SoundGroupHelperBase soundGroupHelper = Helper.CreateHelper(m_SoundGroupHelperTypeName, m_CustomSoundGroupHelper, SoundGroupCount);
  226. if (soundGroupHelper == null)
  227. {
  228. Log.Error("Can not create sound group helper.");
  229. return false;
  230. }
  231. soundGroupHelper.name = Utility.Text.Format("Sound Group - {0}", soundGroupName);
  232. Transform transform = soundGroupHelper.transform;
  233. transform.SetParent(m_InstanceRoot);
  234. transform.localScale = Vector3.one;
  235. if (m_AudioMixer != null)
  236. {
  237. AudioMixerGroup[] audioMixerGroups = m_AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}", soundGroupName));
  238. if (audioMixerGroups.Length > 0)
  239. {
  240. soundGroupHelper.AudioMixerGroup = audioMixerGroups[0];
  241. }
  242. else
  243. {
  244. soundGroupHelper.AudioMixerGroup = m_AudioMixer.FindMatchingGroups("Master")[0];
  245. }
  246. }
  247. if (!m_SoundManager.AddSoundGroup(soundGroupName, soundGroupAvoidBeingReplacedBySamePriority, soundGroupMute, soundGroupVolume, soundGroupHelper))
  248. {
  249. return false;
  250. }
  251. for (int i = 0; i < soundAgentHelperCount; i++)
  252. {
  253. if (!AddSoundAgentHelper(soundGroupName, soundGroupHelper, i))
  254. {
  255. return false;
  256. }
  257. }
  258. return true;
  259. }
  260. /// <summary>
  261. /// 获取所有正在加载声音的序列编号。
  262. /// </summary>
  263. /// <returns>所有正在加载声音的序列编号。</returns>
  264. public int[] GetAllLoadingSoundSerialIds()
  265. {
  266. return m_SoundManager.GetAllLoadingSoundSerialIds();
  267. }
  268. /// <summary>
  269. /// 获取所有正在加载声音的序列编号。
  270. /// </summary>
  271. /// <param name="results">所有正在加载声音的序列编号。</param>
  272. public void GetAllLoadingSoundSerialIds(List<int> results)
  273. {
  274. m_SoundManager.GetAllLoadingSoundSerialIds(results);
  275. }
  276. /// <summary>
  277. /// 是否正在加载声音。
  278. /// </summary>
  279. /// <param name="serialId">声音序列编号。</param>
  280. /// <returns>是否正在加载声音。</returns>
  281. public bool IsLoadingSound(int serialId)
  282. {
  283. return m_SoundManager.IsLoadingSound(serialId);
  284. }
  285. /// <summary>
  286. /// 播放声音。
  287. /// </summary>
  288. /// <param name="soundAssetName">声音资源名称。</param>
  289. /// <param name="soundGroupName">声音组名称。</param>
  290. /// <returns>声音的序列编号。</returns>
  291. public int PlaySound(string soundAssetName, string soundGroupName)
  292. {
  293. return PlaySound(soundAssetName, soundGroupName, DefaultPriority, null, null, null);
  294. }
  295. /// <summary>
  296. /// 播放声音。
  297. /// </summary>
  298. /// <param name="soundAssetName">声音资源名称。</param>
  299. /// <param name="soundGroupName">声音组名称。</param>
  300. /// <param name="priority">加载声音资源的优先级。</param>
  301. /// <returns>声音的序列编号。</returns>
  302. public int PlaySound(string soundAssetName, string soundGroupName, int priority)
  303. {
  304. return PlaySound(soundAssetName, soundGroupName, priority, null, null, null);
  305. }
  306. /// <summary>
  307. /// 播放声音。
  308. /// </summary>
  309. /// <param name="soundAssetName">声音资源名称。</param>
  310. /// <param name="soundGroupName">声音组名称。</param>
  311. /// <param name="playSoundParams">播放声音参数。</param>
  312. /// <returns>声音的序列编号。</returns>
  313. public int PlaySound(string soundAssetName, string soundGroupName, PlaySoundParams playSoundParams)
  314. {
  315. return PlaySound(soundAssetName, soundGroupName, DefaultPriority, playSoundParams, null, null);
  316. }
  317. /// <summary>
  318. /// 播放声音。
  319. /// </summary>
  320. /// <param name="soundAssetName">声音资源名称。</param>
  321. /// <param name="soundGroupName">声音组名称。</param>
  322. /// <param name="bindingEntity">声音绑定的实体。</param>
  323. /// <returns>声音的序列编号。</returns>
  324. public int PlaySound(string soundAssetName, string soundGroupName, Entity bindingEntity)
  325. {
  326. return PlaySound(soundAssetName, soundGroupName, DefaultPriority, null, bindingEntity, null);
  327. }
  328. /// <summary>
  329. /// 播放声音。
  330. /// </summary>
  331. /// <param name="soundAssetName">声音资源名称。</param>
  332. /// <param name="soundGroupName">声音组名称。</param>
  333. /// <param name="worldPosition">声音所在的世界坐标。</param>
  334. /// <returns>声音的序列编号。</returns>
  335. public int PlaySound(string soundAssetName, string soundGroupName, Vector3 worldPosition)
  336. {
  337. return PlaySound(soundAssetName, soundGroupName, DefaultPriority, null, worldPosition, null);
  338. }
  339. /// <summary>
  340. /// 播放声音。
  341. /// </summary>
  342. /// <param name="soundAssetName">声音资源名称。</param>
  343. /// <param name="soundGroupName">声音组名称。</param>
  344. /// <param name="userData">用户自定义数据。</param>
  345. /// <returns>声音的序列编号。</returns>
  346. public int PlaySound(string soundAssetName, string soundGroupName, object userData)
  347. {
  348. return PlaySound(soundAssetName, soundGroupName, DefaultPriority, null, null, userData);
  349. }
  350. /// <summary>
  351. /// 播放声音。
  352. /// </summary>
  353. /// <param name="soundAssetName">声音资源名称。</param>
  354. /// <param name="soundGroupName">声音组名称。</param>
  355. /// <param name="priority">加载声音资源的优先级。</param>
  356. /// <param name="playSoundParams">播放声音参数。</param>
  357. /// <returns>声音的序列编号。</returns>
  358. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams)
  359. {
  360. return PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, null, null);
  361. }
  362. /// <summary>
  363. /// 播放声音。
  364. /// </summary>
  365. /// <param name="soundAssetName">声音资源名称。</param>
  366. /// <param name="soundGroupName">声音组名称。</param>
  367. /// <param name="priority">加载声音资源的优先级。</param>
  368. /// <param name="playSoundParams">播放声音参数。</param>
  369. /// <param name="userData">用户自定义数据。</param>
  370. /// <returns>声音的序列编号。</returns>
  371. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams, object userData)
  372. {
  373. return PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, null, userData);
  374. }
  375. /// <summary>
  376. /// 播放声音。
  377. /// </summary>
  378. /// <param name="soundAssetName">声音资源名称。</param>
  379. /// <param name="soundGroupName">声音组名称。</param>
  380. /// <param name="priority">加载声音资源的优先级。</param>
  381. /// <param name="playSoundParams">播放声音参数。</param>
  382. /// <param name="bindingEntity">声音绑定的实体。</param>
  383. /// <returns>声音的序列编号。</returns>
  384. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams, Entity bindingEntity)
  385. {
  386. return PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, bindingEntity, null);
  387. }
  388. /// <summary>
  389. /// 播放声音。
  390. /// </summary>
  391. /// <param name="soundAssetName">声音资源名称。</param>
  392. /// <param name="soundGroupName">声音组名称。</param>
  393. /// <param name="priority">加载声音资源的优先级。</param>
  394. /// <param name="playSoundParams">播放声音参数。</param>
  395. /// <param name="bindingEntity">声音绑定的实体。</param>
  396. /// <param name="userData">用户自定义数据。</param>
  397. /// <returns>声音的序列编号。</returns>
  398. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams, Entity bindingEntity, object userData)
  399. {
  400. return m_SoundManager.PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, PlaySoundInfo.Create(bindingEntity, Vector3.zero, userData));
  401. }
  402. /// <summary>
  403. /// 播放声音。
  404. /// </summary>
  405. /// <param name="soundAssetName">声音资源名称。</param>
  406. /// <param name="soundGroupName">声音组名称。</param>
  407. /// <param name="priority">加载声音资源的优先级。</param>
  408. /// <param name="playSoundParams">播放声音参数。</param>
  409. /// <param name="worldPosition">声音所在的世界坐标。</param>
  410. /// <returns>声音的序列编号。</returns>
  411. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams, Vector3 worldPosition)
  412. {
  413. return PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, worldPosition, null);
  414. }
  415. /// <summary>
  416. /// 播放声音。
  417. /// </summary>
  418. /// <param name="soundAssetName">声音资源名称。</param>
  419. /// <param name="soundGroupName">声音组名称。</param>
  420. /// <param name="priority">加载声音资源的优先级。</param>
  421. /// <param name="playSoundParams">播放声音参数。</param>
  422. /// <param name="worldPosition">声音所在的世界坐标。</param>
  423. /// <param name="userData">用户自定义数据。</param>
  424. /// <returns>声音的序列编号。</returns>
  425. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams, Vector3 worldPosition, object userData)
  426. {
  427. return m_SoundManager.PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, PlaySoundInfo.Create(null, worldPosition, userData));
  428. }
  429. /// <summary>
  430. /// 停止播放声音。
  431. /// </summary>
  432. /// <param name="serialId">要停止播放声音的序列编号。</param>
  433. /// <returns>是否停止播放声音成功。</returns>
  434. public bool StopSound(int serialId)
  435. {
  436. return m_SoundManager.StopSound(serialId);
  437. }
  438. /// <summary>
  439. /// 停止播放声音。
  440. /// </summary>
  441. /// <param name="serialId">要停止播放声音的序列编号。</param>
  442. /// <param name="fadeOutSeconds">声音淡出时间,以秒为单位。</param>
  443. /// <returns>是否停止播放声音成功。</returns>
  444. public bool StopSound(int serialId, float fadeOutSeconds)
  445. {
  446. return m_SoundManager.StopSound(serialId, fadeOutSeconds);
  447. }
  448. /// <summary>
  449. /// 停止所有已加载的声音。
  450. /// </summary>
  451. public void StopAllLoadedSounds()
  452. {
  453. m_SoundManager.StopAllLoadedSounds();
  454. }
  455. /// <summary>
  456. /// 停止所有已加载的声音。
  457. /// </summary>
  458. /// <param name="fadeOutSeconds">声音淡出时间,以秒为单位。</param>
  459. public void StopAllLoadedSounds(float fadeOutSeconds)
  460. {
  461. m_SoundManager.StopAllLoadedSounds(fadeOutSeconds);
  462. }
  463. /// <summary>
  464. /// 停止所有正在加载的声音。
  465. /// </summary>
  466. public void StopAllLoadingSounds()
  467. {
  468. m_SoundManager.StopAllLoadingSounds();
  469. }
  470. /// <summary>
  471. /// 暂停播放声音。
  472. /// </summary>
  473. /// <param name="serialId">要暂停播放声音的序列编号。</param>
  474. public void PauseSound(int serialId)
  475. {
  476. m_SoundManager.PauseSound(serialId);
  477. }
  478. /// <summary>
  479. /// 暂停播放声音。
  480. /// </summary>
  481. /// <param name="serialId">要暂停播放声音的序列编号。</param>
  482. /// <param name="fadeOutSeconds">声音淡出时间,以秒为单位。</param>
  483. public void PauseSound(int serialId, float fadeOutSeconds)
  484. {
  485. m_SoundManager.PauseSound(serialId, fadeOutSeconds);
  486. }
  487. /// <summary>
  488. /// 恢复播放声音。
  489. /// </summary>
  490. /// <param name="serialId">要恢复播放声音的序列编号。</param>
  491. public void ResumeSound(int serialId)
  492. {
  493. m_SoundManager.ResumeSound(serialId);
  494. }
  495. /// <summary>
  496. /// 恢复播放声音。
  497. /// </summary>
  498. /// <param name="serialId">要恢复播放声音的序列编号。</param>
  499. /// <param name="fadeInSeconds">声音淡入时间,以秒为单位。</param>
  500. public void ResumeSound(int serialId, float fadeInSeconds)
  501. {
  502. m_SoundManager.ResumeSound(serialId, fadeInSeconds);
  503. }
  504. /// <summary>
  505. /// 增加声音代理辅助器。
  506. /// </summary>
  507. /// <param name="soundGroupName">声音组名称。</param>
  508. /// <param name="soundGroupHelper">声音组辅助器。</param>
  509. /// <param name="index">声音代理辅助器索引。</param>
  510. /// <returns>是否增加声音代理辅助器成功。</returns>
  511. private bool AddSoundAgentHelper(string soundGroupName, SoundGroupHelperBase soundGroupHelper, int index)
  512. {
  513. SoundAgentHelperBase soundAgentHelper = Helper.CreateHelper(m_SoundAgentHelperTypeName, m_CustomSoundAgentHelper, index);
  514. if (soundAgentHelper == null)
  515. {
  516. Log.Error("Can not create sound agent helper.");
  517. return false;
  518. }
  519. soundAgentHelper.name = Utility.Text.Format("Sound Agent Helper - {0} - {1}", soundGroupName, index.ToString());
  520. Transform transform = soundAgentHelper.transform;
  521. transform.SetParent(soundGroupHelper.transform);
  522. transform.localScale = Vector3.one;
  523. if (m_AudioMixer != null)
  524. {
  525. AudioMixerGroup[] audioMixerGroups = m_AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", soundGroupName, index.ToString()));
  526. if (audioMixerGroups.Length > 0)
  527. {
  528. soundAgentHelper.AudioMixerGroup = audioMixerGroups[0];
  529. }
  530. else
  531. {
  532. soundAgentHelper.AudioMixerGroup = soundGroupHelper.AudioMixerGroup;
  533. }
  534. }
  535. m_SoundManager.AddSoundAgentHelper(soundGroupName, soundAgentHelper);
  536. return true;
  537. }
  538. private void OnPlaySoundSuccess(object sender, GameFramework.Sound.PlaySoundSuccessEventArgs e)
  539. {
  540. PlaySoundInfo playSoundInfo = (PlaySoundInfo)e.UserData;
  541. if (playSoundInfo != null)
  542. {
  543. SoundAgentHelperBase soundAgentHelper = (SoundAgentHelperBase)e.SoundAgent.Helper;
  544. if (playSoundInfo.BindingEntity != null)
  545. {
  546. soundAgentHelper.SetBindingEntity(playSoundInfo.BindingEntity);
  547. }
  548. else
  549. {
  550. soundAgentHelper.SetWorldPosition(playSoundInfo.WorldPosition);
  551. }
  552. }
  553. m_EventComponent.Fire(this, PlaySoundSuccessEventArgs.Create(e));
  554. }
  555. private void OnPlaySoundFailure(object sender, GameFramework.Sound.PlaySoundFailureEventArgs e)
  556. {
  557. string logMessage = Utility.Text.Format("Play sound failure, asset name '{0}', sound group name '{1}', error code '{2}', error message '{3}'.", e.SoundAssetName, e.SoundGroupName, e.ErrorCode.ToString(), e.ErrorMessage);
  558. if (e.ErrorCode == PlaySoundErrorCode.IgnoredDueToLowPriority)
  559. {
  560. Log.Info(logMessage);
  561. }
  562. else
  563. {
  564. Log.Warning(logMessage);
  565. }
  566. m_EventComponent.Fire(this, PlaySoundFailureEventArgs.Create(e));
  567. }
  568. private void OnPlaySoundUpdate(object sender, GameFramework.Sound.PlaySoundUpdateEventArgs e)
  569. {
  570. m_EventComponent.Fire(this, PlaySoundUpdateEventArgs.Create(e));
  571. }
  572. private void OnPlaySoundDependencyAsset(object sender, GameFramework.Sound.PlaySoundDependencyAssetEventArgs e)
  573. {
  574. m_EventComponent.Fire(this, PlaySoundDependencyAssetEventArgs.Create(e));
  575. }
  576. private void OnLoadSceneSuccess(object sender, GameFramework.Scene.LoadSceneSuccessEventArgs e)
  577. {
  578. RefreshAudioListener();
  579. }
  580. private void OnLoadSceneFailure(object sender, GameFramework.Scene.LoadSceneFailureEventArgs e)
  581. {
  582. RefreshAudioListener();
  583. }
  584. private void OnUnloadSceneSuccess(object sender, GameFramework.Scene.UnloadSceneSuccessEventArgs e)
  585. {
  586. RefreshAudioListener();
  587. }
  588. private void OnUnloadSceneFailure(object sender, GameFramework.Scene.UnloadSceneFailureEventArgs e)
  589. {
  590. RefreshAudioListener();
  591. }
  592. private void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode)
  593. {
  594. RefreshAudioListener();
  595. }
  596. private void OnSceneUnloaded(Scene scene)
  597. {
  598. RefreshAudioListener();
  599. }
  600. private void RefreshAudioListener()
  601. {
  602. m_AudioListener.enabled = FindObjectsOfType<AudioListener>().Length <= 1;
  603. }
  604. }
  605. }