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.

534 lines
17 KiB

using UnityEngine;
using System.Collections.Generic;
using System.Reflection;
using System;
namespace UltraControls
{
using MapCtrlInfo = Dictionary<string, ControlInfo>;
using MapCtrl = Dictionary<string, Control>;
public class UltraGetter : MonoBehaviour
{
public delegate void OnCompletedSetupGetter(UltraGetter getter);
public event OnCompletedSetupGetter EventComplemtedSetupGetter;
public bool is_start
{
get { return m_is_started; }
set
{
m_is_started = value;
if (!m_is_started && m_handle != Handler.InvalidHandle)
{
mf_Destroy();
}
}
}
public string ultracontros_name
{
get { return m_name; }
set
{
if (m_is_started && m_handle != Handler.InvalidHandle)
{
mf_Destroy();
}
m_name = value;
//m_relative_filepath_settings_default = Path.Combine(Utils.GetRelativeDefaultDir(), mf_PleaseCallMyRealName() + ".json");
}
}
public bool AddControlInfo< T > (string name, T val, T min, T max)
{
if (is_start)
{
m_need_restart = true;
}
if (m_map_ctrl_info.ContainsKey(name))
{
return false;
}
m_map_ctrl_info.Add(name, Factroy.CreateInfo<T>(name, val, min, max) );
return true;
}
public bool AddControlInfo<T>(string name, T val)
{
if (is_start)
{
m_need_restart = true;
}
if (m_map_ctrl_info.ContainsKey(name))
{
return false;
}
m_map_ctrl_info.Add(name, Factroy.CreateInfo<T>(name, val));
return true;
}
public void RemoveControlInfo(string name)
{
if (is_start)
{
m_need_restart = true;
}
m_map_ctrl_info.Remove(name);
}
public ParamGetter<T> GetParamGetter<T>(string name)
{
Control ctrl;
if (!m_map_ctrl.TryGetValue(name, out ctrl))
{
return null;
}
return ctrl.CreateParamGetter<T>();
}
void Start()
{
}
void Update()
{
mf_Update();
}
#if UNITY_EDITOR
public void UpdateByUltraGetterEditor()
{
mf_Update();
}
#endif
//===============================================================
//Private member or function
//===============================================================
private uint m_handle = Handler.InvalidHandle;
[SerializeField]
private string m_name = "UnityGetter";
[SerializeField]
private bool m_is_started;
private bool m_need_restart;
private MapCtrlInfo m_map_info;
private MapCtrl m_map;
private Control[] m_controls;
private IDelegatable[] m_delegates;
interface IDelegatable
{
bool Setup(Control[] ctrls);
void Invoke();
}
public class DelegateFieldSetValue< T >: IDelegatable
{
public DelegateFieldSetValue(object mono, FieldInfo field, string name)
{
m_method = typeof(FieldInfo).GetMethod("SetValue", new[] { typeof(object), typeof(object) });
m_instance = field;
m_mono = mono;
m_name = name;
}
public bool Setup(Control[] ctrls)
{
foreach(Control ctrl in ctrls)
{
if (ctrl.name == m_name)
{
m_param_getter = ctrl.CreateParamGetter< T >();
return true;
}
}
return false;
}
public void Invoke()
{
//m_dele.DynamicInvoke(new object[] { m_mono, m_param_getter.val});
m_method.Invoke(m_instance, new object[] { m_mono, m_param_getter.val });
}
private string m_name;
private MethodInfo m_method;
private object m_instance;
private object m_mono;
private ParamGetter< T > m_param_getter;
}
private MapCtrlInfo m_map_ctrl_info
{
get
{
if (m_map_info == null)
{
m_map_info = new MapCtrlInfo();
}
return m_map_info;
}
}
private MapCtrl m_map_ctrl
{
get
{
if (m_map == null)
{
m_map = new MapCtrl();
}
return m_map;
}
}
private bool mf_HasHandle()
{
return m_handle != Handler.InvalidHandle && Handler.singleton.IsExisted(m_handle);
}
private void mf_Restart()
{
is_start = false;
is_start = true;
m_need_restart = false;
}
private void mf_Update()
{
if (m_need_restart)
{
mf_Restart();
}
if (!m_is_started)
{
return;
}
if (!mf_HasHandle())
{
m_handle = Handler.singleton.Create(m_name, 32);
return;
}
if (m_controls == null)
{
List<ControlInfo> lst_info = new List<ControlInfo>();
List<IDelegatable> lst_dele = new List<IDelegatable>();
mf_FindAttribues2(lst_info, lst_dele);
lst_info.AddRange(m_map_ctrl_info.Values);
m_controls = Handler.singleton.SetupGetter(m_handle, lst_info);
if (m_controls != null)
{
foreach(IDelegatable dele in lst_dele)
{
if(!dele.Setup(m_controls))
{
lst_dele.Remove(dele);
}
}
if (lst_dele.Count > 0)
{
m_delegates = lst_dele.ToArray();
}
foreach (Control ctrl in m_controls)
{
m_map_ctrl.Add(ctrl.name, ctrl);
}
if (EventComplemtedSetupGetter != null)
{
EventComplemtedSetupGetter(this);
}
}
return;
}
bool yes = Handler.singleton.CheckControls(m_handle);
if (!yes)
{
return;
}
if (m_delegates == null)
{
return;
}
foreach(IDelegatable dele in m_delegates)
{
dele.Invoke();
}
}
private void mf_Destroy()
{
if (Handler.is_singleton_lived)
{
Handler.singleton.Destroy(m_handle);
}
m_handle = Handler.InvalidHandle;
m_controls = null;
m_delegates = null;
if (m_map != null)
{
m_map.Clear();
}
}
/*
private void mf_FindAttribuesFromBehavior(List<ControlInfo> lst_info, List<IDelegatable> lst_delegate, object behavior, BindingFlags bingingFlag)
{
foreach (FieldInfo field in (behavior.GetType().GetFields(bingingFlag)))
{
UltraControlsAttribute attr_ultracontrols = null;
RangeAttribute attr_range = null;
foreach (object attribute in field.GetCustomAttributes(true))
{
{
var attr = attribute as UltraControlsAttribute;
if (attr != null && attr.binding_flag == UltraControlsAttribute.BindingFlag.Getter)
{
attr_ultracontrols = attr;
continue;
}
}
{
var attr = attribute as RangeAttribute;
if (attr != null)
{
attr_range = attr;
}
}
}//attributes
if (attr_ultracontrols == null)
{
continue;
}
ControlInfo info = null;
IDelegatable dele = null;
{
string name = (attr_ultracontrols.control_name == "") ? field.Name : attr_ultracontrols.control_name;
if (field.FieldType == typeof(string))
{
info = Factroy.CreateInfo(name, (string)field.GetValue(behavior));
dele = new DelegateFieldSetValue<string>(behavior, field, name);
}
else if (field.FieldType == typeof(float))
{
if (attr_range == null)
{
info = Factroy.CreateInfo(name, (float)field.GetValue(behavior));
}
else
{
info = Factroy.CreateInfo(name, (float)field.GetValue(behavior), attr_range.min, attr_range.max);
}
dele = new DelegateFieldSetValue<float>(behavior, field, name);
}
else if (field.FieldType == typeof(int))
{
if (attr_range == null)
{
info = Factroy.CreateInfo(name, (int)field.GetValue(behavior));
}
else
{
info = Factroy.CreateInfo(name, (int)field.GetValue(behavior), (int)attr_range.min, (int)attr_range.max);
}
dele = new DelegateFieldSetValue<int>(behavior, field, name);
}
else if (field.FieldType == typeof(Vector2))
{
info = Factroy.CreateInfo(name, (Vector2)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Vector2>(behavior, field, name);
}
else if (field.FieldType == typeof(Vector3))
{
info = Factroy.CreateInfo(name, (Vector3)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Vector3>(behavior, field, name);
}
else if (field.FieldType == typeof(Vector4))
{
info = Factroy.CreateInfo(name, (Vector4)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Vector4>(behavior, field, name);
}
else if (field.FieldType == typeof(Color))
{
info = Factroy.CreateInfo(name, (Color)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Color>(behavior, field, name);
}
else if (field.FieldType == typeof(Color32))
{
info = Factroy.CreateInfo(name, (Color32)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Color32>(behavior, field, name);
}
if (info != null)
{
lst_info.Add(info);
lst_delegate.Add(dele);
}
}
}//fields
}
*/
/*
private void mf_FindAttribuesFromComponent< Component > (List<ControlInfo> lst_info, List<IDelegatable> lst_delegate, BindingFlags bingingFlag)
{
var components = gameObject.GetComponentsInChildren< Component >(true);
foreach (Component component in components)
{
if (component == null)
continue;
mf_FindAttribuesFromBehavior(lst_info, lst_delegate, component, bingingFlag);
}//monos
}
*/
private void mf_FindAttribues2(List<ControlInfo> lst_info, List<IDelegatable> lst_delegate)
{
Utils.FindUltraControlsAttribues(this, UltraControlsAttribute.BindingFlag.Getter,
(object sender, object behavior, FieldInfo field, UltraControlsAttribute attr_ultracontrols, RangeAttribute attr_range) =>
{
ControlInfo info = null;
IDelegatable dele = null;
{
string name = (attr_ultracontrols.control_name == "") ? field.Name : attr_ultracontrols.control_name;
if (field.FieldType == typeof(string))
{
info = Factroy.CreateInfo(name, (string)field.GetValue(behavior));
dele = new DelegateFieldSetValue<string>(behavior, field, name);
}
else if (field.FieldType == typeof(float))
{
if (attr_range == null)
{
info = Factroy.CreateInfo(name, (float)field.GetValue(behavior));
}
else
{
info = Factroy.CreateInfo(name, (float)field.GetValue(behavior), attr_range.min, attr_range.max);
}
dele = new DelegateFieldSetValue<float>(behavior, field, name);
}
else if (field.FieldType == typeof(int))
{
if (attr_range == null)
{
info = Factroy.CreateInfo(name, (int)field.GetValue(behavior));
}
else
{
info = Factroy.CreateInfo(name, (int)field.GetValue(behavior), (int)attr_range.min, (int)attr_range.max);
}
dele = new DelegateFieldSetValue<int>(behavior, field, name);
}
else if (field.FieldType == typeof(Vector2))
{
info = Factroy.CreateInfo(name, (Vector2)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Vector2>(behavior, field, name);
}
else if (field.FieldType == typeof(Vector3))
{
info = Factroy.CreateInfo(name, (Vector3)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Vector3>(behavior, field, name);
}
else if (field.FieldType == typeof(Vector4))
{
info = Factroy.CreateInfo(name, (Vector4)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Vector4>(behavior, field, name);
}
else if (field.FieldType == typeof(Color))
{
info = Factroy.CreateInfo(name, (Color)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Color>(behavior, field, name);
}
else if (field.FieldType == typeof(Color32))
{
info = Factroy.CreateInfo(name, (Color32)field.GetValue(behavior));
dele = new DelegateFieldSetValue<Color32>(behavior, field, name);
}
if (info != null)
{
lst_info.Add(info);
lst_delegate.Add(dele);
}
}
});
//Utils.FindUltraControlsAttribues< >
}
/*
private void mf_FindAttribues(List<ControlInfo> lst_info, List<IDelegatable> lst_delegate)
{
BindingFlags bingingFlag = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public;
mf_FindAttribuesFromComponent< MonoBehaviour >(lst_info, lst_delegate, bingingFlag);
var animators = gameObject.GetComponentsInChildren<Animator>(true);
foreach (Animator animator in animators)
{
if (animator == null)
continue;
var behaviours = animator.GetBehaviours<StateMachineBehaviour>();
foreach(StateMachineBehaviour behaviour in behaviours)
{
mf_FindAttribuesFromBehavior(lst_info, lst_delegate, behaviour, bingingFlag);
}//behaviours
}//animators
}// mf_FindAttribues()
*/
}
}