ProjectDDD/Packages/com.opsive.behaviordesigner/Editor/Managers/WelcomeScreenManager.cs
2025-08-19 18:53:26 +09:00

181 lines
7.3 KiB
C#

/// ---------------------------------------------
/// Behavior Designer
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.Editor.Managers
{
using Opsive.Shared.Editor.Managers;
using UnityEditor;
using UnityEngine.UIElements;
/// <summary>
/// Shows a starting window with useful links.
/// </summary>
[OrderedEditorItem("Welcome", 0)]
public class WelcomeScreenManager : Opsive.Shared.Editor.Managers.WelcomeScreenManager
{
private const string c_GraphDesignerSymbol = "GRAPH_DESIGNER";
private const string c_EditorTextureGUID = "d52eae9187aad5b41aff6dd60e49247a";
private const string c_RepositoryTextureGUID = "020153b61b65cf34f82ccc9b186cb700";
private VisualElement m_EntityHelpBoxContainer;
/// <summary>
/// The name of the asset.
/// </summary>
protected override string AssetName => AssetInfo.Name;
/// <summary>
/// The version of the asset.
/// </summary>
protected override string AssetVersion => AssetInfo.Version;
/// <summary>
/// Should the large documentation image be added?
/// </summary>
protected override bool AddLargeDocumentationImage => false;
/// <summary>
/// Returns the URL for the documentation page.
/// </summary>
/// <returns>The URL for the documentation page.</returns>
protected override string GetDocumentationURL()
{
return "https://opsive.com/support/documentation/behavior-designer-pro/";
}
/// <summary>
/// Returns the URL for the videos page.
/// </summary>
/// <returns>The URL for the videos page.</returns>
protected override string GetVideosURL()
{
return "https://opsive.com/videos?pid=28276";
}
/// <summary>
/// Returns the URL for the asset page.
/// </summary>
/// <returns>The URL for the asset page.</returns>
protected override string GetAssetURL()
{
return "https://assetstore.unity.com/packages/slug/298743";
}
/// <summary>
/// Checks to ensure the required packages are installed.
/// </summary>
/// <param name="parent">The parent VisualElement.</param>
protected override void AddHeader(VisualElement parent)
{
EditorApplication.update += CheckForEntities;
#if !UNITY_ENTITIES
m_EntityHelpBoxContainer = ManagerUtility.AddHelpBox(parent, "Behavior Designer requires the Entities package. Press the button below to install.", HelpBoxMessageType.Error, "Install", (HelpBox helpbox, Button actionButton) =>
{
helpbox.text = "Installing the entities package. Unity will reimport after the package has been installed.\n\n" +
"Restart Unity if you receive compiler errors after Unity has reimported.\n\n" +
"Behavior Designer can be access from the Tools/Opsive/Behavior Designer/Editor menu.";
helpbox.messageType = HelpBoxMessageType.Info;
actionButton.SetEnabled(false);
m_WelcomeLabel.style.display = DisplayStyle.None;
UnityEditor.PackageManager.Client.Add("com.unity.entities");
});
m_WelcomeLabel.style.display = DisplayStyle.None;
#else
base.AddHeader(parent);
#endif
}
/// <summary>
/// Checks for the Entity package installation.
/// </summary>
private void CheckForEntities()
{
#if !GRAPH_DESIGNER && UNITY_ENTITIES
AddSymbol(c_GraphDesignerSymbol);
EditorApplication.update -= CheckForEntities;
if (m_EntityHelpBoxContainer != null) {
m_EntityHelpBoxContainer.style.display = DisplayStyle.None;
m_WelcomeLabel.style.display = DisplayStyle.Flex;
}
#elif GRAPH_DESIGNER
if (m_EntityHelpBoxContainer != null) {
m_EntityHelpBoxContainer.style.display = DisplayStyle.None;
m_WelcomeLabel.style.display = DisplayStyle.Flex;
}
#endif
}
/// <summary>
/// Adds the specified symbol to the compiler definitions.
/// </summary>
/// <param name="symbol">The symbol to add.</param>
private static void AddSymbol(string symbol)
{
// Set on all available build targets.
var buildTargets = System.Enum.GetValues(typeof(BuildTarget)) as BuildTarget[];
foreach (var buildTarget in buildTargets) {
if (buildTarget is BuildTarget.NoTarget) {
continue;
}
var buildTargetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget);
if (!BuildPipeline.IsBuildTargetSupported(buildTargetGroup, buildTarget)) {
continue;
}
#if UNITY_2023_1_OR_NEWER
var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);
var symbols = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget);
#else
var symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);
#endif
if (symbols.Contains(symbol)) {
continue;
}
symbols += (";" + symbol);
#if UNITY_2023_1_OR_NEWER
PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, symbols);
#else
PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, symbols);
#endif
}
}
/// <summary>
/// Adds the resource images to the parent element.
/// </summary>
/// <param name="parent">The parent that the images should be added to.</param>
protected override void AddImages(VisualElement parent)
{
AddLargeImage(parent, c_EditorTextureGUID, () => {
#if GRAPH_DESIGNER
BehaviorDesignerWindow.ShowWindow();
#else
UnityEngine.Debug.LogError("Error: Unable to open the Behavior Designer window. Ensure the Entities package has been installed.");
#endif
});
// Documentation and Videos.
AddImageRow(parent, c_SmallDocumentationTextureGUID, GetDocumentationURL(),
c_VideosTextureGUID, GetVideosURL());
// Repository and Downloads.
AddImageRow(parent, c_RepositoryTextureGUID, "https://opsive.com/assets/behavior-designer-pro-subscription",
c_DownloadsTextureGUID, IntegrationsManager.GetDownloadsLink());
// Forum and Discord.
AddImageRow(parent, c_ForumTextureGUID, "https://opsive.com/forum/",
c_DiscordTextureGUID, "https://discord.gg/QX6VFgc");
// Review and Showcase.
AddImageRow(parent, c_ReviewTextureGUID, GetAssetURL(),
c_ShowcaseTextureGUID, "https://opsive.com/showcase/");
// Professional Services.
AddImageRow(parent, c_ProfessionalServicesTextureGUID, "https://opsive.com", string.Empty, string.Empty);
}
}
}