ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2024ǯ01·î07Æü(Æü) 11:23:52ÍúÎò
¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¡¢°Û¤Ê¤ë¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÄÌ¿®¤òÃç²ð¤¹¤ë¥Ç¥¶¥¤¥ó¥Ñ¥¿¡¼¥ó¤Ç¤¹¡£
¡¡º£²ó¤ÎÎã¤Ç¤Ï¡¢UI ¤ÎÀ©¸æ¼Ô(UIController ¥¯¥é¥¹¡¢UIManager ¥¯¥é¥¹) ¤È¤·¤Æ¡¢Mediator ¥Ñ¥¿¡¼¥ó¤òºÎÍѤ·¤¿Îã¤Ç¤¹¡£
¡¡UI ɽ¼¨¤¹¤ëºÝ¡¢Mediator ÍѤΥ¯¥é¥¹Æâ¤Î List Æâ¤Ë¤¢¤ë»ØÄꤵ¤ì¤¿ View ¤òɽ¼¨¤·¤¿¤ê¡¢
°ÊÁ°É½¼¨¤µ¤ì¤Æ¤¤¤¿ View ¤ËÌá¤Ã¤¿¤ê¤È¤¤¤Ã¤¿µóư¤¬¼Â¸½²Äǽ¤Ç¤¹¡£
¡¡View ¤òÌ᤹¥±¡¼¥¹¤Ë¤ª¤¤¤Æ¤Ï¡¢£±¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤ò³«¤¡¢¤½¤ÎÃæ¤Ç¤µ¤é¤ËÊ̤Σ²¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤ò³«¤¤¤¿¤È¤·¤Þ¤¹¡£
¤½¤Î¾ì¹ç¡¢£±¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤òÈóɽ¼¨¤Ë¤·¤Þ¤¹¡£
¡¡¤³¤Î¤È¤¡¢Mediator ¥Ñ¥¿¡¼¥ó¤òÍøÍѤ·¤Æ¼ÂÁõ¤ò¤ª¤³¤Ê¤Ã¤Æ¤ª¤¯¤³¤È¤Ç¡¢£²¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤¬ÊĤ¸¤¿¥¿¥¤¥ß¥ó¥°¤Ç
ºÇ½é¤Ë³«¤¤¤Æ¤¤¤¿£±¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤òºÆÉ½¼¨¤¹¤ë¤è¤¦¤Êµóư¤¬É½¸½½ÐÍè¤Þ¤¹¡£
¡¡¤â¤Á¤í¤ó¡¢UI´ÉÍý°Ê³°¤Ë¤â¤µ¤Þ¤¶¤Þ¤Ê¾ìÌ̤Ç͸ú¤Ç¤¹¡£
¥×¥ì¥¤¥ä¡¼¤ÎÆÃÄê¤Î¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤¿»þ¤Ë¡¢Mediator ÍѤΥ¯¥é¥¹¤¬Â¾¤Î¥¯¥é¥¹(Ũ)¤ËÌ¿Îá¤ò½Ð¤·¤¿¤ê¡¢
°Û¤Ê¤ë¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È(¥³¥ó¥Ý¡¼¥Í¥ó¥È¡¦¥¯¥é¥¹)¤¬¤ª¸ß¤¤¤ËľÀܰ͸¤»¤º¡¢Mediator ¤ò²ð¤·¤ÆÄÌ¿®¤¹¤ë¤³¤È¤Ç½ÀÆðÀ¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¡¢Â¿¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÄ´À°¤äÄÌ¿®¤òÃæ±û¤Ë°ÌÃÖ¤¹¤ë Mediator(Ãç²ð¼Ô¡¦Ä´Ää¼Ô) ¥¯¥é¥¹¤Ë°ÑǤ¤¹¤ëÀ߷ץѥ¿¡¼¥ó¤Ç¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢³Æ¥ª¥Ö¥¸¥§¥¯¥È¤¬Ä¾ÀÜÄÌ¿®¤»¤º¡¢Ãæ±û¤Î Mediator ¤ò²ð¤·¤ÆÁê¸ß¤Ë¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤¹¤ë¤³¤È¤¬²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£
¡¡UIManager¤¬°Û¤Ê¤ëUIÍ×ÁÇ¡ÊView¥¯¥é¥¹¤Ê¤É¡Ë¤òÀ©¸æ¤·¡¢Ä´À°¤¹¤ë¤³¤È¤Ç¡¢³ÆUIÍ×ÁǤ¬¤ª¸ß¤¤¤ËľÀÜÄÌ¿®¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢
UIManager¡ÊMediator¡Ë¤ò²ð¤·¤ÆÁê¸ß¤Ë¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤¹¤ë·Á¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢³ÆUIÍ×ÁǤÏÁê¸ß¤ËÁ·ë¹ç¤Ë¤Ê¤ê¡¢³ÈÄ¥¤äÊѹ¹¤¬¤·¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£
¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¡¢ÆÃ¤ËÂ絬ÌϤÇÊ£»¨¤Ê¥·¥¹¥Æ¥à¤ä¡¢°Û¤Ê¤ëÉôʬ¤¬Á·ë¹ç¤Ç¤¢¤ë¤³¤È¤¬Ë¾¤Þ¤·¤¤¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£
UI ¥³¥ó¥È¥í¡¼¥é¡¼¤¬ UI Í×ÁǤòÃæ±û¤ËÇÛÃÖ¤·¤Æ¤¤¤ë¤è¤¦¤Ê¾ìÌ̤Ǥϡ¢Mediator ¥Ñ¥¿¡¼¥ó¤Î¹Í¤¨Êý¤¬³èÍѤǤ¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
¡¡¤Þ¤¿¡¢UI ¤Ë¤Ä¤¤¤Æ¤Ï Observer¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁǤ⸺ߤ¹¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢UIManager¤¬ÆÃÄê¤Î¥¤¥Ù¥ó¥È¡Ê¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯¤Ê¤É¡Ë¤ËÂФ·¤ÆÄÌÃΤòȯ¹Ô¤·¡¢¤½¤ì¤ËÂФ·¤ÆUIÍ×ÁǤ¬È¿±þ¤¹¤ë¤è¤¦¤Ê¾ì¹ç¤Ç¤¹¡£
¤³¤Î¾ì¹ç¡¢UIManager¤¬Èï´Ñ»¡¼Ô¤Ç¤¢¤ê¡¢UIÍ×ÁǤ¬´Ñ»¡¼Ô¤È¤Ê¤ê¤Þ¤¹¡£
¡¡UIManager ¤ò Presenter ¤È¤¹¤ë¤Ê¤é¤Ð¡¢MVP ¥Ñ¥¿¡¼¥ó¤Ë¤è¤ëÀ߷פâ²Äǽ¤Ç¤¹¡£
¡¡¤½¤Î¤¿¤á¡¢Ê£¿ô¤Î¥Ç¥¶¥¤¥ó¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁǤò¼è¤êÆþ¤ì¤¿À߷פˤè¤ë¥¢¥×¥í¡¼¥Á¤¬Í¸ú¤Ç¤¹¡£
¡¡UI À©¸æÍѤδðÄ쥯¥é¥¹¤òºîÀ®¤·¡¢ÇÉÀ¸¥¯¥é¥¹¤ò¥µ¥ó¥×¥ë¤È¤·¤Æ£²¤ÄºîÀ®¤·¤Þ¤¹¡£
¤½¤Î¸å¡¢Mediator ÍѤΥ¯¥é¥¹¤òºîÀ®¤·¤Þ¤¹¡£
¡¡UniRx¡¢UniTask ¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£
MicroSoft
Ãê¾Ý²½ (Ãê¾Ý·¿¤ª¤è¤Ó¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹)
https://learn.microsoft.com/ja-jp/dotnet/standard/...
¡¡UI À©¸æÍѤδðÄ쥯¥é¥¹¤Ç¤¹¡£
¡¡Canvas ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤¬¥¢¥¿¥Ã¥Á¤µ¤ì¤Æ¤¤¤ë¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¿¥Ã¥Á¤·¤ÆÍøÍѤ¹¤ëÁ°Äó¤Ç¤¹¡£
using System; using UniRx; using UnityEngine; public abstract class View : MonoBehaviour { // ¶ñÂÎŪ¤ÊUI¥¤¥Ù¥ó¥È¤ò¸ø³« public virtual IObservable<Unit> OnClickObservable { get; } protected Canvas canvas; protected void Reset() { if(TryGetComponent(out canvas)) { Debug.Log($"{canvas} ¼èÆÀ¤·¤Þ¤·¤¿"); } } /// <summary> /// Initializes the View /// </summary> public abstract void Initialize(); /// <summary> /// Makes the View visible /// </summary> public virtual void Show() { canvas.enabled = true; } /// <summary> /// Hides the view /// </summary> public virtual void Hide() { canvas.enabled = false; } }
¡¡UI ¤Î¾ì¹ç¡¢¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò SetActive ¤ÇÀÚ¤êÂØ¤¨¤Æ¤·¤Þ¤¦¤È¡¢true ¤Ë¤Ê¤Ã¤¿ºÝ¤ËºÆÉÁ²è½èÍý¤¬Áö¤ê¤Þ¤¹¡£
¡¡Canvas ¤ò enabled ¤ÇÀÚ¤êÂØ¤¨¤¿¾ì¹ç¤Ë¤ÏºÆÉÁ²è½èÍý¤ÏÁö¤ê¤Þ¤»¤ó¤Î¤Ç¡¢¤³¤Á¤é¤ÎÊý¤¬Éé²Ù¤Î¤«¤«¤é¤Ê¤¤É½¼¨ÀÚ¤êÂØ¤¨½èÍý¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡DOTween ¤Ç¥¢¥Ë¥áÉÕ¤Îɽ¼¨À©¸æ¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢CanvasGroup ¤ò DOFade ¥á¥½¥Ã¥É¤Çɽ¼¨À©¸æ¤·¤Ä¤Ä¡¢Blocks Raycast ¤ÎÀÚ¤êÂØ¤¨¤ò¹Ô¤¦¤è¤¦¤Ë¤·¤ÆÂбþ¤·¤Þ¤¹¡£
using System; using UniRx; using UnityEngine; using UnityEngine.UI; public class SubClassButtonView : View { [SerializeField] protected Button btnUI; // º£²ó¤Ï¥Ü¥¿¥ó¤Èɳ¤Å¤±¤ë(¥Þ¥Ã¥Ô¥ó¥°¤¹¤ë) public override IObservable<Unit> OnClickObservable => btnUI.OnClickAsObservable(); public override void Initialize() { // UniRx¤ò»ÈÍѤ·¤Æ¥¤¥Ù¥ó¥È¤òÅÐÏ¿¤¹¤ëÎã OnClickObservable .ThrottleFirst(TimeSpan.FromSeconds(1.0f)) .Subscribe(_ => Debug.Log($"Button Click")) .AddTo(this); } }
using System; using UniRx; using UnityEngine; using UnityEngine.UI; public class SubClassInputFieldView : View { [SerializeField] protected InputField inputFieldUI; // InputField ¤Èɳ¤Å¤±¤ë(¥Þ¥Ã¥Ô¥ó¥°¤¹¤ë) public IObservable<string> OnValueChangedObservable => inputFieldUI.OnValueChangedAsObservable(); public override void Initialize() { // UniRx¤ò»ÈÍѤ·¤ÆInputField¤Î¥¤¥Ù¥ó¥È¤òÅÐÏ¿¤¹¤ëÎã OnValueChangedObservable .ThrottleFirst(TimeSpan.FromSeconds(1.0f)) .Subscribe(value => Debug.Log($"InputField Value Changed: {value}")) .AddTo(this); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// ÇÉÀ¸¥¯¥é¥¹¤ËÂФ¹¤ë¥·¥ó¥°¥ë¥È¥ó¤Î´ðËܵ¡Ç½¤òÄ󶡤¹¤ëÃê¾Ý¥¯¥é¥¹ /// </summary> /// <typeparam name="T">¥·¥ó¥°¥ë¥È¥ó¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î·¿</typeparam> public abstract class AbstractSingleton<T> : MonoBehaviour where T : Component { ¡¡¡¡static T Instance; /// <summary> /// static Singleton instance /// </summary> public static T Instance { get { if (Instance == null) { Instance = FindObjectOfType<T>(); if (Instance == null) { GameObject obj = new GameObject(); obj.name = typeof(T).Name; Instance = obj.AddComponent<T>(); } } return Instance; } } protected virtual void Awake() { if (Instance == null) { Instance = this as T; } else { Destroy(gameObject); } } }
¡¡´ðÄ쥯¥é¥¹ View ¤ò·Ñ¾µ¤·¤Æ¤¤¤ëÇÉÀ¸¥¯¥é¥¹¤ò List ¤Ç´ÉÍý¤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Ê£¿ô¤Î View ¤ò Mediator ¤¬´ÉÍý¤¹¤ë·Á¤ò¼è¤ê¤Þ¤¹¡£
¡¡List Æâ¤Ë¤¢¤ë»ØÄꤵ¤ì¤¿ View ¤òɽ¼¨¤·¤¿¤ê¡¢
°ÊÁ°É½¼¨¤µ¤ì¤Æ¤¤¤¿ View ¤ËÌá¤Ã¤¿¤ê¤È¤¤¤Ã¤¿¡¢UI ɽ¼¨¤òÀ©¸æ¤·¤¿¤ê¤¹¤ë¤³¤È¤¬º£²ó¤Î Mediator ¤ÎÌÜŪ¤Ë¤Ê¤ê¤Þ¤¹¡£
using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class UIManager : AbstractSingleton<UIManager> { [SerializeField] Canvas m_Canvas; [SerializeField] RectTransform m_Root; [SerializeField] RectTransform m_BackgroundLayer; [SerializeField] RectTransform m_ViewLayer; List<View> m_Views; View m_CurrentView; readonly Stack<View> m_History = new(); void Start() { m_Views = m_Root.GetComponentsInChildren<View>(true).ToList(); Init(); ¡¡¡¡¡¡¡¡// TODO Canvas ¤Î¥ê¥µ¥¤¥º¤Ê¤É } void Init() { // foreach (var view in m_Views) // view.Hide(); // ¾åµ¤ò LINQ ¤Ç½ñ¤¤¤¿¾ì¹ç m_Views.ForEach(view => view.Hide()); m_History.Clear(); } /// <summary> /// »ØÄꤵ¤ì¤¿·¿¤ÎºÇ½é¤ËÅÐÏ¿¤µ¤ì¤¿ UI View ¤ò¸¡º÷¤·¤Þ¤¹ /// </summary> /// <typeparam name="T">¸¡º÷ÂоݤΠView ¥¯¥é¥¹</typeparam> /// <returns>»ØÄꤵ¤ì¤¿·¿¤Î View ¥¤¥ó¥¹¥¿¥ó¥¹¡£¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ï null </returns> public T GetView<T>() where T : View { // foreach (var view in m_Views) { // if (view is T tView) { // return tView; // } // } // // return null; // ¾åµ¤ò LINQ ¤Ç½ñ¤¤¤¿¾ì¹ç return m_Views.OfType<T>().FirstOrDefault(); // ¼Â¹ÔÌ¿ÎáÎã // m_Hud = UIManager.Instance.GetView<Hud>(); } /// <summary> /// »ØÄꤵ¤ì¤¿·¿¤Î View ¤ò¸¡º÷¤·¤ÆÉ½¼¨¤¹¤ë /// </summary> /// <param name="keepInHistory">Ìá¤ë¾ì¹ç¤Ë¸½ºß¤Î View ¤òÍúÎò¥¹¥¿¥Ã¥¯¤ËÄɲ乤뤫¤É¤¦¤«</param> /// <typeparam name="T">¸¡º÷ÂоݤΠView ¥¯¥é¥¹</typeparam> public void Show<T>(bool keepInHistory = true) where T : View { // foreach (var view in m_Views) { // if (view is T) { // Show(view, keepInHistory); // break; // } // } // ¾åµ¤ò LINQ ¤Ç½ñ¤¤¤¿¾ì¹ç var targetView = m_Views.OfType<T>().SingleOrDefault(); // FirstOrDefault ¤Ç¤â¤è¤¤ if (targetView != null) { Show(targetView, keepInHistory); } // ¼Â¹ÔÌ¿ÎáÎã // UIManager.Instance.Show<SettingsMenu>(); // UIManager.Instance.Show<ShopView>(); } /// <summary> /// View ¤òɽ¼¨¤·¡¢Â¾¤Î View ¤òÈóɽ¼¨¤Ë¤¹¤ë /// </summary> /// <param name="view">ɽ¼¨¤¹¤ë View</param> /// <param name="keepInHistory">Ìá¤ë¾ì¹ç¤Ë¸½ºß¤Î View ¤òÍúÎò¥¹¥¿¥Ã¥¯¤ËÄɲ乤뤫¤É¤¦¤«</param> public void Show(View view, bool keepInHistory = true) { if (m_CurrentView != null) { if (keepInHistory) { m_History.Push(m_CurrentView); } m_CurrentView.Hide(); } view.Show(); m_CurrentView = view; // ¼Â¹ÔÌ¿ÎáÎã // Show(view, keepInHistory); // Show¥á¥½¥Ã¥ÉÆâ // Show(m_History.Pop(), false); // GoBack ¥á¥½¥Ã¥ÉÆâ } /// <summary> /// °ÊÁ°¤Ëɽ¼¨¤µ¤ì¤Æ¤¤¤¿¥Ú¡¼¥¸¤ËÌá¤ë /// </summary> public void GoBack() { if (m_History.Count != 0) { Show(m_History.Pop(), false); } } }
¡¡MVP¡ÊModel-View-Presenter¡Ë¥Ñ¥¿¡¼¥ó¤ÈObserver¥Ñ¥¿¡¼¥ó¤Ï¡¢
°Û¤Ê¤ë´ÑÅÀ¤Ç¥·¥¹¥Æ¥à¤Î¹½Â¤¤òÀ°Íý¤¹¤ë¤â¤Î¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¤ÎÌò³ä¤äÌÜŪ¤¬°Û¤Ê¤ê¤Þ¤¹¡£
¡¡°Ê²¼¤Ë¡¢MVP¥Ñ¥¿¡¼¥ó¤ÈObserver¥Ñ¥¿¡¼¥ó¤Î¼ç¤Ê°ã¤¤¤ò¼¨¤·¤Þ¤¹¡£
¡¡¡¡MVP¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¡Ç½¤ò¥â¥Ç¥ë¡¢¥Ó¥å¡¼¡¢¥×¥ì¥¼¥ó¥¿¡¼¤Î3¤Ä¤Î¼çÍפʥ³¥ó¥Ý¡¼¥Í¥ó¥È¤ËʬΥ¤·¡¢¤½¤ì¤¾¤ì¤ÎÀÕ̳¤òÌÀ³Î¤Ë¤·¤Þ¤¹¡£
¡¡¼ç¤ËUI¥í¥¸¥Ã¥¯¤òÁ·ë¹ç¤Ë¤·¡¢¥Æ¥¹¥ÈÍÆ°×À¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤òÌÜŪ¤È¤·¤Þ¤¹¡£
¡¡¡¡¥â¥Ç¥ë¡Ê¥Ç¡¼¥¿¤È¥Ó¥¸¥Í¥¹¥í¥¸¥Ã¥¯¡Ë¤È¥Ó¥å¡¼¡Ê¥æ¡¼¥¶¡¼¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¡Ë¤Î´Ö¤ÎÄÌ¿®¤Ï¡¢¥×¥ì¥¼¥ó¥¿¡¼¤ò²ð¤·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£
¡¡¥×¥ì¥¼¥ó¥¿¡¼¤Ï¥â¥Ç¥ë¤ÎÊѹ¹¤ò¸¡ÃΤ·¡¢¤½¤ì¤Ë´ð¤Å¤¤¤Æ¥Ó¥å¡¼¤ò¹¹¿·¤·¤Þ¤¹¡£
¡¡¥Ç¡¼¥¿¥Õ¥í¡¼¤Ï°ìÊý¸þ¤Ç¤¹¡£¥â¥Ç¥ë¤«¤é¥Ó¥å¡¼¤Ø¤ÎÄÌÃΤȡ¢¥Ó¥å¡¼¤«¤é¥â¥Ç¥ë¤Ø¤Î¥æ¡¼¥¶¡¼¥¢¥¯¥·¥ç¥ó¤ÎÅÁ㤬¤¢¤ê¤Þ¤¹¡£
¡¡¡¡Observer¥Ñ¥¿¡¼¥ó¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѲ½¤ò´Ñ»¡¤·¡¢¤½¤ÎÊѲ½¤ò°Í¸´Ø·¸¤Ë¤¢¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ËÄÌÃΤ¹¤ë¤³¤È¤òÌÜŪ¤È¤·¤Þ¤¹¡£¼ç¤Ë¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁ·ë¹ç¤òÄ󶡤·¤Þ¤¹¡£
¡¡¡¡´Ñ»¡¼Ô¡ÊObserver¡Ë¤ÈÈï´Ñ»¡¼Ô¡ÊSubject¡Ë¤Î2¤Ä¤Î¼çÍפÊÌò³ä¤¬¤¢¤ê¤Þ¤¹¡£Èï´Ñ»¡¼Ô¤¬Êѹ¹¤¬¤¢¤ë¤È¡¢¤½¤ì¤Ë±þ¤¸¤ÆÅÐÏ¿¤µ¤ì¤¿´Ñ»¡¼Ô¤ËÄÌÃΤ·¤Þ¤¹¡£
¡¡¡¡¥Ç¡¼¥¿¥Õ¥í¡¼¤ÏÄ̾Èï´Ñ»¡¼Ô¤«¤é´Ñ»¡¼Ô¤Ë¸þ¤«¤¦°ìÊý¸þ¤Ç¤¹¡£´Ñ»¡¼Ô¤ÏÊѹ¹ÄÌÃΤò¼õ¤±¼è¤ê¡¢¤½¤ÎÊѹ¹¤ËÂФ·¤ÆÉ¬ÍפʽèÍý¤ò¼Â¹Ô¤·¤Þ¤¹¡£
¡¡¡¡MVP¤Ï¼ç¤ËUI¥³¥ó¥Ý¡¼¥Í¥ó¥È¤È¤½¤ì¤é¤Î´Ö¤Î¥í¥¸¥Ã¥¯¤Ë¾ÇÅÀ¤òÅö¤Æ¤Æ¤¤¤Þ¤¹¡£
Observer¤Ï°ìÈÌŪ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѹ¹¤ò´Æ»ë¤¹¤ë¤¿¤á¡¢ÆÃÄê¤Î¥¢¡¼¥¥Æ¥¯¥Á¥ã¤Ë°Í¸¤»¤º¡¢¹ÈϤʻÈÍѤ¬²Äǽ¤Ç¤¹¡£
¡¡¡¡MVP¤ÏÄ̾¥â¥Ç¥ë¤«¤é¥Ó¥å¡¼¤Ø¤Î°ìÊý¸þ¤ÎÄÌ¿®¤ò¶¯Ä´¤·¤Þ¤¹¡£
¡¡Observer¤Ï°ìÈÌŪ¤Ë¤ÏÈï´Ñ»¡¼Ô¤«¤é´Ñ»¡¼Ô¤Ø¤Î°ìÊý¸þÄÌÃΤǤ¹¤¬¡¢Î¾Êý¸þ¤¬²Äǽ¤Ç¤¹¡£
¡¡¡¡MVP¤ÏUI¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¹½Â¤²½¤È¥Æ¥¹¥ÈÍÆ°×À¤ò½Å»ë¤·¤Æ¤¤¤Þ¤¹¡£
¡¡Observer¤Ï¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁ·ë¹ç¤ÈÄÌÃΥᥫ¥Ë¥º¥à¤òÄ󶡤·¡¢³ÈÄ¥À¤ò¸þ¾å¤µ¤»¤Þ¤¹¡£
¡¡¡¡´Ê·é¤Ë¸À¤¨¤Ð¡¢MVP¤Ï¼ç¤ËUI¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¹½Â¤¤È¥í¥¸¥Ã¥¯¤ÎʬΥ¤Ë¾ÇÅÀ¤òÅö¤Æ¤Æ¤¤¤Þ¤¹¤¬¡¢
¡¡Observer¤Ï°ìÈÌŪ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѹ¹¤ò´Æ»ë¤·¡¢ÄÌÃΥᥫ¥Ë¥º¥à¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
¡¡Mediator¡ÊÄ´Ää¼Ô¡Ë¥Ñ¥¿¡¼¥ó¤ÈObserver¡Ê´Ñ»¡¼Ô¡Ë¥Ñ¥¿¡¼¥ó¤Ï¡¢¤¤¤¯¤Ä¤«¤Î½ÅÍפÊÅÀ¤Ç°Û¤Ê¤ê¤Þ¤¹¡£°Ê²¼¤Ï¡¢¤³¤ì¤é¤Î¥Ñ¥¿¡¼¥ó¤Î¼ç¤Ê°ã¤¤¤Ç¤¹¡£
¡¡¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¡¢Â¿¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁê¸ßºîÍѤòÃæ±û¤Î Mediator ¥¯¥é¥¹¤Ë½¸Ì󤹤뤳¤È¤Ç¡¢¥ª¥Ö¥¸¥§¥¯¥È´Ö¤Î·ë¹çÅÙ¤òÄ㤯ÊݤÁ¤Þ¤¹¡£
¡¡¼ç¤ÊÌÜŪ¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥ÈƱ»Î¤ÎľÀܤÎÁê¸ßºîÍѤò¸º¤é¤·¡¢Ãæ±û¤ÎÄ´Ää¼Ô¤ò²ð¤·¤Æ¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤ò¹Ô¤¤¤Þ¤¹¡£
¡¡¡¡¥ª¥Ö¥¸¥§¥¯¥È¤Ï Mediator ¤ÈÄÌ¿®¤·¡¢Mediator ¤Ï¾¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤ÎÁê¸ßºîÍѤòÀ©¸æ¤·¤Þ¤¹¡£
¡¡³Æ¥ª¥Ö¥¸¥§¥¯¥È¤ÏÄ̾Mediator ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤òÄ̤¸¤Æ Mediator ¤È¤ä¤ê¼è¤ê¤·¤Þ¤¹¡£
¡¡¡¡ÆÃ¤ËÊ£»¨¤Ê¥·¥¹¥Æ¥à¤ä¥æ¡¼¥¶¡¼¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤ª¤¤¤Æ»ÈÍѤµ¤ì¡¢³Æ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤¬¸ß¤¤¤Ë°Í¸¤»¤º¡¢Ãæ±û¤ÎÄ´Ää¼Ô¤Ë°Í¸¤¹¤ë¤³¤È¤¬ÆÃħ¤Ç¤¹¡£
¡¡¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ç¤Ï¡¢Ãæ±û¤ÎÄ´Ää¼Ô¤¬¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁê¸ßºîÍѤòÀ©¸æ¤·¤Þ¤¹¡£
¡¡Observer ¥Ñ¥¿¡¼¥ó¤Ç¤Ï¡¢Èï´Ñ»¡¼Ô¤È´Ñ»¡¼Ô¤¬Ä¾ÀÜÄÌ¿®¤·¤Þ¤¹¡£
¡¡¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¥ª¥Ö¥¸¥§¥¯¥ÈƱ»Î¤Î·ë¹çÅÙ¤òÄ㤯ÊݤĤ³¤È¤¬¼ç¤ÊÌÜɸ¤Ç¤¹¡£
¡¡Observer ¥Ñ¥¿¡¼¥ó¤Ï¥ª¥Ö¥¸¥§¥¯¥ÈƱ»Î¤òÁ·ë¹ç¤Ë¤·¡¢Êѹ¹¤ËÂФ¹¤ë½ÀÆð¤ÊÈ¿±þ¤òÄ󶡤·¤Þ¤¹¡£
¡¡Mediator ¥Ñ¥¿¡¼¥ó¤ÏÄÌ¾ï¡¢Ãæ±û¤Î Mediator ¤ËÂФ·¤Æ¥á¥Ã¥»¡¼¥¸¤òÁ÷¤ê¡¢Mediator ¤¬Â¾¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÈÄÌ¿®¤·¤Þ¤¹¡£
Observer ¥Ñ¥¿¡¼¥ó¤Ç¤ÏÄ̾Èï´Ñ»¡¼Ô¤¬´Ñ»¡¼Ô¤ËÊѹ¹ÄÌÃΤòÁ÷¤ê¤Þ¤¹¡£
¡¡´Ê·é¤Ë¸À¤¨¤Ð¡¢Mediator ¥Ñ¥¿¡¼¥ó¤Ï¥ª¥Ö¥¸¥§¥¯¥ÈƱ»Î¤ÎÃæ±ûÀ©¸æ¤Ë¾ÇÅÀ¤òÅö¤Æ¡¢Observer ¥Ñ¥¿¡¼¥ó¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѹ¹¤ËÂФ¹¤ëÄÌÃΤÈÈ¿±þ¤Ë¾ÇÅÀ¤òÅö¤Æ¤Æ¤¤¤Þ¤¹¡£
¡¡°Ê¾å¤Ë¤Ê¤ê¤Þ¤¹¡£
¥½¥Õ¥È¥é¥¤¥àÍÍ
¡ÚUnity¡ÛUnity¤Ç¥á¥Ç¥£¥¨¥¤¥¿¡¼¥Ç¥¶¥¤¥ó¥Ñ¥¿¡¼¥ó¤òÅö¤Æ¤Ï¤á¤Æ¤ß¤ë
https://soft-rime.com/post-12107/
Qiita @Cova8bitdot in Graffity³ô¼°²ñ¼Ò ÍÍ¡ÚUnity¡ÛUnity¤Ç³Ø¤Ö¥Ç¥¶¥¤¥ó¥Ñ¥¿¡¼¥ó17: Mediator ¥Ñ¥¿¡¼¥ó¡Ú¥Ç¥¶¥Ñ¥¿¡Û
https://qiita.com/Cova8bitdot/items/be33b97f35c84e...
¤Ï¤Ê¤Á¤ë¤Î¥Þ¥¤¥Î¡¼¥ÈÍÍ
¡ÚUnity¡ÛFacade¥Ñ¥¿¡¼¥ó¤ÈMediator¥Ñ¥¿¡¼¥ó¤Î°ã¤¤¤È»È¤¤Ê¬¤±¤Ë¤Ä¤¤¤Æ
https://www.hanachiru-blog.com/entry/2020/11/16/12...
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯