using UnityEngine; using System.Collections.Generic; using System; using System.IO; namespace UltraControls { using MapCtrl = Dictionary; [ExecuteInEditMode] [Serializable] public class UltraSetter : MonoBehaviour/*, ISerializationCallbackReceiver*/ { public delegate void OnFoundGetter(UltraSetter sender); public event OnFoundGetter EventFoundGetter; public Control[] controls { get { return m_controls; } } 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 string filepath_settings { get { if (m_filepath_settings == "") { return Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_relative_filepath_settings_default); } return m_filepath_settings; } set { m_filepath_settings = value; } } //=============================================================== //MonoBehaviour //=============================================================== void Awake() { m_map = new MapCtrl(); } void Start() { } void Update() { mf_Update(); } void OnDisable() { mf_Destroy(); } //void OnGUI() //{ // Transform trans = gameObject.GetComponent(); // Camera cam = Camera.current; // if (cam == null) // { // return; // } // // Vector3 pos = cam.WorldToScreenPoint(trans.position); // GUI.Label(new Rect(pos.x, pos.y, 100, 20), "id=" + m_identifierInFile); //} void OnTransformParentChanged() { m_relative_filepath_settings_default = Path.Combine(Utils.GetRelativeDefaultDir(), mf_PleaseCallMyRealName() + ".json"); } //=============================================================== //ISerializationCallbackReceiver //=============================================================== //public void OnBeforeSerialize() //{ // //} // //public void OnAfterDeserialize() //{ // //} //=============================================================== //Other //=============================================================== public bool SaveSettings() { string json_text = Utils.ToJson(m_controls); File.WriteAllText(filepath_settings, json_text); return true; } public bool LoadSettings() { if (!File.Exists(filepath_settings)) { return false; } var sr = File.OpenText(filepath_settings); var json = sr.ReadToEnd(); Utils.FromJson(json, m_controls); return true; } public ParamSetter< T > GetParamSetter< T > (string name) { Control ctrl; if (!m_map_ctrl.TryGetValue(name, out ctrl)) { return null; } return ctrl.CreateParamSetter(); } #if UNITY_EDITOR public bool UpdateIdentifierInFile() { if (m_identifierInFile > 0) { return false; } long identifierInFile = Utils.GetLocalIdentifierInFileForObject(this); if (identifierInFile != m_identifierInFile) { m_identifierInFile = identifierInFile; if (m_identifierInFile > 0 && m_relative_filepath_settings_default == "") { m_relative_filepath_settings_default = Path.Combine(Utils.GetRelativeDefaultDir(), mf_PleaseCallMyRealName() + ".json"); } return true; } return false; } public void UpdateByUltraSetterEditor() { mf_Update(); } #endif //=============================================================== //Private member or function //=============================================================== private uint m_handle = Handler.InvalidHandle; private Control[] m_controls; private MapCtrl m_map; [SerializeField] private string m_name = "ResolumeArena"; [SerializeField] private bool m_is_started = false; [SerializeField] private bool m_auto_load_after_finding_getter = true; [SerializeField] private long m_identifierInFile = -1; [SerializeField] private string m_filepath_settings = ""; [SerializeField] private string m_relative_filepath_settings_default = ""; private string mf_PleaseCallMyRealName() { string real_name = "UltraSetter"; Transform trans = this.transform; while (trans != null) { real_name = trans.gameObject.name + "-" + real_name; trans = trans.parent; } real_name = "[" + m_name + "]" + real_name; if (m_identifierInFile >= 0) { real_name += "-" + m_identifierInFile; } return real_name; } private bool mf_HasHandle() { return m_handle != Handler.InvalidHandle && Handler.singleton.IsExisted(m_handle); } private void mf_Destroy() { if (Handler.is_singleton_lived) { Handler.singleton.Destroy(m_handle); } m_handle = Handler.InvalidHandle; m_controls = null; if (m_map != null) { m_map.Clear(); } } private MapCtrl m_map_ctrl { get { if (m_map == null) { m_map = new MapCtrl(); } return m_map; } } private void mf_Update() { if (!m_is_started) { return; } if (!mf_HasHandle()) { m_handle = Handler.singleton.Create(m_name, 32); return; } if (m_controls == null) { m_controls = Handler.singleton.FindGetter(m_handle); if (m_controls != null) { if (m_auto_load_after_finding_getter) { LoadSettings(); } foreach(Control ctrl in m_controls) { m_map_ctrl.Add(ctrl.name, ctrl); } if (EventFoundGetter != null) { EventFoundGetter(this); } } return; } Handler.singleton.SetControls(m_handle); } } }