module-navigation-tool/Editor/Toolbar/MainToolbarElements/MainToolbarBuildElement.cs

104 lines
3.8 KiB
C#

#if UNITY_6000_3_OR_NEWER
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEditor.Toolbars;
using UnityEngine;
using UnityEngine.Scripting;
namespace Module.NavigationTool.Editor.Toolbar
{
internal static class MainToolbarBuildElement
{
[Preserve]
[MainToolbarElement("Toolbar/Build", ussName = "", defaultDockIndex = 0, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 500)]
public static IEnumerable<MainToolbarElement> Draw()
{
var target = EditorUserBuildSettings.activeBuildTarget;
var group = BuildPipeline.GetBuildTargetGroup(target);
return new List<MainToolbarElement>(2)
{
new MainToolbarDropdown(new MainToolbarContent("Build", "Select build or build & run options"), OnBuildDropdownOpened),
new MainToolbarDropdown(GetButtonContent(group), OnBuildTargetDropdownOpened)
};
}
private static void OnBuildDropdownOpened(Rect rect)
{
var menu = new GenericMenu();
menu.AddItem(new GUIContent("Build", "Build project with current EditorBuildSettings and target platform"), false, () => Build(false));
menu.AddItem(new GUIContent("Build & Run", "Build & Run project with current EditorBuildSettings and target platform"), false, () => Build(false));
menu.DropDown(rect);
}
private static void OnBuildTargetDropdownOpened(Rect rect)
{
var menu = new GenericMenu();
var type = typeof(BuildTarget);
var values = Enum.GetValues(type);
for (var i = 0; i < values.Length; i++)
{
var target = (BuildTarget)values.GetValue(i);
var group = BuildPipeline.GetBuildTargetGroup(target);
if (target < 0 || !BuildPipeline.IsBuildTargetSupported(group, target))
continue;
if (!IsValid(type, target))
continue;
menu.AddItem(new GUIContent(ObjectNames.NicifyVariableName(target.ToString())), false, () => SetBuildTargetTo(group, target));
}
menu.DropDown(rect);
}
private static void SetBuildTargetTo(BuildTargetGroup group, BuildTarget target)
{
if (EditorUserBuildSettings.SwitchActiveBuildTarget(group, target))
MainToolbar.Refresh("Toolbar/Build Targets");
}
private static bool IsValid(Type type, BuildTarget target)
{
var members = type.GetMember(target.ToString(), BindingFlags.Public | BindingFlags.Static);
if (members.Length == 0)
return false;
for (var j = 0; j < members.Length; j++)
{
if (members[j].GetCustomAttribute<ObsoleteAttribute>() == null)
return true;
}
return false;
}
private static GUIContent GetButtonContent(BuildTargetGroup group)
{
var name = $"BuildSettings.{group}.Small";
if (group == BuildTargetGroup.WSA)
name = "BuildSettings.Metro.Small";
var iconContent = EditorGUIUtility.IconContent(name);
var content = new GUIContent(iconContent.image, "Select target platform for build");
return content;
}
private static void Build(bool withAutorun)
{
var options = BuildPlayerWindow.DefaultBuildMethods.GetBuildPlayerOptions(new BuildPlayerOptions());
if (withAutorun)
options.options |= BuildOptions.AutoRunPlayer;
BuildPlayerWindow.DefaultBuildMethods.BuildPlayer(options);
}
}
}
#endif