스크립트를 통해 빌드 시작
다른 스크립트를 통해 빌드를 시작하려면 AddressableAssetSettings.BuildPlayerContent
메서드를 호출하십시오.
빌드를 시작하기 전에 활성 프로파일 및 활성 빌드 스크립트를 설정해야 합니다. 또한 기본이 아닌 다른 AddressableAssetSettings
오브젝트를 설정할 수도 있습니다.
BuildPlayerContent
는 빌드를 수행할 때 다음 정보를 고려합니다.
AddressableAssetSettingsDefaultObject
ActivePlayerDataBuilder
addressables_content_state.bin
파일
AddressableAssetSettings 설정
AddressableAssetSettings
를 통해 정의되는 설정은 그룹 및 프로파일 목록을 사용할 수 있도록 포함합니다.
에디터에 표시되는 설정(메뉴: Window > Asset Management > Addressables > Settings)에 액세스하려면 정적 AddressableAssetSettingsDefaultObject.Settings
프로퍼티를 사용하십시오. 하지만 원하는 경우 빌드에 다른 설정 오브젝트를 사용할 수 있습니다.
빌드에서 커스텀 설정 오브젝트를 로드하려면 다음을 따르십시오.
static void getSettingsObject(string settingsAsset)
{
// This step is optional, you can also use the default settings:
//settings = AddressableAssetSettingsDefaultObject.Settings;
settings
= AssetDatabase.LoadAssetAtPath<ScriptableObject>(settingsAsset)
as AddressableAssetSettings;
if (settings == null)
Debug.LogError($"{settingsAsset} couldn't be found or isn't " +
$"a settings object.");
}
활성 프로파일 설정
BuildContent
로 시작하는 빌드는 활성 프로파일의 변수 설정을 사용합니다. 활성 프로파일을 커스터마이즈한 빌드 스크립트의 일부로 설정하려면 원하는 프로파일의 ID를 AddressableAssetSettingsDefaultObject.Settings
오브젝트의 activeProfileId
필드에 할당하십시오.
AddressableAssetSettings
오브젝트는 프로파일 목록을 포함합니다. 원하는 프로파일의 이름을 사용하여 ID 값을 조회하고 activeProfileId
변수에 ID를 할당하십시오.
static void setProfile(string profile)
{
string profileId = settings.profileSettings.GetProfileId(profile);
if (String.IsNullOrEmpty(profileId))
Debug.LogWarning($"Couldn't find a profile named, {profile}, " +
$"using current profile instead.");
else
settings.activeProfileId = profileId;
}
활성 빌드 스크립트 설정
BuildContent
메서드는 현재 ActivePlayerDataBuilder
설정을 기반으로 빌드를 실행합니다. 특정 빌드 스크립트를 사용하려면 AddressableAssetSetting.DataBuilders
목록에 있는 IDataBuilder
오브젝트의 인덱스를 ActivePlayerDataBuilderIndex
프로퍼티에 할당하십시오.
빌드 스크립트는 IDataBuilder
를 구현하는 ScriptableObject
여야 하며, 이를 AddressableAssetSettings
인스턴스의 DataBuilders
에 추가해야 합니다. 목록에 추가하고 나면 표준 List.IndexOf
메서드를 사용하여 오브젝트의 인덱스를 가져옵니다.
static void setBuilder(IDataBuilder builder)
{
int index = settings.DataBuilders.IndexOf((ScriptableObject)builder);
if (index > 0)
settings.ActivePlayerDataBuilderIndex = index;
else
Debug.LogWarning($"{builder} must be added to the " +
$"DataBuilders list before it can be made " +
$"active. Using last run builder instead.");
}
빌드 실행
사용할 프로파일과 빌더를 설정하고 나면 빌드를 실행할 수 있습니다.
static bool buildAddressableContent()
{
AddressableAssetSettings
.BuildPlayerContent(out AddressablesPlayerBuildResult result);
bool success = string.IsNullOrEmpty(result.Error);
if (!success)
{
Debug.LogError("Addressables build error encountered: " + result.Error);
}
return success;
}
성공 여부를 확인하려면 BuildPlayerContent(out AddressablesPlayerBuildResult result)
를 사용하십시오. 어드레서블 빌드가 실패한 경우 result.Error
에서 반환된 오류 메시지를 찾을 수 있습니다. string.IsNullOrEmpty(result.Error)
가 true인 경우 빌드가 성공한 것입니다.
빌드 실행에 대한 예시 스크립트
다음 예시는 에디터의 *Window > Asset Management > Addressables 메뉴에 몇 가지 메뉴 커맨드를 추가합니다. 첫 번째 커맨드는 사전 설정된 프로파일과 빌드 스크립트를 사용하여 어드레서블 콘텐츠를 빌드합니다. 두 번째 커맨드는 어드레서블 콘텐츠를 빌드하고, 성공한 경우 플레이어를 빌드합니다.
빌드 스크립트에 도메인 리로드가 필요한 설정 변경 사항이 있는 경우, 빌드 스크립트를 에디터에서 대화식으로 실행하지 않고 Unity 커맨드 라인 옵션을 사용하여 실행해야 합니다. 자세한 내용은 도메인 리로드를 참조하십시오.
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Settings;
using System;
using UnityEngine;
internal class BuildLauncher
{
public static string build_script
= "Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset";
public static string settings_asset
= "Assets/AddressableAssetsData/AddressableAssetSettings.asset";
public static string profile_name = "Default";
private static AddressableAssetSettings settings;
static void getSettingsObject(string settingsAsset)
{
// This step is optional, you can also use the default settings:
//settings = AddressableAssetSettingsDefaultObject.Settings;
settings
= AssetDatabase.LoadAssetAtPath<ScriptableObject>(settingsAsset)
as AddressableAssetSettings;
if (settings == null)
Debug.LogError($"{settingsAsset} couldn't be found or isn't " +
$"a settings object.");
}
static void setProfile(string profile)
{
string profileId = settings.profileSettings.GetProfileId(profile);
if (String.IsNullOrEmpty(profileId))
Debug.LogWarning($"Couldn't find a profile named, {profile}, " +
$"using current profile instead.");
else
settings.activeProfileId = profileId;
}
static void setBuilder(IDataBuilder builder)
{
int index = settings.DataBuilders.IndexOf((ScriptableObject)builder);
if (index > 0)
settings.ActivePlayerDataBuilderIndex = index;
else
Debug.LogWarning($"{builder} must be added to the " +
$"DataBuilders list before it can be made " +
$"active. Using last run builder instead.");
}
static bool buildAddressableContent()
{
AddressableAssetSettings
.BuildPlayerContent(out AddressablesPlayerBuildResult result);
bool success = string.IsNullOrEmpty(result.Error);
if (!success)
{
Debug.LogError("Addressables build error encountered: " + result.Error);
}
return success;
}
[MenuItem("Window/Asset Management/Addressables/Build Addressables only")]
public static bool BuildAddressables()
{
getSettingsObject(settings_asset);
setProfile(profile_name);
IDataBuilder builderScript
= AssetDatabase.LoadAssetAtPath<ScriptableObject>(build_script) as IDataBuilder;
if (builderScript == null)
{
Debug.LogError(build_script + " couldn't be found or isn't a build script.");
return false;
}
setBuilder(builderScript);
return buildAddressableContent();
}
[MenuItem("Window/Asset Management/Addressables/Build Addressables and Player")]
public static void BuildAddressablesAndPlayer()
{
bool contentBuildSucceeded = BuildAddressables();
if (contentBuildSucceeded)
{
var options = new BuildPlayerOptions();
BuildPlayerOptions playerSettings
= BuildPlayerWindow.DefaultBuildMethods.GetBuildPlayerOptions(options);
BuildPipeline.BuildPlayer(playerSettings);
}
}
}
#endif
도메인 리로드
어드레서블 빌드를 만들기 전에 도메인 리로드를 트리거하는 설정 변경이 빌드 스크립트 프로세스에 포함된 경우, 에디터에서 스크립트를 실행하는 대신 Unity 커맨드 라인 인자를 사용하도록 해당 빌드를 스크립팅해야 합니다. 이러한 설정 유형에는 다음이 포함됩니다.
- 정의된 컴파일러 기호 변경
- 플랫폼 타겟 또는 타겟 그룹 변경
메뉴 커맨드를 사용하는 것처럼 에디터에서 대화식으로 도메인 리로드를 트리거하는 스크립트를 실행할 경우, 도메인 리로드가 발생하기 전에 에디터 스크립트가 실행을 마칩니다. 따라서 바로 어드레서블 빌드를 시작할 경우 코드와 임포트된 에셋이 모두 원래 상태로 유지됩니다. 콘텐츠 빌드를 시작하려면 도메인 리로드가 완료되기를 기다려야 합니다.
커맨드 라인을 통해 빌드를 실행할 경우 도메인 리로드가 완료될 때까지 기다리는 것이 좋습니다. 대화식 스크립트에서 안정적으로 수행하기는 어렵거나 불가능할 수 있기 때문입니다.
다음 예시 스크립트에서는 Unity를 커맨드 라인에서 실행할 경우 호출될 수 있는 두 개의 함수를 정의합니다. ChangeSettings
예시는 지정된 정의 기호를 설정합니다. BuildContentAndPlayer
함수는 어드레서블 빌드와 플레이어 빌드를 실행합니다.
#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.Build.Reporting;
using UnityEngine;
internal class BatchBuild
{
public static string build_script
= "Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset";
public static string profile_name = "Default";
public static void ChangeSettings()
{
string defines = "";
string[] args = Environment.GetCommandLineArgs();
foreach (var arg in args)
if (arg.StartsWith("-defines=", System.StringComparison.CurrentCulture))
defines = arg.Substring(("-defines=".Length));
var buildSettings = EditorUserBuildSettings.selectedBuildTargetGroup;
PlayerSettings.SetScriptingDefineSymbolsForGroup(buildSettings, defines);
}
public static void BuildContentAndPlayer()
{
AddressableAssetSettings settings
= AddressableAssetSettingsDefaultObject.Settings;
settings.activeProfileId
= settings.profileSettings.GetProfileId(profile_name);
IDataBuilder builder
= AssetDatabase.LoadAssetAtPath<ScriptableObject>(build_script) as IDataBuilder;
settings.ActivePlayerDataBuilderIndex
= settings.DataBuilders.IndexOf((ScriptableObject)builder);
AddressableAssetSettings.BuildPlayerContent(out AddressablesPlayerBuildResult result);
if (!string.IsNullOrEmpty(result.Error))
throw new Exception(result.Error);
BuildReport buildReport
= BuildPipeline.BuildPlayer(EditorBuildSettings.scenes,
"d:/build/winApp.exe", EditorUserBuildSettings.activeBuildTarget,
BuildOptions.None);
if (buildReport.summary.result != BuildResult.Succeeded)
throw new Exception(buildReport.summary.ToString());
}
}
#endif
이러한 함수를 호출하려면 터미널 또는 커맨드 프롬프트나 셸 스크립트에서 Unity의 커맨드 라인 인자를 사용하십시오.
D:\Unity\2020.3.0f1\Editor\Unity.exe -quit -batchMode -projectPath . -executeMethod BatchBuild.ChangeSettings -defines=FOO;BAR -buildTarget Android
D:\Unity\2020.3.0f1\Editor\Unity.exe -quit -batchMode -projectPath . -executeMethod BatchBuild.BuildContentAndPlayer -buildTarget Android
[!참고] 플랫폼 타겟을 커맨드 라인 파라미터로 지정할 경우 동일한 커맨드에서 어드레서블 빌드를 수행할 수 있습니다. 하지만 스크립트에서 플랫폼을 변경하려는 경우 별도의 커맨드에서 변경해야 합니다(이 예시에서는
ChangeSettings
함수).