Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
## [0.0.16-preview] - 2018-04-04
- added BuildResult and callback for BuildScript
- added validation of instance to scene and scene to instance maps to help debug instances that change scenes and have not been updated
- added ResourceManager.RecordInstanceSceneChange() method to allow RM to track when an instance is moved to another scene
- moved variable expansion of location data to startup
  • Loading branch information
Unity Technologies committed Apr 3, 2018
1 parent 2467c96 commit b363ed6
Show file tree
Hide file tree
Showing 13 changed files with 249 additions and 121 deletions.
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ All notable changes to this package will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [0.0.15-preview] - 2018-03-28
## [0.0.16-preview] - 2018-04-04
- added BuildResult and callback for BuildScript
- added validation of instance to scene and scene to instance maps to help debug instances that change scenes and have not been updated
- added ResourceManager.RecordInstanceSceneChange() method to allow RM to track when an instance is moved to another scene
- moved variable expansion of location data to startup

## [0.0.15-preview] - 2018-03-28
- fixed scene unloading
- release all instances when a scene unloads that contains unreleased instances
- fixed overflow error in virtual mode load speeds

## [0.0.14-preview] - 2018-03-20
- Updated dependencies
Expand Down
137 changes: 73 additions & 64 deletions Editor/Build/BuildScript.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using System.Linq;
using UnityEditor.Build.Utilities;
Expand Down Expand Up @@ -30,7 +31,7 @@ public class AddressableAssetsBuildContext : IAddressableAssetsBuildContext
/// </summary>
public class BuildScript
{
static int codeVersion = 2;
static int codeVersion = 3;
[InitializeOnLoadMethod]
static void Init()
{
Expand Down Expand Up @@ -129,6 +130,7 @@ public static bool PrepareRuntimeData(bool isPlayerBuild, bool isDevBuild, bool
buildCompleted(new BuildResult() { completed = true, duration = timer.Elapsed.TotalSeconds });
return true;
}

bool validated = true;
foreach (var assetGroup in aaSettings.groups)
{
Expand All @@ -139,6 +141,7 @@ public static bool PrepareRuntimeData(bool isPlayerBuild, bool isDevBuild, bool
if (!validated)
return false;


runtimeData = new ResourceManagerRuntimeData(isPlayerBuild ? ResourceManagerRuntimeData.EditorPlayMode.PackedMode : aaSettings.buildSettings.editorPlayMode);
contentCatalog = new ResourceLocationList();
contentCatalog.labels = aaSettings.labelTable.labelNames;
Expand Down Expand Up @@ -183,48 +186,51 @@ public static bool PrepareRuntimeData(bool isPlayerBuild, bool isDevBuild, bool
{
var buildParams = new BuildParameters(buildTarget, buildTargetGroup, aaSettings.buildSettings.bundleBuildPath);
buildParams.UseCache = true;// aaSettings.buildSettings.useCache && !forceRebuild;
using (var buildCleanup = new BuildStateCleanup(buildParams.TempOutputFolder))
Directory.CreateDirectory(buildParams.TempOutputFolder);

var buildContext = new BuildContext(new BundleBuildContent(allBundleInputDefs), new Unity5PackedIdentifiers(), buildParams, dependencyData, bundleWriteData, bundleBuildResults);//, progressTracker);
buildContext.SetContextObject(new AddressableAssetsBuildContext() { m_settings = aaSettings, m_runtimeData = runtimeData, m_bundleToAssetGroup = bundleToAssetGroup, m_contentCatalog = contentCatalog });

var buildTasks = new List<IBuildTask>();
buildTasks.Add(new ProjectInCleanState());
buildTasks.Add(new ValidateBundleAssignments());
buildTasks.Add(new SwitchToBuildPlatform());
buildTasks.Add(new RebuildAtlasCache());
buildTasks.Add(new BuildPlayerScripts());
buildTasks.Add(new SetBundleSettingsTypeDB());

if (runtimeData.resourceProviderMode == ResourceManagerRuntimeData.EditorPlayMode.VirtualMode)
buildTasks.Add(new PreviewSceneDependencyData());
else
buildTasks.Add(new CalculateSceneDependencyData());

buildTasks.Add(new CalculateAssetDependencyData());
buildTasks.Add(new StripUnusedSpriteSources());
buildTasks.Add(new GenerateBundlePacking());
buildTasks.Add(new GenerateLocationListsTask());
if (runtimeData.resourceProviderMode == ResourceManagerRuntimeData.EditorPlayMode.VirtualMode)
{
buildTasks.Add(new WriteVirtualBundleDataTask());
}
else
{
var buildContext = new BuildContext(new BundleBuildContent(allBundleInputDefs), new Unity5PackedIdentifiers(), buildParams, dependencyData, bundleWriteData, bundleBuildResults);//, progressTracker);
buildContext.SetContextObject(new AddressableAssetsBuildContext() { m_settings = aaSettings, m_runtimeData = runtimeData, m_bundleToAssetGroup = bundleToAssetGroup, m_contentCatalog = contentCatalog });

var buildTasks = new List<IBuildTask>();
buildTasks.Add(new ProjectInCleanState());
buildTasks.Add(new ValidateBundleAssignments());
buildTasks.Add(new SwitchToBuildPlatform());
buildTasks.Add(new RebuildAtlasCache());
buildTasks.Add(new BuildPlayerScripts());
buildTasks.Add(new SetBundleSettingsTypeDB());

if (runtimeData.resourceProviderMode == ResourceManagerRuntimeData.EditorPlayMode.VirtualMode)
buildTasks.Add(new PreviewSceneDependencyData());
else
buildTasks.Add(new CalculateSceneDependencyData());

buildTasks.Add(new CalculateAssetDependencyData());
buildTasks.Add(new StripUnusedSpriteSources());
buildTasks.Add(new GenerateBundlePacking());
buildTasks.Add(new GenerateLocationListsTask());
if (runtimeData.resourceProviderMode == ResourceManagerRuntimeData.EditorPlayMode.VirtualMode)
{
buildTasks.Add(new WriteVirtualBundleDataTask());
}
else
{
buildTasks.Add(new GenerateBundleCommands());
buildTasks.Add(new GenerateBundleMaps());
buildTasks.Add(new WriteSerializedFiles());
buildTasks.Add(new ArchiveAndCompressBundles());
buildTasks.Add(new PostProcessBundlesTask());
}

var result = BuildTasksRunner.Run(buildTasks, buildContext);
if (result < ReturnCodes.Success)
{
if (buildCompleted != null)
buildCompleted(new BuildResult() { completed = false, duration = timer.Elapsed.TotalSeconds, error = result.ToString() });
return false;
}
buildTasks.Add(new GenerateBundleCommands());
buildTasks.Add(new GenerateBundleMaps());
buildTasks.Add(new WriteSerializedFiles());
buildTasks.Add(new ArchiveAndCompressBundles());
buildTasks.Add(new PostProcessBundlesTask());
}

var result = BuildTasksRunner.Run(buildTasks, buildContext);

if (Directory.Exists(buildParams.TempOutputFolder))
Directory.Delete(buildParams.TempOutputFolder, true);

if (result < ReturnCode.Success)
{
if (buildCompleted != null)
buildCompleted(new BuildResult() { completed = false, duration = timer.Elapsed.TotalSeconds, error = result.ToString() });
return false;
}
}
}
Expand All @@ -239,9 +245,7 @@ public static bool PrepareRuntimeData(bool isPlayerBuild, bool isDevBuild, bool
runtimeData.settingsHash = settingsHash;
var catalogLocations = new List<ResourceLocationData>();
foreach (var assetGroup in aaSettings.groups)
{
assetGroup.processor.CreateCatalog(aaSettings, assetGroup, contentCatalog, catalogLocations);
}
runtimeData.catalogLocations.locations.AddRange(catalogLocations.OrderBy(s => s.m_address));

contentCatalog.Validate();
Expand Down Expand Up @@ -283,29 +287,34 @@ internal static bool PreviewDependencyInfo(out BuildDependencyData depData, out
if (allBundleInputDefs.Count == 0)
return false;

using (var progressTracker = new TimeThrottledProgressTracker(100))
using (var progressTracker = new ProgressTracker())
{
var buildParams = new BuildParameters(EditorUserBuildSettings.activeBuildTarget, BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget), aaSettings.buildSettings.bundleBuildPath);
buildParams.UseCache = true;
using (var buildCleanup = new BuildStateCleanup(buildParams.TempOutputFolder))
{
var buildContext = new BuildContext(new BundleBuildContent(allBundleInputDefs), new Unity5PackedIdentifiers(), buildParams, depData = new BuildDependencyData(), bundleWriteData = new BundleWriteData(), new BundleBuildResults(), progressTracker);
buildContext.SetContextObject(new AddressableAssetsBuildContext() { m_settings = aaSettings, m_runtimeData = runtimeData, m_contentCatalog = contentCatalog });

var buildTasks = new List<IBuildTask>();
buildTasks.Add(new ProjectInCleanState());
buildTasks.Add(new ValidateBundleAssignments());
buildTasks.Add(new SwitchToBuildPlatform());
buildTasks.Add(new RebuildAtlasCache());
buildTasks.Add(new BuildPlayerScripts());
buildTasks.Add(new SetBundleSettingsTypeDB());
buildTasks.Add(new PreviewSceneDependencyData());
buildTasks.Add(new CalculateAssetDependencyData());
buildTasks.Add(new StripUnusedSpriteSources());
buildTasks.Add(new GenerateBundlePacking());
if (BuildTasksRunner.Run(buildTasks, buildContext) < ReturnCodes.Success)
return false;
}

Directory.CreateDirectory(buildParams.TempOutputFolder);

var buildContext = new BuildContext(new BundleBuildContent(allBundleInputDefs), new Unity5PackedIdentifiers(), buildParams, depData = new BuildDependencyData(), bundleWriteData = new BundleWriteData(), new BundleBuildResults(), progressTracker);
buildContext.SetContextObject(new AddressableAssetsBuildContext() { m_settings = aaSettings, m_runtimeData = runtimeData, m_contentCatalog = contentCatalog });

var buildTasks = new List<IBuildTask>();
buildTasks.Add(new ProjectInCleanState());
buildTasks.Add(new ValidateBundleAssignments());
buildTasks.Add(new SwitchToBuildPlatform());
buildTasks.Add(new RebuildAtlasCache());
buildTasks.Add(new BuildPlayerScripts());
buildTasks.Add(new SetBundleSettingsTypeDB());
buildTasks.Add(new PreviewSceneDependencyData());
buildTasks.Add(new CalculateAssetDependencyData());
buildTasks.Add(new StripUnusedSpriteSources());
buildTasks.Add(new GenerateBundlePacking());
var result = BuildTasksRunner.Run(buildTasks, buildContext);

if (Directory.Exists(buildParams.TempOutputFolder))
Directory.Delete(buildParams.TempOutputFolder, true);

if (result < ReturnCode.Success)
return false;
}
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,6 @@ public AddressableAssetSettings.ProfileSettings.ProfileValue loadPrefix
return m_loadPrefix;
}
}

internal override bool Validate(AddressableAssetSettings aaSettings, AddressableAssetSettings.AssetGroup assetGroup)
{
bool valid = true;
if (string.IsNullOrEmpty(loadPrefix.value))
{
Debug.LogWarningFormat("Asset Group '{0}' has invalid loadPrefix", assetGroup.name);
valid = false;
}
var bp = GetBuildPath(aaSettings);
if (string.IsNullOrEmpty(bp))
{
Debug.LogWarningFormat("Asset Group '{0}' has invalid buildPath", assetGroup.name);
valid = false;
}
return valid;
}

public BundleMode bundleMode = BundleMode.PackTogether;

internal override string displayName { get { return "Remote Packed Content"; } }
Expand Down Expand Up @@ -107,6 +89,22 @@ internal override int GetPriority(AddressableAssetSettings aaSettings, Addressab
return 0;
}

internal override bool Validate(AddressableAssetSettings aaSettings, AddressableAssetSettings.AssetGroup assetGroup)
{
bool valid = true;
if (string.IsNullOrEmpty(loadPrefix.value))
{
Debug.LogWarningFormat("Asset Group '{0}' has invalid loadPrefix", assetGroup.name);
valid = false;
}
var bp = GetBuildPath(aaSettings);
if (string.IsNullOrEmpty(bp))
{
Debug.LogWarningFormat("Asset Group '{0}' has invalid buildPath", assetGroup.name);
valid = false;
}
return valid;
}

internal override void CreateCatalog(AddressableAssetSettings aaSettings, AddressableAssetSettings.AssetGroup group, ResourceLocationList contentCatalog, List<ResourceLocationData> locations)
{
Expand All @@ -122,13 +120,16 @@ internal override void CreateCatalog(AddressableAssetSettings aaSettings, Addres
if (!Directory.Exists(buildPathDir))
Directory.CreateDirectory(buildPathDir);
File.WriteAllText(buildPath, jsonText);
File.WriteAllText(buildPath.Replace(".json",".hash"), contentHash);
File.WriteAllText(buildPath.Replace(".json", ".hash"), contentHash);

var remoteHash = new ResourceLocationData("RemoteCatalogHash" + group.guid, "", remoteHashLoadPath, typeof(TextDataProvider).FullName, false);
var localHash = new ResourceLocationData("LocalCatalogHash" + group.guid, "", localCacheLoadPath, typeof(TextDataProvider).FullName, false);


int priority = GetPriority(aaSettings, group);
locations.Add(new ResourceLocationData(priority + "_RemoteCatalog_" + group.guid, "", remoteHashLoadPath.Replace(".hash", ".json"), typeof(ContentCatalogProvider).FullName, true,
locations.Add(new ResourceLocationData(priority + "_RemoteCatalog_" + group.guid, "",
remoteHashLoadPath.Replace(".hash", ".json"),
typeof(ContentCatalogProvider).FullName, true,
ResourceLocationData.LocationType.String, 1, "",
new string[] { localHash.m_address, remoteHash.m_address}));
locations.Add(localHash);
Expand Down
6 changes: 3 additions & 3 deletions Editor/Build/Tasks/GenerateLocationListsTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ public struct GenerateLocationListsTask : IBuildTask
static readonly Type[] k_RequiredTypes = { typeof(IAddressableAssetsBuildContext), typeof(IBundleWriteData), typeof(IBuildResults) };
public Type[] RequiredContextTypes { get { return k_RequiredTypes; } }

public ReturnCodes Run(IBuildContext context)
public ReturnCode Run(IBuildContext context)
{
return Run(context.GetContextObject<IAddressableAssetsBuildContext>(), context.GetContextObject<IBundleWriteData>(), context.GetContextObject<IBuildResults>());
}

public static ReturnCodes Run(IAddressableAssetsBuildContext aaContext, IBundleWriteData writeData, IBuildResults results)
public static ReturnCode Run(IAddressableAssetsBuildContext aaContext, IBundleWriteData writeData, IBuildResults results)
{
var aabc = aaContext as AddressableAssetsBuildContext;
var aaSettings = aabc.m_settings;
Expand Down Expand Up @@ -55,7 +55,7 @@ public static ReturnCodes Run(IAddressableAssetsBuildContext aaContext, IBundleW
assetGroup.processor.CreateResourceLocationData(aaSettings, assetGroup, kvp.Key, kvp.Value, assetsToBundles, contentCatalog.locations);
}

return ReturnCodes.Success;
return ReturnCode.Success;
}
}
}
6 changes: 3 additions & 3 deletions Editor/Build/Tasks/PostProcessBundlesTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ public struct PostProcessBundlesTask : IBuildTask
static readonly Type[] k_RequiredTypes = { typeof(IAddressableAssetsBuildContext), typeof(IBundleWriteData), typeof(IBuildResults) };
public Type[] RequiredContextTypes { get { return k_RequiredTypes; } }

public ReturnCodes Run(IBuildContext context)
public ReturnCode Run(IBuildContext context)
{
IProgressTracker tracker;
context.TryGetContextObject(out tracker);
return Run(context.GetContextObject<IAddressableAssetsBuildContext>(), context.GetContextObject<IBundleWriteData>(), context.GetContextObject<IBuildResults>(), tracker);
}

public static ReturnCodes Run(IAddressableAssetsBuildContext aaContext, IBundleWriteData writeData, IBuildResults results, IProgressTracker tracker)
public static ReturnCode Run(IAddressableAssetsBuildContext aaContext, IBundleWriteData writeData, IBuildResults results, IProgressTracker tracker)
{
var aabc = aaContext as AddressableAssetsBuildContext;
var aaSettings = aabc.m_settings;
Expand All @@ -34,7 +34,7 @@ public static ReturnCodes Run(IAddressableAssetsBuildContext aaContext, IBundleW
if (assetGroupToBundle.TryGetValue(assetGroup, out bundles))
assetGroup.processor.PostProcessBundles(aaSettings, assetGroup, bundles, results, writeData, runtimeData);
}
return ReturnCodes.Success;
return ReturnCode.Success;
}
}
}
Loading

0 comments on commit b363ed6

Please sign in to comment.