public static void CopyToStreamingAssets() { if (string.IsNullOrEmpty(Settings.Instance.SourceBankPath)) { return; } Platform platform = Settings.Instance.CurrentEditorPlatform; if (platform == Settings.Instance.DefaultPlatform) { Debug.LogWarningFormat("FMOD Studio: copy banks for platform {0} : Unsupported platform", EditorUserBuildSettings.activeBuildTarget); return; } string bankTargetFolder = Settings.Instance.ImportType == ImportType.StreamingAssets ? Settings.Instance.TargetPath : Application.dataPath + (string.IsNullOrEmpty(Settings.Instance.TargetAssetPath) ? "" : '/' + Settings.Instance.TargetAssetPath); bankTargetFolder = RuntimeUtils.GetCommonPlatformPath(bankTargetFolder); Directory.CreateDirectory(bankTargetFolder); string bankTargetExtension = Settings.Instance.ImportType == ImportType.StreamingAssets ? ".bank" : ".bytes"; string bankSourceFolder = Settings.Instance.HasPlatforms ? Settings.Instance.SourceBankPath + '/' + platform.BuildDirectory : Settings.Instance.SourceBankPath; bankSourceFolder = RuntimeUtils.GetCommonPlatformPath(bankSourceFolder); if (Path.GetFullPath(bankTargetFolder).TrimEnd('/').ToUpperInvariant() == Path.GetFullPath(bankSourceFolder).TrimEnd('/').ToUpperInvariant()) { return; } bool madeChanges = false; if (removeBanks) { string oldBankTargetFolder = Settings.Instance.ImportType == ImportType.AssetBundle ? Settings.Instance.TargetPath : Application.dataPath + "/" + Settings.Instance.TargetAssetPath; RemoveBanks(oldBankTargetFolder); madeChanges = true; } try { // Clean out any stale .bank files string[] existingBankFiles = Directory.GetFiles(bankTargetFolder, "*" + bankTargetExtension, SearchOption.AllDirectories); foreach (string bankFilePath in existingBankFiles) { string bankName = EditorBankRef.CalculateName(bankFilePath, bankTargetFolder); if (!eventCache.EditorBanks.Exists(x => x.Name == bankName)) { string assetPath = bankFilePath.Replace(Application.dataPath, AssetsFolderName); if (AssetHasLabel(assetPath, FMODLabel)) { AssetDatabase.MoveAssetToTrash(assetPath); madeChanges = true; } } } // Copy over any files that don't match timestamp or size or don't exist foreach (var bankRef in eventCache.EditorBanks) { string sourcePath = bankSourceFolder + "/" + bankRef.Name + ".bank"; string targetPathRelative = bankRef.Name + bankTargetExtension; string targetPathFull = bankTargetFolder + "/" + targetPathRelative; FileInfo sourceInfo = new FileInfo(sourcePath); FileInfo targetInfo = new FileInfo(targetPathFull); if (!targetInfo.Exists || sourceInfo.Length != targetInfo.Length || sourceInfo.LastWriteTime != targetInfo.LastWriteTime) { if (targetInfo.Exists) { targetInfo.IsReadOnly = false; } else { EnsureFoldersExist(targetPathRelative, bankTargetFolder); } File.Copy(sourcePath, targetPathFull, true); targetInfo = new FileInfo(targetPathFull); targetInfo.IsReadOnly = false; targetInfo.LastWriteTime = sourceInfo.LastWriteTime; madeChanges = true; string assetString = targetPathFull.Replace(Application.dataPath, "Assets"); AssetDatabase.ImportAsset(assetString); UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(assetString); AssetDatabase.SetLabels(obj, new string[] { FMODLabel }); } } RemoveEmptyFMODFolders(bankTargetFolder); } catch (Exception exception) { Debug.LogErrorFormat("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2}", platform.DisplayName, bankSourceFolder, bankTargetFolder); Debug.LogException(exception); return; } if (madeChanges) { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.LogFormat("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2} succeeded", platform.DisplayName, bankSourceFolder, bankTargetFolder); } }
public static void UpdateBankStubAssets(BuildTarget buildTarget) { if (Settings.Instance.ImportType != ImportType.AssetBundle || string.IsNullOrEmpty(Settings.Instance.SourceBankPath)) { return; } Platform platform = Settings.Instance.GetPlatform(buildTarget); if (platform == Settings.Instance.DefaultPlatform) { Debug.LogWarningFormat("FMOD: Updating bank stubs: Unsupported platform {0}", buildTarget); return; } string bankTargetFolder = Application.dataPath; if (!string.IsNullOrEmpty(Settings.Instance.TargetAssetPath)) { bankTargetFolder += "/" + Settings.Instance.TargetAssetPath; } bankTargetFolder = RuntimeUtils.GetCommonPlatformPath(bankTargetFolder); string bankSourceFolder = Settings.Instance.SourceBankPath; if (Settings.Instance.HasPlatforms) { bankSourceFolder += "/" + platform.BuildDirectory; } bankSourceFolder = RuntimeUtils.GetCommonPlatformPath(bankSourceFolder); if (Path.GetFullPath(bankTargetFolder).TrimEnd('/').ToUpperInvariant() == Path.GetFullPath(bankSourceFolder).TrimEnd('/').ToUpperInvariant()) { return; } bool madeChanges = false; Directory.CreateDirectory(bankTargetFolder); try { const string BankAssetExtension = ".bytes"; // Clean out any stale stubs string[] existingBankFiles = Directory.GetFiles(bankTargetFolder, "*" + BankAssetExtension, SearchOption.AllDirectories); foreach (string bankFilePath in existingBankFiles) { string bankName = EditorBankRef.CalculateName(bankFilePath, bankTargetFolder); if (!eventCache.EditorBanks.Exists(x => x.Name == bankName)) { string assetPath = bankFilePath.Replace(Application.dataPath, AssetsFolderName); if (AssetHasLabel(assetPath, FMODLabel)) { AssetDatabase.MoveAssetToTrash(assetPath); madeChanges = true; } } } // Create any stubs that don't exist, and ensure any that do exist have the correct data foreach (var bankRef in eventCache.EditorBanks) { string sourcePath = bankSourceFolder + "/" + bankRef.Name + ".bank"; string targetPathRelative = bankRef.Name + BankAssetExtension; string targetPathFull = bankTargetFolder + "/" + targetPathRelative; EnsureFoldersExist(targetPathRelative, bankTargetFolder); FileInfo targetInfo = new FileInfo(targetPathFull); string stubData = RuntimeManager.BankStubPrefix + bankRef.Name; // Minimise asset database refreshing by only writing the stub if necessary bool writeStub; if (targetInfo.Exists && targetInfo.Length == stubData.Length) { using (StreamReader reader = targetInfo.OpenText()) { string contents = reader.ReadToEnd(); writeStub = (contents != stubData); } } else { writeStub = true; } if (writeStub) { // Create or update the stub using (StreamWriter writer = targetInfo.CreateText()) { writer.Write(stubData); } madeChanges = true; if (!targetInfo.Exists) { string assetPath = targetPathFull.Replace(Application.dataPath, "Assets"); AssetDatabase.ImportAsset(assetPath); UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(assetPath); AssetDatabase.SetLabels(obj, new string[] { FMODLabel }); } } } RemoveEmptyFMODFolders(bankTargetFolder); } catch (Exception exception) { Debug.LogErrorFormat("FMOD: Updating bank stubs in {0} to match {1}", bankTargetFolder, bankSourceFolder); Debug.LogException(exception); return; } if (madeChanges) { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.LogFormat("FMOD: Updated bank stubs in {0} to match {1}", bankTargetFolder, bankSourceFolder); } }