一、使用场景
一般需要开发和发布两个环境,在开发地址上测试完成后,需要切换成正式地址,这时只需要更改远程地址,其他设置是不需要变更的。
二、配置文件
在profile中创建新的profile,如图中1的Develop和Release,然后在2中填写不同的地址
三、通过脚本切换地址
关键代码,切换profile,达到更换地址的目的
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;
}
四、完整打包脚本
#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(string profileName = "Default")
{
getSettingsObject(settings_asset);
setProfile(profileName);
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(string environment)
{
string profileName = "Default";
bool contentBuildSucceeded = false;
if (environment == "develop")
{
profileName = "Develop";
}
else if (environment == "release")
{
profileName = "Release";
}
//if (string.IsNullOrEmpty(profileName))
//{
// contentBuildSucceeded = BuildAddressables();
//}
//else
//{
// contentBuildSucceeded = BuildAddressables(profileName);
//}
getSettingsObject(settings_asset);
setProfile(profileName);
//if (contentBuildSucceeded)
//{
var options = new BuildPlayerOptions();
BuildPlayerOptions playerSettings
= BuildPlayerWindow.DefaultBuildMethods.GetBuildPlayerOptions(options);
BuildPipeline.BuildPlayer(playerSettings);
//}
}
[MenuItem("Tools/Build For Development")]
public static void BuildForDevelopment()
{
BuildAddressablesAndPlayer("develop");
}
[MenuItem("Tools/Build For Release")]
public static void BuildForRelease()
{
BuildAddressablesAndPlayer("release");
}
}
#endif
参考文档: 构建脚本