You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
296 lines
7.7 KiB
296 lines
7.7 KiB
3 years ago
|
using System;
|
||
|
using FairyGUI;
|
||
|
|
||
|
namespace ET
|
||
|
{
|
||
|
public class FUIComponentAwakeSystem : AwakeSystem<FUIComponent>
|
||
|
{
|
||
|
public override void Awake(FUIComponent self)
|
||
|
{
|
||
|
self.Awake();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class FUIComponentDestroySystem : DestroySystem<FUIComponent>
|
||
|
{
|
||
|
public override void Destroy(FUIComponent self)
|
||
|
{
|
||
|
self.Destroy();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Timer(TimerType.ButtonAsyncEventTimer)]
|
||
|
public class ButtonAsyncEventTimer : ATimer<FUIComponent>
|
||
|
{
|
||
|
public override void Run(FUIComponent self)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
self.IsButtonClicked = false;
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
Log.Error(e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[FriendClass(typeof(FUIComponent))]
|
||
|
public static class FUIComponentSystem
|
||
|
{
|
||
|
public static void Awake(this FUIComponent self)
|
||
|
{
|
||
|
FUIComponent.Instance = self;
|
||
|
self.Root = self.Domain.AddChild<FUI, GObject>(GRoot.inst);
|
||
|
|
||
|
// 设置加载器
|
||
|
UIObjectFactory.SetLoaderExtension(typeof(FUIGLoader));
|
||
|
}
|
||
|
|
||
|
public static void Destroy(this FUIComponent self)
|
||
|
{
|
||
|
if (self.IsDisposed)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
self.Root?.Dispose();
|
||
|
self.Root = null;
|
||
|
}
|
||
|
|
||
|
public static void Add(this FUIComponent self, FUI ui, bool asChildGObject)
|
||
|
{
|
||
|
self.Root?.Add(ui, asChildGObject);
|
||
|
}
|
||
|
|
||
|
public static void Remove(this FUIComponent self, string name)
|
||
|
{
|
||
|
self.Root?.Remove(name);
|
||
|
}
|
||
|
|
||
|
public static FUI Get(this FUIComponent self, string name)
|
||
|
{
|
||
|
return self.Root?.Get(name);
|
||
|
}
|
||
|
|
||
|
public static FUI[] GetAll(this FUIComponent self)
|
||
|
{
|
||
|
return self.Root?.GetAll();
|
||
|
}
|
||
|
|
||
|
public static void Clear(this FUIComponent self)
|
||
|
{
|
||
|
var childrens = self.GetAll();
|
||
|
|
||
|
if (childrens != null)
|
||
|
{
|
||
|
foreach (var fui in childrens)
|
||
|
{
|
||
|
self.Remove(fui.Name);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void StartButtonEventAsyncTimer(this FUIComponent self)
|
||
|
{
|
||
|
self.ButtonAsyncEventTimer = TimerComponent.Instance.NewOnceTimer(TimeHelper.ClientNow() + 2000, TimerType.ButtonAsyncEventTimer, self);
|
||
|
}
|
||
|
|
||
|
public static void StopButtonEventAsyncTimer(this FUIComponent self)
|
||
|
{
|
||
|
TimerComponent.Instance.Remove(ref self.ButtonAsyncEventTimer);
|
||
|
}
|
||
|
|
||
|
public static void AddWindow(this FUIComponent self, string name, IFUIWindow window)
|
||
|
{
|
||
|
self.AvailableWindows.Add(name, window);
|
||
|
}
|
||
|
|
||
|
public static IFUIWindow GetWindow(this FUIComponent self, string name)
|
||
|
{
|
||
|
if (self.AvailableWindows.ContainsKey(name))
|
||
|
{
|
||
|
return self.AvailableWindows[name];
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
public static void HideWindow(this FUIComponent self, string name)
|
||
|
{
|
||
|
if (self.AvailableWindows.TryGetValue(name, out IFUIWindow win))
|
||
|
{
|
||
|
win.Window?.Hide();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 异步显示一个UI组件
|
||
|
/// </summary>
|
||
|
/// <param name="packageBundle">组件所在的ab包</param>
|
||
|
/// <typeparam name="T">FUI组件类型</typeparam>
|
||
|
/// <typeparam name="K">对应的自定义逻辑组件类型</typeparam>
|
||
|
/// <returns>对应的自定义逻辑组件 </returns>
|
||
|
public static async ETTask<K> ShowUIAsync<T, K>(this FUIComponent self, string packageBundle) where T : Entity, IAwake, new() where K : Entity, IAwake, new()
|
||
|
{
|
||
|
// 对应fairgui中的包内部的资源名
|
||
|
string uiResName = (string) typeof (T).GetField("UIResName").GetValue(null);
|
||
|
if (self.AvailableUI.TryGetValue(uiResName, out Entity comp))
|
||
|
{
|
||
|
FUI fui = comp.GetParent<FUI>();
|
||
|
fui.Visible = true;
|
||
|
return comp as K;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
var zoneScene = self.ZoneScene();
|
||
|
await zoneScene.GetComponent<FUIPackageComponent>().AddPackageAsync(packageBundle);
|
||
|
// 对应fairgui中的包名
|
||
|
string uiPackageName = (string) typeof(T).GetField("UIPackageName").GetValue(null);
|
||
|
|
||
|
T dataComp = FUIHelper.CreateInstance<T>(zoneScene, uiPackageName, uiResName);
|
||
|
FUI fui = dataComp.GetParent<FUI>();
|
||
|
fui.Name = uiResName;
|
||
|
fui.MakeFullScreen();
|
||
|
|
||
|
var logicComp = fui.AddComponent<K>();
|
||
|
self.Add(fui, true);
|
||
|
self.AvailableUI.Add(uiResName, logicComp);
|
||
|
return logicComp;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
public static K ShowUI<T, K>(this FUIComponent self, string packageBundle) where T : Entity, IAwake, new() where K : Entity, IAwake, new()
|
||
|
{
|
||
|
string uiResName = (string) typeof (T).GetField("UIResName").GetValue(null);
|
||
|
if (self.AvailableUI.TryGetValue(uiResName, out Entity comp))
|
||
|
{
|
||
|
FUI fui = comp.GetParent<FUI>();
|
||
|
fui.Visible = true;
|
||
|
return comp as K;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
var zoneScene = self.ZoneScene();
|
||
|
zoneScene.GetComponent<FUIPackageComponent>().AddPackage(packageBundle);
|
||
|
// 对应fairgui中的包名
|
||
|
string uiPackageName = (string) typeof(T).GetField("UIPackageName").GetValue(null);
|
||
|
// 对应fairgui中的包内部的资源名
|
||
|
|
||
|
T dataComp = FUIHelper.CreateInstance<T>(zoneScene, uiPackageName, uiResName);
|
||
|
FUI fui = dataComp.GetParent<FUI>();
|
||
|
fui.Name = uiResName;
|
||
|
fui.MakeFullScreen();
|
||
|
|
||
|
|
||
|
var logicComp = fui.AddComponent<K>();
|
||
|
self.Add(fui, true);
|
||
|
self.AvailableUI.Add(uiResName, logicComp);
|
||
|
return logicComp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static Entity GetUI(this FUIComponent self, string name)
|
||
|
{
|
||
|
if (self.AvailableUI.TryGetValue(name, out Entity comp))
|
||
|
{
|
||
|
return comp;
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
public static void HideUI(this FUIComponent self, string name)
|
||
|
{
|
||
|
if (self.AvailableUI.TryGetValue(name, out Entity comp))
|
||
|
{
|
||
|
FUI fui = comp.GetParent<FUI>();
|
||
|
fui.Visible = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void RemoveUI(this FUIComponent self, string name)
|
||
|
{
|
||
|
self.AvailableUI.Remove(name);
|
||
|
self.Remove(name);
|
||
|
}
|
||
|
|
||
|
public static K ShowWindow<T, K>(this FUIComponent self, string packageBundle = null) where T : Entity, IAwake, new()
|
||
|
where K : Entity, IAwake, IFUIWindow, new()
|
||
|
{
|
||
|
var zoneScene = self.ZoneScene();
|
||
|
|
||
|
var type = typeof (T);
|
||
|
|
||
|
// 对应fairgui中的包内部的资源名
|
||
|
string uiResName = (string) type.GetField("UIResName").GetValue(null);
|
||
|
var win = self.GetWindow(uiResName);
|
||
|
if (win != null)
|
||
|
{
|
||
|
win.Window?.Show();
|
||
|
return win as K;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// 对应fairgui中的包名
|
||
|
string uiPackageName = (string) type.GetField("UIPackageName").GetValue(null);
|
||
|
if (packageBundle == null)
|
||
|
{
|
||
|
// 默认使用fui提供的包名
|
||
|
packageBundle = uiPackageName;
|
||
|
}
|
||
|
zoneScene.GetComponent<FUIPackageComponent>().AddPackage(packageBundle);
|
||
|
T dataComp = FUIHelper.CreateInstance<T>(zoneScene, uiPackageName, uiResName);
|
||
|
FUI fui = dataComp.GetParent<FUI>();
|
||
|
fui.Name = uiResName;
|
||
|
fui.MakeFullScreen();
|
||
|
|
||
|
var logicComp = fui.AddComponent<K>();
|
||
|
self.AddWindow(uiResName, logicComp);
|
||
|
logicComp.Window?.Show();
|
||
|
return logicComp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static async ETTask<K> ShowWindowAsync<T, K>(this FUIComponent self, string packageBundle = null) where T : Entity, IAwake, new()
|
||
|
where K : Entity, IAwake, IFUIWindow, new()
|
||
|
{
|
||
|
var zoneScene = self.ZoneScene();
|
||
|
|
||
|
var type = typeof (T);
|
||
|
|
||
|
// 对应fairgui中的包内部的资源名
|
||
|
string uiResName = (string) type.GetField("UIResName").GetValue(null);
|
||
|
var win = self.GetWindow(uiResName);
|
||
|
if (win != null)
|
||
|
{
|
||
|
win.Window?.Show();
|
||
|
return win as K;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// 对应fairgui中的包名
|
||
|
string uiPackageName = (string) type.GetField("UIPackageName").GetValue(null);
|
||
|
|
||
|
if (packageBundle == null)
|
||
|
{
|
||
|
// 默认使用fui提供的包名
|
||
|
packageBundle = uiPackageName;
|
||
|
}
|
||
|
await zoneScene.GetComponent<FUIPackageComponent>().AddPackageAsync(packageBundle);
|
||
|
T dataComp = FUIHelper.CreateInstance<T>(zoneScene, uiPackageName, uiResName);
|
||
|
FUI fui = dataComp.GetParent<FUI>();
|
||
|
fui.Name = uiResName;
|
||
|
fui.MakeFullScreen();
|
||
|
|
||
|
var logicComp = fui.AddComponent<K>();
|
||
|
self.AddWindow(uiResName, logicComp);
|
||
|
logicComp.Window?.Show();
|
||
|
return logicComp;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|