Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

¡¡Mediator(¥á¥Ç¥£¥¨¡¼¥¿¡¼) ¥Ñ¥¿¡¼¥ó¤òºÎÍѤ·¤¿¾ì¹ç¤Î¼ÂÁõÎã¤Ç¤¹¡£

¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¡¢°Û¤Ê¤ë¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÄÌ¿®¤òÃç²ð¤¹¤ë¥Ç¥¶¥¤¥ó¥Ñ¥¿¡¼¥ó¤Ç¤¹¡£

¡¡º£²ó¤ÎÎã¤Ç¤Ï¡¢UI ¤ÎÀ©¸æ¼Ô(UIController ¥¯¥é¥¹¡¢UIManager ¥¯¥é¥¹) ¤È¤·¤Æ¡¢Mediator ¥Ñ¥¿¡¼¥ó¤òºÎÍѤ·¤¿Îã¤Ç¤¹¡£

¡¡UI ɽ¼¨¤¹¤ëºÝ¡¢Mediator ÍѤΥ¯¥é¥¹Æâ¤Î List Æâ¤Ë¤¢¤ë»ØÄꤵ¤ì¤¿ View ¤òɽ¼¨¤·¤¿¤ê¡¢
°ÊÁ°É½¼¨¤µ¤ì¤Æ¤¤¤¿ View ¤ËÌá¤Ã¤¿¤ê¤È¤¤¤Ã¤¿µóÆ°¤¬¼Â¸½²Äǽ¤Ç¤¹¡£

¡¡View ¤òÌ᤹¥±¡¼¥¹¤Ë¤ª¤¤¤Æ¤Ï¡¢£±¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤ò³«¤­¡¢¤½¤ÎÃæ¤Ç¤µ¤é¤ËÊ̤Σ²¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤ò³«¤¤¤¿¤È¤·¤Þ¤¹¡£
¤½¤Î¾ì¹ç¡¢£±¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤òÈóɽ¼¨¤Ë¤·¤Þ¤¹¡£

¡¡¤³¤Î¤È¤­¡¢Mediator ¥Ñ¥¿¡¼¥ó¤òÍøÍѤ·¤Æ¼ÂÁõ¤ò¤ª¤³¤Ê¤Ã¤Æ¤ª¤¯¤³¤È¤Ç¡¢£²¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤¬ÊĤ¸¤¿¥¿¥¤¥ß¥ó¥°¤Ç
ºÇ½é¤Ë³«¤¤¤Æ¤¤¤¿£±¤ÄÌܤΥݥåץ¢¥Ã¥×¥¦¥¤¥ó¥É¥¦¤òºÆɽ¼¨¤¹¤ë¤è¤¦¤ÊµóÆ°¤¬É½¸½½ÐÍè¤Þ¤¹¡£

¡¡¤â¤Á¤í¤ó¡¢UI´ÉÍý°Ê³°¤Ë¤â¤µ¤Þ¤¶¤Þ¤Ê¾ìÌ̤ÇÍ­¸ú¤Ç¤¹¡£
¥×¥ì¥¤¥ä¡¼¤ÎÆÃÄê¤Î¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤¿»þ¤Ë¡¢Mediator ÍѤΥ¯¥é¥¹¤¬Â¾¤Î¥¯¥é¥¹(Ũ)¤ËÌ¿Îá¤ò½Ð¤·¤¿¤ê¡¢
°Û¤Ê¤ë¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È(¥³¥ó¥Ý¡¼¥Í¥ó¥È¡¦¥¯¥é¥¹)¤¬¤ª¸ß¤¤¤ËľÀܰ͸¤»¤º¡¢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/...


´ðÄ쥯¥é¥¹¡¡¡¼View ¥¯¥é¥¹¡¼


¡¡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 ¤ÎÀÚ¤êÂؤ¨¤ò¹Ô¤¦¤è¤¦¤Ë¤·¤ÆÂбþ¤·¤Þ¤¹¡£


ÇÉÀ¸¥¯¥é¥¹­¡¡¡¡¼Button¡¼



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);
    }
}


ÇÉÀ¸¥¯¥é¥¹­¢¡¡¡¼InputField¡¼



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 ´ÉÍý¥¯¥é¥¹¡¡¡¼Madiator¡¼


¡¡´ðÄ쥯¥é¥¹ 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 ¥Ñ¥¿¡¼¥ó¤Ë¤ª¤±¤ë Observer ¥Ñ¥¿¡¼¥ó¤È Madiator ¥Ñ¥¿¡¼¥ó¤ÎÁê°ãÅÀ


¡¡MVP¡ÊModel-View-Presenter¡Ë¥Ñ¥¿¡¼¥ó¤ÈObserver¥Ñ¥¿¡¼¥ó¤Ï¡¢
°Û¤Ê¤ë´ÑÅÀ¤Ç¥·¥¹¥Æ¥à¤Î¹½Â¤¤òÀ°Íý¤¹¤ë¤â¤Î¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¤ÎÌò³ä¤äÌÜŪ¤¬°Û¤Ê¤ê¤Þ¤¹¡£

¡¡°Ê²¼¤Ë¡¢MVP¥Ñ¥¿¡¼¥ó¤ÈObserver¥Ñ¥¿¡¼¥ó¤Î¼ç¤Ê°ã¤¤¤ò¼¨¤·¤Þ¤¹¡£


MVP¡ÊModel-View-Presenter¡Ë¥Ñ¥¿¡¼¥ó

ÌÜŪ:

¡¡¡¡MVP¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¡Ç½¤ò¥â¥Ç¥ë¡¢¥Ó¥å¡¼¡¢¥×¥ì¥¼¥ó¥¿¡¼¤Î3¤Ä¤Î¼çÍפʥ³¥ó¥Ý¡¼¥Í¥ó¥È¤ËʬΥ¤·¡¢¤½¤ì¤¾¤ì¤ÎÀÕ̳¤òÌÀ³Î¤Ë¤·¤Þ¤¹¡£
¡¡¼ç¤ËUI¥í¥¸¥Ã¥¯¤òÁ·ë¹ç¤Ë¤·¡¢¥Æ¥¹¥ÈÍÆ°×À­¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤òÌÜŪ¤È¤·¤Þ¤¹¡£
¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó:

¡¡¡¡¥â¥Ç¥ë¡Ê¥Ç¡¼¥¿¤È¥Ó¥¸¥Í¥¹¥í¥¸¥Ã¥¯¡Ë¤È¥Ó¥å¡¼¡Ê¥æ¡¼¥¶¡¼¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¡Ë¤Î´Ö¤ÎÄÌ¿®¤Ï¡¢¥×¥ì¥¼¥ó¥¿¡¼¤ò²ð¤·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£
¡¡¥×¥ì¥¼¥ó¥¿¡¼¤Ï¥â¥Ç¥ë¤ÎÊѹ¹¤ò¸¡ÃΤ·¡¢¤½¤ì¤Ë´ð¤Å¤¤¤Æ¥Ó¥å¡¼¤ò¹¹¿·¤·¤Þ¤¹¡£
¥Ç¡¼¥¿¥Õ¥í¡¼:

¡¡¥Ç¡¼¥¿¥Õ¥í¡¼¤Ï°ìÊý¸þ¤Ç¤¹¡£¥â¥Ç¥ë¤«¤é¥Ó¥å¡¼¤Ø¤ÎÄÌÃΤȡ¢¥Ó¥å¡¼¤«¤é¥â¥Ç¥ë¤Ø¤Î¥æ¡¼¥¶¡¼¥¢¥¯¥·¥ç¥ó¤ÎÅÁ㤬¤¢¤ê¤Þ¤¹¡£


Observer¥Ñ¥¿¡¼¥ó

ÌÜŪ:

¡¡¡¡Observer¥Ñ¥¿¡¼¥ó¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѲ½¤ò´Ñ»¡¤·¡¢¤½¤ÎÊѲ½¤ò°Í¸´Ø·¸¤Ë¤¢¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ËÄÌÃΤ¹¤ë¤³¤È¤òÌÜŪ¤È¤·¤Þ¤¹¡£¼ç¤Ë¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁ·ë¹ç¤òÄ󶡤·¤Þ¤¹¡£
¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó:

¡¡¡¡´Ñ»¡¼Ô¡ÊObserver¡Ë¤ÈÈï´Ñ»¡¼Ô¡ÊSubject¡Ë¤Î2¤Ä¤Î¼çÍפÊÌò³ä¤¬¤¢¤ê¤Þ¤¹¡£Èï´Ñ»¡¼Ô¤¬Êѹ¹¤¬¤¢¤ë¤È¡¢¤½¤ì¤Ë±þ¤¸¤ÆÅÐÏ¿¤µ¤ì¤¿´Ñ»¡¼Ô¤ËÄÌÃΤ·¤Þ¤¹¡£
¥Ç¡¼¥¿¥Õ¥í¡¼:

¡¡¡¡¥Ç¡¼¥¿¥Õ¥í¡¼¤ÏÄ̾Èï´Ñ»¡¼Ô¤«¤é´Ñ»¡¼Ô¤Ë¸þ¤«¤¦°ìÊý¸þ¤Ç¤¹¡£´Ñ»¡¼Ô¤ÏÊѹ¹ÄÌÃΤò¼õ¤±¼è¤ê¡¢¤½¤ÎÊѹ¹¤ËÂФ·¤ÆɬÍפʽèÍý¤ò¼Â¹Ô¤·¤Þ¤¹¡£


MVP¡ÊModel-View-Presenter¡Ë¥Ñ¥¿¡¼¥ó¤ÈObserver¥Ñ¥¿¡¼¥ó¤Î°ã¤¤

ÂоݤÎÈÏ°Ï:

¡¡¡¡MVP¤Ï¼ç¤ËUI¥³¥ó¥Ý¡¼¥Í¥ó¥È¤È¤½¤ì¤é¤Î´Ö¤Î¥í¥¸¥Ã¥¯¤Ë¾ÇÅÀ¤òÅö¤Æ¤Æ¤¤¤Þ¤¹¡£
Observer¤Ï°ìÈÌŪ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѹ¹¤ò´Æ»ë¤¹¤ë¤¿¤á¡¢ÆÃÄê¤Î¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Ë°Í¸¤»¤º¡¢¹­ÈϤʻÈÍѤ¬²Äǽ¤Ç¤¹¡£
ÄÌ¿®Êý¸þ:

¡¡¡¡MVP¤ÏÄ̾¥â¥Ç¥ë¤«¤é¥Ó¥å¡¼¤Ø¤Î°ìÊý¸þ¤ÎÄÌ¿®¤ò¶¯Ä´¤·¤Þ¤¹¡£
¡¡Observer¤Ï°ìÈÌŪ¤Ë¤ÏÈï´Ñ»¡¼Ô¤«¤é´Ñ»¡¼Ô¤Ø¤Î°ìÊý¸þÄÌÃΤǤ¹¤¬¡¢Î¾Êý¸þ¤¬²Äǽ¤Ç¤¹¡£
ÌÜŪ:

¡¡¡¡MVP¤ÏUI¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¹½Â¤²½¤È¥Æ¥¹¥ÈÍÆ°×À­¤ò½Å»ë¤·¤Æ¤¤¤Þ¤¹¡£
¡¡Observer¤Ï¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁ·ë¹ç¤ÈÄÌÃΥᥫ¥Ë¥º¥à¤òÄ󶡤·¡¢³ÈÄ¥À­¤ò¸þ¾å¤µ¤»¤Þ¤¹¡£

¡¡¡¡´Ê·é¤Ë¸À¤¨¤Ð¡¢MVP¤Ï¼ç¤ËUI¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¹½Â¤¤È¥í¥¸¥Ã¥¯¤ÎʬΥ¤Ë¾ÇÅÀ¤òÅö¤Æ¤Æ¤¤¤Þ¤¹¤¬¡¢
¡¡Observer¤Ï°ìÈÌŪ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂÖÊѹ¹¤ò´Æ»ë¤·¡¢ÄÌÃΥᥫ¥Ë¥º¥à¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£



¡¡Mediator¡ÊÄ´Ää¼Ô¡Ë¥Ñ¥¿¡¼¥ó¤ÈObserver¡Ê´Ñ»¡¼Ô¡Ë¥Ñ¥¿¡¼¥ó¤Ï¡¢¤¤¤¯¤Ä¤«¤Î½ÅÍפÊÅÀ¤Ç°Û¤Ê¤ê¤Þ¤¹¡£°Ê²¼¤Ï¡¢¤³¤ì¤é¤Î¥Ñ¥¿¡¼¥ó¤Î¼ç¤Ê°ã¤¤¤Ç¤¹¡£

Mediator ¥Ñ¥¿¡¼¥ó

ÌÜŪ:

¡¡¡¡Mediator ¥Ñ¥¿¡¼¥ó¤Ï¡¢Â¿¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÎÁê¸ßºîÍѤòÃæ±û¤Î Mediator ¥¯¥é¥¹¤Ë½¸Ì󤹤뤳¤È¤Ç¡¢¥ª¥Ö¥¸¥§¥¯¥È´Ö¤Î·ë¹çÅÙ¤òÄ㤯ÊݤÁ¤Þ¤¹¡£
¡¡¼ç¤ÊÌÜŪ¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥ÈƱ»Î¤ÎľÀܤÎÁê¸ßºîÍѤò¸º¤é¤·¡¢Ãæ±û¤ÎÄ´Ää¼Ô¤ò²ð¤·¤Æ¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤ò¹Ô¤¤¤Þ¤¹¡£
ÄÌ¿®:

¡¡¡¡¥ª¥Ö¥¸¥§¥¯¥È¤Ï Mediator ¤ÈÄÌ¿®¤·¡¢Mediator ¤Ï¾¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤ÎÁê¸ßºîÍѤòÀ©¸æ¤·¤Þ¤¹¡£
¡¡³Æ¥ª¥Ö¥¸¥§¥¯¥È¤ÏÄ̾Mediator ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤òÄ̤¸¤Æ Mediator ¤È¤ä¤ê¼è¤ê¤·¤Þ¤¹¡£

°ìÈÌŪ¤Ê»ÈÍÑ:

¡¡¡¡ÆäËÊ£»¨¤Ê¥·¥¹¥Æ¥à¤ä¥æ¡¼¥¶¡¼¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤ª¤¤¤Æ»ÈÍѤµ¤ì¡¢³Æ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤¬¸ß¤¤¤Ë°Í¸¤»¤º¡¢Ãæ±û¤ÎÄ´Ää¼Ô¤Ë°Í¸¤¹¤ë¤³¤È¤¬ÆÃħ¤Ç¤¹¡£


Mediator¡ÊÄ´Ää¼Ô¡Ë¥Ñ¥¿¡¼¥ó¤ÈObserver¡Ê´Ñ»¡¼Ô¡Ë¥Ñ¥¿¡¼¥ó¤Î°ã¤¤

Ìò³ä:

¡¡¡¡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...

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

Menu



´ðÁÃ

µ»½Ñ/Ãμ±(¼ÂÁõÎã)

3D¥¢¥¯¥·¥ç¥ó¥²¡¼¥à

2D¤ª¤Ï¤¸¤­¥²¡¼¥à(ȯŸÊÔ)

2D¶¯À©²£¥¹¥¯¥í¡¼¥ë¥¢¥¯¥·¥ç¥ó(ȯŸÊÔ)

2D¥¿¥Ã¥×¥·¥å¡¼¥Æ¥£¥ó¥°(³ÈÄ¥ÊÔ)

¥ì¡¼¥¹¥²¡¼¥à(È´¿è)

2DÊüÃÖ¥²¡¼¥à(ȯŸÊÔ)

3D¥ì¡¼¥ë¥¬¥ó¥·¥å¡¼¥Æ¥£¥ó¥°(±þÍÑÊÔ)

3Dæ½Ð¥²¡¼¥à(È´¿è)

2D¥ê¥¢¥ë¥¿¥¤¥à¥¹¥È¥é¥Æ¥¸¡¼

3D¥¿¥Ã¥×¥¢¥¯¥·¥ç¥ó(NavMeshAgent »ÈÍÑ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥«¥¨¥ë¤Î°Ù¤Ë¡Á¡¢¥Ü¥³¥¹¥«¥¦¥©¡¼¥ºÉ÷)

VideoPlayer ¥¤¥Ù¥ó¥ÈϢư¤Î¼ÂÁõÎã

VideoPlayer ¥ê¥¹¥ÈÆ⤫¤é¥à¡¼¥Ó¡¼ºÆÀ¸¤Î¼ÂÁõÎã(ȯŸ)

AR ²èÁüÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¤Î¼ÂÁõÎã

AR ¥ê¥¹¥ÈÆ⤫¤éÀ¸À®¤Î¼ÂÁõÎã(ȯŸ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥µ¥Ð¥¤¥Ð¡¼É÷)

private



¤³¤Î¥µ¥¤¥ÈÆâ¤ÎºîÉʤϥæ¥Ë¥Æ¥£¤Á¤ã¤ó¥é¥¤¥»¥ó¥¹¾ò¹à¤Î¸µ¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹