134 lines
3.3 KiB
C#
Raw Permalink Normal View History

2025-06-07 17:43:34 +08:00
using System;
using System.Collections.Generic;
using UnityEngine;
namespace FairyGUI
{
/// <summary>
///
/// </summary>
public interface EMRenderTarget
{
int EM_sortingOrder { get; }
void EM_BeforeUpdate();
void EM_Update(UpdateContext context);
void EM_Reload();
}
/// <summary>
/// 这是一个在编辑状态下渲染UI的功能类。EM=Edit Mode
/// </summary>
public class EMRenderSupport
{
/// <summary>
///
/// </summary>
public static bool orderChanged;
static UpdateContext _updateContext;
static List<EMRenderTarget> _targets = new List<EMRenderTarget>();
/// <summary>
///
/// </summary>
public static bool packageListReady { get; private set; }
/// <summary>
///
/// </summary>
public static bool hasTarget
{
get { return _targets.Count > 0; }
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
public static void Add(EMRenderTarget value)
{
if (!_targets.Contains(value))
_targets.Add(value);
orderChanged = true;
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
public static void Remove(EMRenderTarget value)
{
_targets.Remove(value);
}
/// <summary>
/// 由StageCamera调用
/// </summary>
public static void Update()
{
if (Application.isPlaying)
return;
if (_updateContext == null)
_updateContext = new UpdateContext();
if (orderChanged)
{
_targets.Sort(CompareDepth);
orderChanged = false;
}
int cnt = _targets.Count;
for (int i = 0; i < cnt; i++)
{
EMRenderTarget panel = _targets[i];
panel.EM_BeforeUpdate();
}
if (packageListReady)
{
_updateContext.Begin();
for (int i = 0; i < cnt; i++)
{
EMRenderTarget panel = _targets[i];
panel.EM_Update(_updateContext);
}
_updateContext.End();
}
}
/// <summary>
/// 当发生二进制重载时,或用户点击刷新菜单
/// </summary>
public static void Reload()
{
if (Application.isPlaying)
return;
UIConfig.ClearResourceRefs();
#if UNITY_2023_2_OR_NEWER
UIConfig[] configs = GameObject.FindObjectsByType<UIConfig>(FindObjectsSortMode.None);
#else
UIConfig[] configs = GameObject.FindObjectsOfType<UIConfig>();
#endif
foreach (UIConfig config in configs)
config.Load();
packageListReady = true;
int cnt = _targets.Count;
for (int i = 0; i < cnt; i++)
{
EMRenderTarget panel = _targets[i];
panel.EM_Reload();
}
}
static int CompareDepth(EMRenderTarget c1, EMRenderTarget c2)
{
return c1.EM_sortingOrder - c2.EM_sortingOrder;
}
}
}