Firstborn/Library/PackageCache/com.unity.addressables@1.19.19/Editor/Build/DataBuilders/BuildScriptPackedPlayMode.cs
Schaken-Mods 7502018d20 Adding Mod Support
There is an asset in the store I grabbed. the coding is WAY above my head, I got about half of it and integrated and adapted what I can to it. im going as far as I can with it and ill come back in a few month when I understand t better.
2023-05-13 22:01:48 -05:00

90 lines
3.9 KiB
C#

using System;
using System.IO;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.AddressableAssets.Initialization;
namespace UnityEditor.AddressableAssets.Build.DataBuilders
{
/// <summary>
/// Uses data built by BuildScriptPacked class. This script just sets up the correct variables and runs.
/// </summary>
[CreateAssetMenu(fileName = "BuildScriptPackedPlayMode.asset", menuName = "Addressables/Content Builders/Use Existing Build (requires built groups)")]
public class BuildScriptPackedPlayMode : BuildScriptBase
{
/// <inheritdoc />
public override string Name
{
get
{
return "Use Existing Build (requires built groups)";
}
}
private bool m_DataBuilt;
/// <inheritdoc />
public override void ClearCachedData()
{
m_DataBuilt = false;
}
/// <inheritdoc />
public override bool IsDataBuilt()
{
return m_DataBuilt;
}
/// <inheritdoc />
public override bool CanBuildData<T>()
{
return typeof(T).IsAssignableFrom(typeof(AddressablesPlayModeBuildResult));
}
/// <inheritdoc />
protected override TResult BuildDataImplementation<TResult>(AddressablesDataBuilderInput builderInput)
{
var timer = new System.Diagnostics.Stopwatch();
timer.Start();
var settingsPath = Addressables.BuildPath + "/settings.json";
var buildLogsPath = Addressables.BuildPath + "/buildLogs.json";
if (!File.Exists(settingsPath))
{
IDataBuilderResult resE = new AddressablesPlayModeBuildResult() { Error = "Player content must be built before entering play mode with packed data. This can be done from the Addressables window in the Build->Build Player Content menu command." };
return (TResult)resE;
}
var rtd = JsonUtility.FromJson<ResourceManagerRuntimeData>(File.ReadAllText(settingsPath));
if (rtd == null)
{
IDataBuilderResult resE = new AddressablesPlayModeBuildResult() { Error = string.Format("Unable to load initialization data from path {0}. This can be done from the Addressables window in the Build->Build Player Content menu command.", settingsPath) };
return (TResult)resE;
}
PackedPlayModeBuildLogs buildLogs = new PackedPlayModeBuildLogs();
BuildTarget dataBuildTarget = BuildTarget.NoTarget;
if (!Enum.TryParse(rtd.BuildTarget, out dataBuildTarget))
{
buildLogs.RuntimeBuildLogs.Add(new PackedPlayModeBuildLogs.RuntimeBuildLog(LogType.Warning,
$"Unable to parse build target from initialization data: '{rtd.BuildTarget}'."));
}
else if (BuildPipeline.GetBuildTargetGroup(dataBuildTarget) != BuildTargetGroup.Standalone)
{
buildLogs.RuntimeBuildLogs.Add(new PackedPlayModeBuildLogs.RuntimeBuildLog(LogType.Warning,
$"Asset bundles built with build target {dataBuildTarget} may not be compatible with running in the Editor."));
}
if(buildLogs.RuntimeBuildLogs.Count > 0)
File.WriteAllText(buildLogsPath, JsonUtility.ToJson(buildLogs));
//TODO: detect if the data that does exist is out of date..
var runtimeSettingsPath = "{UnityEngine.AddressableAssets.Addressables.RuntimePath}/settings.json";
PlayerPrefs.SetString(Addressables.kAddressablesRuntimeDataPath, runtimeSettingsPath);
PlayerPrefs.SetString(Addressables.kAddressablesRuntimeBuildLogPath, buildLogsPath);
IDataBuilderResult res = new AddressablesPlayModeBuildResult() { OutputPath = settingsPath, Duration = timer.Elapsed.TotalSeconds };
m_DataBuilt = true;
return (TResult)res;
}
}
}