ã¯ããã«
ã©ãããåéã§ãã
æè¿ãMessage Pipeã使ç¨ããããã¸ã§ã¯ãã«åºä¼ã£ãã®ã§ãããMessage Pipeããªããã ã£ãã®ã§ãä»åã¯åå¼·ãã¦ãUIã§ãã使ç¨ãããMVPãã¿ã¼ã³ãMessage Pipeã¨VContainerãå©ç¨ãã¦ã§ããªãããã£ã¦ã¿ã¾ããã
- ã¯ããã«
- MessagePipeã¨ã¯ï¼
- ã¤ã³ãã¼ã
- MVPãã¿ã¼ã³ã§æ§ç¯ãã¦ã¿ã
- ã¾ã¨ã
- åèæç®
MessagePipeã¨ã¯ï¼
Pub/Subãã¿ã¼ã³ãUnityã«æä¾ããã©ã¤ãã©ãªã§ããPub/Subãã¿ã¼ã³ã®å人çãªç解ã¨ãã¦ã¯ãObserverãã¿ã¼ã³ãä¾åæ§ã®é転ã¨ããã¨ãPub/Subãã¿ã¼ã³ã¯ãããããäºããç¥ããªãã¦ãéç¥ãé£ã¶çãªã¤ã¡ã¼ã¸ã§ãã
ãäºããç¥ããªãã¦ãè¯ãããã«ããããã«DIã«ããä¾åæ§ã®æ³¨å ¥ãå¿ è¦ã«ãªã£ã¦ãã¾ãã
ã¤ã³ãã¼ã
VContainer
Package Managerãéããå·¦ä¸ã®ï¼ãããAdd package from git URLãã§
ãhttps://github.com/hadashiA/VContainer.git?path=VContainer/Assets/VContainerã
Message Pipe
Message Pipeæ¬ä½
åæ§ã«ãã¦ããAdd package from git URLãã§ä»¥ä¸ã追å ã
ãhttps://github.com/Cysharp/MessagePipe.git?path=src/MessagePipe.Unity/Assets/Plugins/MessagePipeã
UniTaskãå¿
è¦ãªã®ã§è¿½å
ãhttps://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTaskã
ã好ããªDIã追å ããã
VContainer
ãhttps://github.com/Cysharp/MessagePipe.git?path=src/MessagePipe.Unity/Assets/Plugins/MessagePipe.VContainerã
Zenject
ãhttps://github.com/Cysharp/MessagePipe.git?path=src/MessagePipe.Unity/Assets/Plugins/MessagePipe.Zenjectã
MVPãã¿ã¼ã³ã§æ§ç¯ãã¦ã¿ã
MVPãã¿ã¼ã³ã¨ã¯
Model View Presenterã®ç¥ãUnityã§GUIãè¨è¨ããéã«ç¨ããããè¨è¨ææ³ã§ãUnityã®UIå¦çé¨åã¨å¤ãæã¤é¨åãåãåãã¦ããããPresenterã§ç¹ãã¨ãã£ãå½¢ã®è¨è¨ã
(çéã«ãã£ã¦ã¯MVCã¨è¨ã£ãæ¹ãä¼ããæ°ããã)
ä»åã®è¨è¨
ä»åã¯ä¾ã¨ãã¦ããã¿ã³ãæ¼ãã¨æ°åãå¢ãããã®ãä½ãã
ViewãModelã¯ãã¼ã¿ãç¶æ ã®å¤æ´ãPresenterã«PublishããPresenterãSubscribeãã¦ãããããã«ãã£ã¦Viewã¨Modelã¯Presenterãç¥ããªãã¦ãè¯ããªã£ã¦ããã
View
Viewã®ã¿ãMonoBehaviourãæã¤å½¢ã§ä½ã£ã¦ã¿ãã ãã¿ã³ã®æ¼ããããå¦ãã®ç£è¦ã¨ããã¹ãã®æ´æ°ã®ã¿ãæ ã£ã¦ããã
public class UIView : MonoBehaviour { [SerializeField] private Button button; [SerializeField] private Text text; [Inject] private readonly IPublisher<Unit> _publisher; private void Start() { var onPush = button.onClick.AsObservable(); onPush.Subscribe(_publisher.Publish); } public void ChangeText(int num) { text.text = num.ToString(); } }
Presenter
DIã«ãã£ã¦subscriberãInjectãããã
å¤å¤æ´ããã¿ã³ãæ¼ãããã¨ãããViewãModelã«ä¼ããã
public class UIPresenter : IInitializable { [Inject] private UIView _view; [Inject] private UIModel _model; [Inject] private readonly ISubscriber<Unit> _unitSubscriber; [Inject] private readonly ISubscriber<int> _intSubscriber; public UIPresenter(ISubscriber<Unit> unitSubscriber, ISubscriber<int> intSubscriber) { _unitSubscriber = unitSubscriber; _intSubscriber = intSubscriber; } public void Initialize() { _unitSubscriber.Subscribe((_) => { _model.CountNumber(); }); _intSubscriber.Subscribe(num => { _view.ChangeText(num); }); } }
Model
ç¾å¨ã®æ°åã®ãã¼ã¿ã®ä¿æã¨ã«ã¦ã³ãã¢ããç¨ã¡ã½ãããæã¤ããã¡ããæ°åãå¤æ´ãããã¨ãPublishãããããã«ãªã£ã¦ããã
public class UIModel { private int _number; [Inject] private readonly IPublisher<int> _publisher; public UIModel() { _number = 0; } public void CountNumber() { _number++; _publisher.Publish(_number); } }
LifetimeScope
ModelViewPresenterã®ç»é²ãããã§è¡ã£ã¦ããã
ã¾ããMessagePipeãããã§ç»é²ããå¿ è¦ãããã
public sealed class UILifetimeScope : LifetimeScope { [SerializeField] private UIView uiView; protected override void Configure(IContainerBuilder builder) { var options = builder.RegisterMessagePipe(); builder.Register<UIPresenter>(Lifetime.Singleton); builder.Register<UIModel>(Lifetime.Singleton); builder.RegisterEntryPoint<UIPresenter>(Lifetime.Singleton); builder.RegisterEntryPoint<UIModel>(Lifetime.Singleton); builder.RegisterComponent(uiView); } }
å®æ
ãã¿ã³æ¼ãããæ°ãå¢ããã
ã¾ã¨ã
ã²ã¨ã¾ãåãã¯ãã¾ããããPresenterãViewãModelãæã£ã¦ããã®ã§ãã ã£ããeventãªããObservableãªãã§Subscribeããã°ããããã¨ãã話ã§ã¯ããã
ã¨ãã£ãæãã§è¨è¨ã¨ãã¦å¾®å¦ãªæ°ãããã®ã§ãMessage Pipe使ã£ããã£ã¨ããã¦ã¼ã¹ã±ã¼ã¹ãããã¯ãâ¦
ããã辺ã¯æãã¤ãããã¾ãè¨äºæ¸ãã¾ãã