#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using Debug = UnityEngine.Debug;
///
/// Build scripts used for player builds and running with bundles in the editor.
///
[CreateAssetMenu(fileName = "CustomBuild.asset", menuName = "Addressables/Content Builders/Custom Build Script")]
public class CustomBuildScript : BuildScriptPackedMode
{
Dictionary m_SavedIncludeInBuildState = new Dictionary();
AddressableAssetGroup m_CurrentSceneGroup;
///
public override string Name
{
get { return "Custom Build Script"; }
}
///
protected override TResult BuildDataImplementation(AddressablesDataBuilderInput builderInput)
{
TResult result;
var timer = new Stopwatch();
timer.Start();
try
{
CreateCurrentSceneOnlyBuildSetup(builderInput.AddressableSettings);
result = base.BuildDataImplementation(builderInput);
}
finally
{
RevertCurrentSceneSetup(builderInput.AddressableSettings);
}
if (result != null)
result.Duration = timer.Elapsed.TotalSeconds;
return result;
}
void CreateCurrentSceneOnlyBuildSetup(AddressableAssetSettings settings)
{
Debug.Log("HERE");
Debug.LogError(SceneManager.GetActiveScene().name);
if (SceneManager.GetActiveScene().name == "customscene")
{
throw new Exception(
"please make sure that a scene other than the customscene is currently open and make sure it doesn't have any Addressable dependencies");
}
foreach (var group in settings.groups)
{
if (!group)
continue;
var schema = group.GetSchema();
if (!schema)
continue;
m_SavedIncludeInBuildState.Add(group, schema.IncludeInBuild);
schema.IncludeInBuild = false;
}
m_CurrentSceneGroup = settings.CreateGroup("TempCurrentSceneGroup", false, false, true,
new List(), typeof(BundledAssetGroupSchema));
var sceneEntry = settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(SceneManager.GetActiveScene().path), m_CurrentSceneGroup);
settings.SetDirty(AddressableAssetSettings.ModificationEvent.BatchModification, null, true, true);
AssetDatabase.SaveAssets();
//Setup bootstrap scene
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
GameObject go = new GameObject("Bootstrapper");
go.AddComponent().SceneKey = sceneEntry.address;
string dir = "Assets/TempCustomBuildScene";
Directory.CreateDirectory(dir);
EditorSceneManager.SaveScene(scene, $"{dir}/customscene.unity");
}
void RevertCurrentSceneSetup(AddressableAssetSettings settings)
{
foreach (var group in settings.groups)
{
if (!group)
continue;
var schema = group.GetSchema();
if (!schema || !m_SavedIncludeInBuildState.ContainsKey(group))
continue;
schema.IncludeInBuild = m_SavedIncludeInBuildState[group];
}
m_SavedIncludeInBuildState.Clear();
settings.RemoveGroup(m_CurrentSceneGroup);
m_CurrentSceneGroup = null;
}
}
#endif