首次提交
This commit is contained in:
211
Assets/Plugins/FairyGUI/Scripts/UI/UIObjectFactory.cs
Normal file
211
Assets/Plugins/FairyGUI/Scripts/UI/UIObjectFactory.cs
Normal file
@@ -0,0 +1,211 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
#if FAIRYGUI_TOLUA
|
||||
using LuaInterface;
|
||||
#endif
|
||||
|
||||
namespace FairyGUI
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class UIObjectFactory
|
||||
{
|
||||
public delegate GComponent GComponentCreator();
|
||||
public delegate GLoader GLoaderCreator();
|
||||
|
||||
static Dictionary<string, GComponentCreator> packageItemExtensions = new Dictionary<string, GComponentCreator>();
|
||||
static GLoaderCreator loaderCreator;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="type"></param>
|
||||
public static void SetPackageItemExtension(string url, System.Type type)
|
||||
{
|
||||
SetPackageItemExtension(url, () => { return (GComponent)Activator.CreateInstance(type); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="creator"></param>
|
||||
public static void SetPackageItemExtension(string url, GComponentCreator creator)
|
||||
{
|
||||
if (url == null)
|
||||
throw new Exception("Invaild url: " + url);
|
||||
|
||||
PackageItem pi = UIPackage.GetItemByURL(url);
|
||||
if (pi != null)
|
||||
pi.extensionCreator = creator;
|
||||
|
||||
packageItemExtensions[url] = creator;
|
||||
}
|
||||
|
||||
#if FAIRYGUI_TOLUA
|
||||
public static void SetExtension(string url, System.Type baseType, LuaFunction extendFunction)
|
||||
{
|
||||
SetPackageItemExtension(url, () =>
|
||||
{
|
||||
GComponent gcom = (GComponent)Activator.CreateInstance(baseType);
|
||||
|
||||
extendFunction.BeginPCall();
|
||||
extendFunction.Push(gcom);
|
||||
extendFunction.PCall();
|
||||
gcom.SetLuaPeer(extendFunction.CheckLuaTable());
|
||||
extendFunction.EndPCall();
|
||||
|
||||
return gcom;
|
||||
});
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
public static void SetLoaderExtension(System.Type type)
|
||||
{
|
||||
loaderCreator = () => { return (GLoader)Activator.CreateInstance(type); };
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="creator"></param>
|
||||
public static void SetLoaderExtension(GLoaderCreator creator)
|
||||
{
|
||||
loaderCreator = creator;
|
||||
}
|
||||
|
||||
internal static void ResolvePackageItemExtension(PackageItem pi)
|
||||
{
|
||||
if (!packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.id + pi.id, out pi.extensionCreator)
|
||||
&& !packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.name + "/" + pi.name, out pi.extensionCreator))
|
||||
pi.extensionCreator = null;
|
||||
}
|
||||
|
||||
public static void Clear()
|
||||
{
|
||||
packageItemExtensions.Clear();
|
||||
loaderCreator = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="pi"></param>
|
||||
/// <param name="userClass"></param>
|
||||
/// <returns></returns>
|
||||
public static GObject NewObject(PackageItem pi, System.Type userClass = null)
|
||||
{
|
||||
GObject obj;
|
||||
if (pi.type == PackageItemType.Component)
|
||||
{
|
||||
if (userClass != null)
|
||||
{
|
||||
Stats.LatestObjectCreation++;
|
||||
obj = (GComponent)Activator.CreateInstance(userClass);
|
||||
}
|
||||
else if (pi.extensionCreator != null)
|
||||
{
|
||||
Stats.LatestObjectCreation++;
|
||||
obj = pi.extensionCreator();
|
||||
}
|
||||
else
|
||||
obj = NewObject(pi.objectType);
|
||||
}
|
||||
else
|
||||
obj = NewObject(pi.objectType);
|
||||
|
||||
if (obj != null)
|
||||
obj.packageItem = pi;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public static GObject NewObject(ObjectType type)
|
||||
{
|
||||
Stats.LatestObjectCreation++;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ObjectType.Image:
|
||||
return new GImage();
|
||||
|
||||
case ObjectType.MovieClip:
|
||||
return new GMovieClip();
|
||||
|
||||
case ObjectType.Component:
|
||||
return new GComponent();
|
||||
|
||||
case ObjectType.Text:
|
||||
return new GTextField();
|
||||
|
||||
case ObjectType.RichText:
|
||||
return new GRichTextField();
|
||||
|
||||
case ObjectType.InputText:
|
||||
return new GTextInput();
|
||||
|
||||
case ObjectType.Group:
|
||||
return new GGroup();
|
||||
|
||||
case ObjectType.List:
|
||||
return new GList();
|
||||
|
||||
case ObjectType.Graph:
|
||||
return new GGraph();
|
||||
|
||||
case ObjectType.Loader:
|
||||
if (loaderCreator != null)
|
||||
return loaderCreator();
|
||||
else
|
||||
return new GLoader();
|
||||
|
||||
case ObjectType.Button:
|
||||
return new GButton();
|
||||
|
||||
case ObjectType.Label:
|
||||
return new GLabel();
|
||||
|
||||
case ObjectType.ProgressBar:
|
||||
return new GProgressBar();
|
||||
|
||||
case ObjectType.Slider:
|
||||
return new GSlider();
|
||||
|
||||
case ObjectType.ScrollBar:
|
||||
return new GScrollBar();
|
||||
|
||||
case ObjectType.ComboBox:
|
||||
return new GComboBox();
|
||||
|
||||
case ObjectType.Tree:
|
||||
return new GTree();
|
||||
|
||||
case ObjectType.Loader3D:
|
||||
return new GLoader3D();
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_2019_3_OR_NEWER
|
||||
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
||||
static void InitializeOnLoad()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user