Model.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using System.Collections.Generic;
  2. using UnityEngine.Events;
  3. using UnityEngine.UI;
  4. namespace WS
  5. {
  6. ///<summary>属性绑定基类</summary>
  7. public class BindablePropertyBase : WSComponent
  8. {
  9. }
  10. ///<summary>属性绑定</summary>
  11. public class BindableProperty<T> : BindablePropertyBase
  12. {
  13. ///<summary>回调</summary>
  14. public UnityAction<T> OnValueChanged;
  15. private T _value;
  16. ///<summary></summary>
  17. public T Value
  18. {
  19. get { return _value; }
  20. set
  21. {
  22. if (!Equals(_value, value))
  23. {
  24. _value = value;
  25. OnValueChanged?.Invoke(_value);
  26. }
  27. }
  28. }
  29. public override void Dispose()
  30. {
  31. base.Dispose();
  32. OnValueChanged = null;
  33. _value = default(T);
  34. }
  35. }
  36. ///<summary>模型</summary>
  37. public abstract class Model : WSComponent
  38. {
  39. //<summary>属性</summary>
  40. private List<BindablePropertyBase> Propertys = new List<BindablePropertyBase>();
  41. ///<summary>UI事件</summary>
  42. private List<UnityEventBase> UnityEvents = new List<UnityEventBase>();
  43. ///<summary>创建属性</summary>
  44. public BindableProperty<T> CreateProperty<T>()
  45. {
  46. BindableProperty<T> property = ComponentFactory.CreateWithParent<BindableProperty<T>>(this);
  47. Propertys.Add(property);
  48. return property;
  49. }
  50. ///<summary>ViewModel属性初始化</summary>
  51. public abstract void InitProperty();
  52. /// <summary>绑定属性</summary>
  53. /// <param name="inputfield">输入框</param>
  54. /// <param name="property">属性 string</param>
  55. /// <param name="valueChanged">属性值改变回调</param>
  56. public void Bind(InputField inputfield, BindableProperty<string> property, UnityAction<string> valueChanged = null)
  57. {
  58. property.OnValueChanged += delegate
  59. {
  60. inputfield.text = property.Value;
  61. valueChanged?.Invoke(property.Value);
  62. };
  63. inputfield.onValueChanged.AddListener((x) =>
  64. {
  65. property.Value = x;
  66. });
  67. UnityEvents.Add(inputfield.onValueChanged);
  68. }
  69. /// <summary>绑定属性</summary>
  70. /// <param name="inputfield">输入框</param>
  71. /// <param name="property">属性 string</param>
  72. /// <param name="valueChanged">属性值改变回调</param>
  73. public void Bind(TMPro.TMP_InputField inputfield, BindableProperty<string> property, UnityAction<string> valueChanged = null)
  74. {
  75. property.OnValueChanged += delegate
  76. {
  77. inputfield.text = property.Value;
  78. valueChanged?.Invoke(property.Value);
  79. };
  80. inputfield.onValueChanged.AddListener((x) =>
  81. {
  82. property.Value = x;
  83. });
  84. UnityEvents.Add(inputfield.onValueChanged);
  85. }
  86. /// <summary>绑定属性</summary>
  87. /// <param name="inputfield">输入框</param>
  88. /// <param name="property">属性 int</param>
  89. /// <param name="valueChanged">属性值改变回调</param>
  90. public void Bind(InputField inputfield, BindableProperty<int> property, UnityAction<int> valueChanged = null)
  91. {
  92. property.OnValueChanged += delegate
  93. {
  94. inputfield.text = property.Value.ToString();
  95. valueChanged?.Invoke(property.Value);
  96. };
  97. inputfield.onValueChanged.AddListener((x) =>
  98. {
  99. int num = int.Parse(x);
  100. property.Value = num;
  101. });
  102. UnityEvents.Add(inputfield.onValueChanged);
  103. }
  104. /// <summary>绑定属性</summary>
  105. /// <param name="inputfield">输入框</param>
  106. /// <param name="property">属性 long</param>
  107. /// <param name="valueChanged">属性值改变回调</param>
  108. public void Bind(InputField inputfield, BindableProperty<long> property, UnityAction<long> valueChanged = null)
  109. {
  110. property.OnValueChanged += delegate
  111. {
  112. inputfield.text = property.Value.ToString();
  113. valueChanged?.Invoke(property.Value);
  114. };
  115. inputfield.onValueChanged.AddListener((x) =>
  116. {
  117. long num = long.Parse(x);
  118. property.Value = num;
  119. });
  120. UnityEvents.Add(inputfield.onValueChanged);
  121. }
  122. /// <summary>绑定属性</summary>
  123. /// <param name="text">文本框</param>
  124. /// <param name="property">属性</param>
  125. public void Bind(Text text, BindableProperty<string> property)
  126. {
  127. text.text = property.Value;
  128. property.OnValueChanged += (x) =>
  129. {
  130. text.text = property.Value.ToString();
  131. };
  132. }
  133. /// <summary>绑定属性</summary>
  134. /// <typeparam name="T">类型</typeparam>
  135. /// <param name="text">文本框</param>
  136. /// <param name="property">属性</param>
  137. public void Bind<T>(Text text, BindableProperty<T> property)
  138. {
  139. text.text = property.Value.ToString();
  140. property.OnValueChanged += (x) =>
  141. {
  142. text.text = property.Value.ToString();
  143. };
  144. }
  145. /// <summary>绑定属性</summary>
  146. /// <param name="toggle">开关</param>
  147. /// <param name="property">属性</param>
  148. /// <param name="valueChanged">属性值改变回调</param>
  149. public void Bind(Toggle toggle, BindableProperty<bool> property, UnityAction<bool> valueChanged = null)
  150. {
  151. property.OnValueChanged += delegate
  152. {
  153. toggle.isOn = property.Value;
  154. valueChanged?.Invoke(property.Value);
  155. };
  156. toggle.onValueChanged.AddListener((x) =>
  157. {
  158. property.Value = x;
  159. });
  160. UnityEvents.Add(toggle.onValueChanged);
  161. }
  162. /// <summary>绑定属性</summary>
  163. /// <param name="slider">滑杆</param>
  164. /// <param name="property">属性</param>
  165. /// <param name="valueChanged">属性值改变回调</param>
  166. public void Bind(Slider slider, BindableProperty<float> property, UnityAction<float> valueChanged = null)
  167. {
  168. property.OnValueChanged += delegate
  169. {
  170. slider.value = property.Value;
  171. valueChanged?.Invoke(property.Value);
  172. };
  173. slider.onValueChanged.AddListener((x) =>
  174. {
  175. property.Value = x;
  176. });
  177. UnityEvents.Add(slider.onValueChanged);
  178. }
  179. /// <summary>绑定属性</summary>
  180. /// <param name="scrollbar">滚动条</param>
  181. /// <param name="property">属性</param>
  182. /// <param name="valueChanged">属性值改变回调</param>
  183. public void Bind(Scrollbar scrollbar, BindableProperty<float> property, UnityAction<float> valueChanged = null)
  184. {
  185. property.OnValueChanged += delegate
  186. {
  187. scrollbar.value = property.Value;
  188. valueChanged?.Invoke(property.Value);
  189. };
  190. scrollbar.onValueChanged.AddListener((x) =>
  191. {
  192. property.Value = x;
  193. });
  194. UnityEvents.Add(scrollbar.onValueChanged);
  195. }
  196. /// <summary>绑定属性</summary>
  197. /// <param name="dropdown">下拉框</param>
  198. /// <param name="property">属性</param>
  199. /// <param name="valueChanged">属性值改变回调</param>
  200. public void Bind(Dropdown dropdown, BindableProperty<int> property, UnityAction<int> valueChanged = null)
  201. {
  202. property.OnValueChanged += delegate
  203. {
  204. dropdown.value = property.Value;
  205. valueChanged?.Invoke(property.Value);
  206. };
  207. dropdown.onValueChanged.AddListener((x) =>
  208. {
  209. property.Value = x;
  210. });
  211. UnityEvents.Add(dropdown.onValueChanged);
  212. }
  213. /// <summary>点击方法绑定</summary>
  214. /// <param name="button">按钮</param>
  215. /// <param name="onClick">按钮点击回调</param>
  216. public void Bind(Button button, UnityAction onClick)
  217. {
  218. button.onClick.AddListener(delegate
  219. {
  220. UnityEngine.EventSystems.EventSystem.current.SetSelectedGameObject(null);
  221. onClick.Invoke();
  222. });
  223. UnityEvents.Add(button.onClick);
  224. }
  225. public override void Dispose()
  226. {
  227. base.Dispose();
  228. for (int i = 0; i < UnityEvents.Count; i++)
  229. {
  230. UnityEvents[i].RemoveAllListeners();
  231. }
  232. UnityEvents.Clear();
  233. for (int i = 0; i < Propertys.Count; i++)
  234. {
  235. Propertys[i].Dispose();
  236. }
  237. Propertys.Clear();
  238. }
  239. }
  240. }