using UnityEngine; using System.Collections.Generic; using System.Reflection; using System; namespace UltraControls { using MapCtrlInfo = Dictionary; using MapCtrl = Dictionary; 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(name, val, min, max) ); return true; } public bool AddControlInfo(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(name, val)); return true; } public void RemoveControlInfo(string name) { if (is_start) { m_need_restart = true; } m_map_ctrl_info.Remove(name); } public ParamGetter GetParamGetter(string name) { Control ctrl; if (!m_map_ctrl.TryGetValue(name, out ctrl)) { return null; } return ctrl.CreateParamGetter(); } 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 lst_info = new List(); List lst_dele = new List(); 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 lst_info, List 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(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(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(behavior, field, name); } else if (field.FieldType == typeof(Vector2)) { info = Factroy.CreateInfo(name, (Vector2)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Vector3)) { info = Factroy.CreateInfo(name, (Vector3)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Vector4)) { info = Factroy.CreateInfo(name, (Vector4)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Color)) { info = Factroy.CreateInfo(name, (Color)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Color32)) { info = Factroy.CreateInfo(name, (Color32)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } if (info != null) { lst_info.Add(info); lst_delegate.Add(dele); } } }//fields } */ /* private void mf_FindAttribuesFromComponent< Component > (List lst_info, List 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 lst_info, List 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(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(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(behavior, field, name); } else if (field.FieldType == typeof(Vector2)) { info = Factroy.CreateInfo(name, (Vector2)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Vector3)) { info = Factroy.CreateInfo(name, (Vector3)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Vector4)) { info = Factroy.CreateInfo(name, (Vector4)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Color)) { info = Factroy.CreateInfo(name, (Color)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } else if (field.FieldType == typeof(Color32)) { info = Factroy.CreateInfo(name, (Color32)field.GetValue(behavior)); dele = new DelegateFieldSetValue(behavior, field, name); } if (info != null) { lst_info.Add(info); lst_delegate.Add(dele); } } }); //Utils.FindUltraControlsAttribues< > } /* private void mf_FindAttribues(List lst_info, List lst_delegate) { BindingFlags bingingFlag = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public; mf_FindAttribuesFromComponent< MonoBehaviour >(lst_info, lst_delegate, bingingFlag); var animators = gameObject.GetComponentsInChildren(true); foreach (Animator animator in animators) { if (animator == null) continue; var behaviours = animator.GetBehaviours(); foreach(StateMachineBehaviour behaviour in behaviours) { mf_FindAttribuesFromBehavior(lst_info, lst_delegate, behaviour, bingingFlag); }//behaviours }//animators }// mf_FindAttribues() */ } }