Skip to content

Commit 82ec5c1

Browse files
committed
WG-61373, WG-61722, WG-61085, WG-62149, WG-61083, WG-62390, WG-60486, WG-62690, WG-62633, : Fixes for 22.1.0
Change-Id: I8b66cdb9a67c0c293c15b0d329c38569300606df
1 parent 90e4ec2 commit 82ec5c1

11 files changed

Lines changed: 296 additions & 105 deletions

Editor/AK.Wwise.Unity.Addressables.Editor.asmdef

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"name": "AK.Wwise.Unity.Addressables.Editor",
3+
"rootNamespace": "",
34
"references": [
45
"AK.Wwise.Unity.MonoBehaviour.Editor",
56
"Unity.Addressables.Editor",
@@ -8,7 +9,8 @@
89
"Unity.ResourceManager",
910
"Unity.ScriptableBuildPipeline",
1011
"AK.Wwise.Unity.API",
11-
"AK.Wwise.Unity.Addressables"
12+
"AK.Wwise.Unity.Addressables",
13+
"AK.Wwise.Unity.API.WwiseTypes"
1214
],
1315
"includePlatforms": [
1416
"Editor"
@@ -18,7 +20,7 @@
1820
"overrideReferences": false,
1921
"precompiledReferences": [],
2022
"autoReferenced": true,
21-
"defineConstraints": [],
23+
"defineConstraints": [ "!UNITY_SERVER" ],
2224
"versionDefines": [
2325
{
2426
"name": "com.unity.addressables",

Editor/AkAddressablesEditorUtilities.cs

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ public static void ParseAssetPath(string assetPath, out string platform, out str
4747
platform = string.Empty;
4848
language = "SFX";
4949

50-
var banksPath = $"{GetSoundbanksPath()}/";
51-
var assetRelPath = assetPath.Replace(banksPath, "");
50+
var banksPath = GetFullSoundbanksPath() + Path.DirectorySeparatorChar;
51+
var assetsFullPath = Path.GetFullPath(assetPath);
5252

53-
string[] parts = assetRelPath.Split('/');
53+
// TODO Use Path.RelativePath as soon as Unity uses a .NET version that includes it (i.e 2021.3)
54+
var assetRelPath = assetsFullPath.Replace(banksPath, "");
55+
56+
string[] parts = assetRelPath.Split(Path.DirectorySeparatorChar);
5457
platform = parts[0];
5558

5659
if (parts.Length > 2)
@@ -90,6 +93,18 @@ public static string GetSoundbanksPath()
9093
return path.Replace("\\", "/");
9194
}
9295

96+
private static string GetFullSoundbanksPath()
97+
{
98+
if (AkWwiseEditorSettings.Instance.GeneratedSoundbanksPath == null)
99+
{
100+
UnityEngine.Debug.LogError("Wwise Addressables: You need to set the GeneratedSoundbankPath in the Wwise Editor settings or assets will not be properly imported.");
101+
return string.Empty;
102+
}
103+
var path = Path.Combine("Assets", AkWwiseEditorSettings.Instance.GeneratedSoundbanksPath);
104+
return Path.GetFullPath(path);
105+
}
106+
107+
93108
public static void ClearSoundbankInfo()
94109
{
95110
soundbanksInfo.Clear();
@@ -145,7 +160,17 @@ public static PlatformEntry ParsePlatformSoundbanksXML(string platformName, stri
145160
if (doParse)
146161
{
147162
var doc = new System.Xml.XmlDocument();
148-
doc.Load(xmlFilename);
163+
PlatformEntry soundBanks;
164+
165+
try
166+
{
167+
doc.Load(xmlFilename);
168+
}
169+
catch (XmlException e)
170+
{
171+
UnityEngine.Debug.LogError("Exception occurred while parsing SoundBanksInfo.xml. Cannot update project SoundBanks info: " + e);
172+
return null;
173+
}
149174

150175
XmlElement root = doc.DocumentElement;
151176
if (!Int32.TryParse(root.GetAttribute("SchemaVersion"), out int schemaVersion))
@@ -154,7 +179,6 @@ public static PlatformEntry ParsePlatformSoundbanksXML(string platformName, stri
154179
return null;
155180
}
156181

157-
PlatformEntry soundBanks;
158182
if (schemaVersion >= 16)
159183
{
160184
soundBanks = ParseSoundBanksInfoXmlv16(doc);
@@ -166,6 +190,12 @@ public static PlatformEntry ParsePlatformSoundbanksXML(string platformName, stri
166190
soundBanks.lastParseTime = DateTime.Now.Ticks;
167191
soundbanksInfo[platformName] = soundBanks;
168192
}
193+
194+
if (soundbanksInfo[platformName].eventToSoundBankMap.Count == 0)
195+
{
196+
Debug.LogWarning($"Could not retrieve event data for {platformName} from SoundBanksInfo.xml. Check {xmlFilename} for possible corruption.");
197+
}
198+
169199
return soundbanksInfo[platformName];
170200
}
171201

@@ -275,11 +305,26 @@ private static PlatformEntry ParseSoundBanksInfoXmlv15(XmlDocument doc)
275305

276306
public static void FindAndSetBankReference(WwiseAddressableSoundBank addressableBankAsset, string name)
277307
{
278-
System.Reflection.Assembly[] assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
308+
WwiseBankReference.FindBankReferenceAndSetAddressableBank(addressableBankAsset, name);
309+
}
279310

280-
var assembly = Assembly.Load("AK.Wwise.Unity.API.WwiseTypes");
281-
var AkBankReferenceType = assembly.GetType("WwiseBankReference");
282-
bool success = (bool)AkBankReferenceType.GetMethod("FindBankReferenceAndSetAddressableBank").Invoke(null, new object[] { addressableBankAsset, name });
311+
public static void EnsureInitBankAssetCreated()
312+
{
313+
var guids = UnityEditor.AssetDatabase.FindAssets("t:" + typeof(WwiseInitBankReference).Name, new string[] { AkWwiseEditorSettings.WwiseScriptableObjectRelativePath });
314+
var InitBankAssetPath = Path.Combine(AkWwiseEditorSettings.WwiseScriptableObjectRelativePath, "InitBank.asset");
315+
if (guids.Length == 0)
316+
{
317+
try
318+
{
319+
AssetDatabase.StartAssetEditing();
320+
WwiseInitBankReference InitBankRef = UnityEngine.ScriptableObject.CreateInstance<WwiseInitBankReference>();
321+
UnityEditor.AssetDatabase.CreateAsset(InitBankRef, InitBankAssetPath);
322+
}
323+
finally
324+
{
325+
AssetDatabase.StopAssetEditing();
326+
}
327+
}
283328
}
284329

285330
private static void RecordEvent(PlatformEntry soundBanks, string bankName, string language, string eventName)

Editor/WwiseAssetImportProcessors.cs

Lines changed: 69 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,20 @@ internal static void AddBankReferenceToAddressableBankAsset(ConcurrentDictionary
165165
var results = AssetDatabase.FindAssets(string.Format("{0} t:{1}", name, nameof(WwiseAddressableSoundBank)));
166166
if (results.Length > 0)
167167
{
168-
string addressableBankGuid = results.First();
169-
string addressableBankPath = AssetDatabase.GUIDToAssetPath(addressableBankGuid);
170-
addressableBankAsset = AssetDatabase.LoadAssetAtPath<WwiseAddressableSoundBank>(addressableBankPath);
168+
foreach (var addressableBankGuid in results)
169+
{
170+
string addressableBankPath = AssetDatabase.GUIDToAssetPath(addressableBankGuid);
171+
var assetName = Path.GetFileNameWithoutExtension(addressableBankPath);
172+
if (assetName == name)
173+
{
174+
addressableBankAsset = AssetDatabase.LoadAssetAtPath<WwiseAddressableSoundBank>(addressableBankPath);
175+
}
176+
}
177+
}
178+
179+
if (name == "Init")
180+
{
181+
AkAddressablesEditorUtilities.EnsureInitBankAssetCreated();
171182
}
172183

173184
string addressableBankAssetDirectory = AkAssetUtilities.GetSoundbanksPath();
@@ -197,42 +208,13 @@ internal static void AddBankReferenceToAddressableBankAsset(ConcurrentDictionary
197208
}
198209
addressableBankAsset = ScriptableObject.CreateInstance<WwiseAddressableSoundBank>();
199210
itemsToCreate.Add(new CreateAssetEntry { Asset = addressableBankAsset, Path = addressableBankAssetPath, Name = name });
200-
201211
}
202212
else
203213
{
204214
UpdateAddressableBankReference(addressableBankAsset, name);
205215
}
206216

207217
addressableAssetCache.AddOrUpdate(name, addressableBankAsset, (key, oldValue) => addressableBankAsset);
208-
209-
if (name == "Init")
210-
{
211-
var wwiseGlobablGameObject = GameObject.Find("WwiseGlobal");
212-
InitBankHolder bankHolder;
213-
if (wwiseGlobablGameObject!= null)
214-
{
215-
bankHolder = wwiseGlobablGameObject.GetComponent<InitBankHolder>();
216-
if (bankHolder == null)
217-
{
218-
wwiseGlobablGameObject.AddComponent<InitBankHolder>();
219-
bankHolder = wwiseGlobablGameObject.GetComponent<InitBankHolder>();
220-
}
221-
bankHolder.InitBank = addressableBankAsset;
222-
}
223-
else
224-
{
225-
bankHolder = UnityEngine.Object.FindObjectOfType<InitBankHolder>();
226-
if (bankHolder != null)
227-
{
228-
bankHolder.InitBank = addressableBankAsset;
229-
}
230-
else
231-
{
232-
Debug.Log("Could not find or create the InitBankHolder, you will have to add one to the WwiseGlobal object in your scene and ensure it references the Init bank.");
233-
}
234-
}
235-
}
236218
}
237219

238220
if (!string.IsNullOrEmpty(platform))
@@ -256,19 +238,26 @@ internal static void AddBankReferenceToAddressableBankAsset(ConcurrentDictionary
256238
{
257239
if (itemsToCreate.Count > 0)
258240
{
259-
AssetDatabase.StartAssetEditing();
260-
foreach (var entry in itemsToCreate)
241+
try
261242
{
262-
AssetDatabase.CreateAsset(entry.Asset, entry.Path);
263-
UpdateAddressableBankReference(entry.Asset, entry.Name);
243+
AssetDatabase.StartAssetEditing();
244+
foreach (var entry in itemsToCreate)
245+
{
246+
AssetDatabase.CreateAsset(entry.Asset, entry.Path);
247+
UpdateAddressableBankReference(entry.Asset, entry.Name);
248+
}
249+
}
250+
finally
251+
{
252+
AssetDatabase.StopAssetEditing();
264253
}
265-
AssetDatabase.StopAssetEditing();
266254
}
267255

268256
AssetDatabase.SaveAssets();
269257
AssetDatabase.Refresh();
270258
}
271259
}
260+
272261
internal static void UpdateAddressableBankReference(WwiseAddressableSoundBank asset, string bankName )
273262
{
274263
bool bankScriptableObjectUpdated = false;
@@ -278,15 +267,21 @@ internal static void UpdateAddressableBankReference(WwiseAddressableSoundBank as
278267
}
279268
if (!bankScriptableObjectUpdated)
280269
{
281-
AkAddressablesEditorUtilities.FindAndSetBankReference(asset, bankName);
270+
if (bankName == WwiseInitBankReference.InitBankName)
271+
{
272+
WwiseInitBankReference.FindInitBankReferenceAndSetAddressableBank(asset, bankName);
273+
}
274+
else
275+
{
276+
AkAddressablesEditorUtilities.FindAndSetBankReference(asset, bankName);
277+
}
282278
}
283279
}
284280

285281
internal static void AddStreamedAssetsToBanks(HashSet<string> streamingAssetsAdded)
286282
{
287283
try
288284
{
289-
var updatedBanks = new List<string>();
290285
foreach (var assetPath in streamingAssetsAdded)
291286
{
292287
string name = Path.GetFileNameWithoutExtension(assetPath);
@@ -297,35 +292,48 @@ internal static void AddStreamedAssetsToBanks(HashSet<string> streamingAssetsAdd
297292

298293
var soundbankInfos = AkAddressablesEditorUtilities.ParsePlatformSoundbanksXML(platform, name);
299294

300-
var bankNames = soundbankInfos.eventToSoundBankMap[name];
301-
foreach (var bankName in bankNames)
295+
if (soundbankInfos.eventToSoundBankMap.TryGetValue(name, out var bankNames))
302296
{
303-
string bankAssetDir = Path.GetDirectoryName(assetPath);
304-
string addressableBankAssetDir = AkAssetUtilities.GetSoundbanksPath();
305-
string addressableBankAssetPath = System.IO.Path.Combine(addressableBankAssetDir, bankName + ".asset");
306-
var bankAsset = AssetDatabase.LoadAssetAtPath<WwiseAddressableSoundBank>(addressableBankAssetPath);
307-
308-
if (bankAsset == null)
309-
{
310-
continue;
311-
}
312-
313-
if (!string.IsNullOrEmpty(platform))
297+
foreach (var bankName in bankNames)
314298
{
315-
if (!soundbankInfos[bankName].TryGetValue(language, out AkAddressablesEditorUtilities.SoundBankInfo sbInfo))
299+
string bankAssetDir = Path.GetDirectoryName(assetPath);
300+
string addressableBankAssetDir = AkAssetUtilities.GetSoundbanksPath();
301+
string addressableBankAssetPath =
302+
System.IO.Path.Combine(addressableBankAssetDir, bankName + ".asset");
303+
var bankAsset =
304+
AssetDatabase.LoadAssetAtPath<WwiseAddressableSoundBank>(addressableBankAssetPath);
305+
306+
if (bankAsset == null)
316307
{
317-
if (int.TryParse(language, out int result))
318-
UnityEngine.Debug.LogError("Wwise Unity Addressables: Sub-folders for generated files currently not supported. Please turn off the option in Wwise under Project Settings -> SoundBanks");
319-
else
320-
UnityEngine.Debug.LogError($"Wwise Unity Addressables: Unable to process asset at path {assetPath}: Unrecognized language {language}");
321308
continue;
322309
}
323-
List<string> MediaIds = sbInfo.streamedFileIds;
324-
bankAsset.UpdateLocalizationLanguages(platform, soundbankInfos[bankName].Keys.ToList());
325-
bankAsset.SetStreamingMedia(platform, language, bankAssetDir, MediaIds);
326-
EditorUtility.SetDirty(bankAsset);
310+
311+
if (!string.IsNullOrEmpty(platform))
312+
{
313+
if (!soundbankInfos[bankName].TryGetValue(language,
314+
out AkAddressablesEditorUtilities.SoundBankInfo sbInfo))
315+
{
316+
if (int.TryParse(language, out int result))
317+
UnityEngine.Debug.LogError(
318+
"Wwise Unity Addressables: Sub-folders for generated files currently not supported. Please turn off the option in Wwise under Project Settings -> SoundBanks");
319+
else
320+
UnityEngine.Debug.LogError(
321+
$"Wwise Unity Addressables: Unable to process asset at path {assetPath}: Unrecognized language {language}");
322+
continue;
323+
}
324+
325+
List<string> MediaIds = sbInfo.streamedFileIds;
326+
bankAsset.UpdateLocalizationLanguages(platform, soundbankInfos[bankName].Keys.ToList());
327+
bankAsset.SetStreamingMedia(platform, language, bankAssetDir, MediaIds);
328+
EditorUtility.SetDirty(bankAsset);
329+
}
327330
}
328331
}
332+
else
333+
{
334+
UnityEngine.Debug.LogWarning(
335+
$"Wwise Unity Addressables: Can't find containing SoundBank(s) for event {name}");
336+
}
329337
}
330338
}
331339
finally

Editor/WwiseBankImporter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,18 @@ public override void OnImportAsset(AssetImportContext ctx)
2626

2727
if (platform == null)
2828
{
29+
Debug.LogWarning($"Skipping {ctx.assetPath} as its platform couldn't be determined. Make sure it is placed in the appropriate platform folder.");
2930
return;
3031
}
3132

3233
var soundbankInfos = AkAddressablesEditorUtilities.ParsePlatformSoundbanksXML(platform, assetName);
3334

35+
if (soundbankInfos == null)
36+
{
37+
Debug.LogWarning($"Skipping {ctx.assetPath}. SoundbanksInfo.xml could not be parsed.");
38+
return;
39+
}
40+
3441
if (!soundbankInfos.ContainsKey(assetName))
3542
{
3643
Debug.LogWarning($"Skipping {ctx.assetPath} as it was not parsed in SoundbanksInfo.xml. Perhaps this bank no longer exists in the wwise project?");

Runtime/AK.Wwise.Unity.Addressables.asmdef

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"overrideReferences": false,
1313
"precompiledReferences": [],
1414
"autoReferenced": true,
15-
"defineConstraints": [],
15+
"defineConstraints": [ "!UNITY_SERVER" ],
1616
"versionDefines": [
1717
{
1818
"name": "com.unity.addressables",

0 commit comments

Comments
 (0)