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.

316 lines
7.9 KiB

using UnityEngine;
using System.Collections.Generic;
using System;
using System.IO;
namespace UltraControls
{
using MapCtrl = Dictionary<string, Control>;
[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<Transform>();
// 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<T>();
}
#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);
}
}
}