1. 程式人生 > >Unity StrangeIoc框架 (三)signal訊號方式

Unity StrangeIoc框架 (三)signal訊號方式

先建立TestRoot

using UnityEngine;
using System.Collections;
using strange.extensions.context.impl;

public class TestRoot : ContextView {

    void Start()
    {
        context = new TestContext(this);
    }
}

建立TestContext   在TestContext中我們需要把事件命令修改為 訊號命令

using UnityEngine;
using System.Collections;
using strange.extensions.context.impl;
using strange.extensions.context.api;
using strange.extensions.command.api;
using strange.extensions.command.impl;

public class TestContext : MVCSContext {

    public TestContext(MonoBehaviour view)
        : base(view)
    {

    }


    public TestContext(MonoBehaviour view, ContextStartupFlags flags)
        : base(view, flags)
    {

    }
  
   override public IContext Start()     {         base.Start();         StartSignal startSignal = (StartSignal)injectionBinder.GetInstance<StartSignal>();         startSignal.Dispatch();         return this;     }
protected override void addCoreComponents() { base.addCoreComponents(); injectionBinder.Unbind<ICommandBinder>(); injectionBinder.Bind<ICommandBinder>().To<SignalCommandBinder>().ToSingleton(); } protected override void mapBindings() { injectionBinder.Bind<SuccessSignal>().ToSingleton();
        injectionBinder.Bind<IService>().To<TestService>();

        mediationBinder.Bind<TestView>().To<TestMediator>();

        commandBinder.Bind<RequestSignal>().To<RequestCommand>();
        commandBinder.Bind<StartSignal>().To<StartCommand>().Once(); } }

strange中IcommandBinder 事件繫結是在addCoreComponents中進行的 所以我們重寫他 呼叫它原本的方法 再將ICommandBinder移除,在將他繫結到訊號上signalCommandBinder  重寫Start()  然後派發  這樣就完成了        最後在mapBinding中進行之前一樣的繫結 。

我們寫一個指令碼 把所有的訊號都放在裡面。   在具體情況中可以分模組將訊號放在一起

  public class StartSignal : Signal
    {
    }
    public class ClickSignal : Signal
    {
    }
    public class RequestSignal : Signal<string>
    { 
   } public class SuccessSignal : Signal {
   }

StartCommand與之前的事件方法沒有區別

public class StartCommand : Command
    {
        [Inject(ContextKeys.CONTEXT_VIEW)]
        public GameObject contextView { get; set; }
        public override void Execute()
        {
            GameObject test = new GameObject("test");
            test.AddComponent<TestView>();
            test.transform.SetParent(contextView.transform);
        }
    }

TestView 有略微的不同    直接例項訊號進行派發

public class TestView : View
    {
        public ClickSignal signal_Click = new ClickSignal();
        void OnGUI()
        {
            if (GUI.Button(new Rect(0, 0, 100, 40), "click"))
            {
                signal_Click.Dispatch();
            }
        }
    }

在TestMediator中進行監聽  然後執行方法

 public class TestMediator : Mediator
    {
        [Inject]
        public TestView view { get; set; }

        [Inject]
        public RequestSignal signal_Request { get; set; }

        public override void OnRegister()
        {
            view.signal_Click.AddListener(OnClick);
        }
        public void OnClick()
        {
            signal_Request.Dispatch("www.baidu.com");
        }
    }

當被點選後會進行signal_Request訊號的事件派發   RequestSignal 通過注入獲取

在RequestCommand中  我們service 通過注入獲取  然後對他進行了signal_succesd訊號的監聽

public class RequestCommand : Command
    {
        [Inject]
        public IService service { get; set; }
        public override void Execute()
        {
            Retain();
            service.signal_succesd.AddListener(OnComplete);
            service.Request();
        }
        void OnComplete()
        {
            service.signal_succesd.RemoveListener(OnComplete);
            Debug.Log("get data finish");

            Release();
        }

    }

既然添加了監聽 那麼肯定有地方會進行成功後的訊號派發    在TestService 中  我們對成功的訊號進行派發

public class TestService : IService
    {
        [Inject(ContextKeys.CONTEXT_VIEW)]
        public GameObject contextView { get; set; }
        [Inject]
        public SuccessSignal signal_succesd { get; set; }

        public void Request()
        {
            contextView.GetComponent<MonoBehaviour>().StartCoroutine(Wait());
        }
        /// <summary>
        /// 模擬網路請求延遲1秒
        /// </summary>
        /// <returns></returns>
        IEnumerator Wait()
        {
            yield return new WaitForSeconds(1);
            signal_succesd.Dispatch();
        }
    }

這樣  我們就實現了訊號的機制  訊號也是官方推薦的方法

相關推薦

Unity StrangeIoc框架 (signal訊號方式

先建立TestRoot using UnityEngine; using System.Collections; using strange.extensions.context.impl; public class TestRoot : ContextView { void Start()

Unity StrangeIoc框架 (一

 最近想專案中需要使用這個架構  因此 上網看了很多資料摸索   但是對於初學者來說大多數的資料不是那麼容易理解 而且文件也是英文的閱讀起來有點吃力  所以記錄一下自己閱讀的過程  方便以後翻閱和跟我一樣的新人學習其中也借鑑了一些前輩的資料 如有反感請聯絡我   立馬進行修改  謝謝 StrangeIoc

Unity StrangeIoc框架 (二

MVCSContex :the big picture  1.應用程式的入口是一個類成為ContextView,這是一個Monobehavior例項化MVCSContext 2.用MVCSContext來執行各種繫結。 3.派發器是一個通訊匯流排,允許你再程式傳送訊息,在mvcscontext中他們傳送的是T

爬蟲Scrapy框架之學習使用(訊號(Signals

""" Extension for collecting core stats like items scraped and start/finish times """ import datetime

Unity學習(Unity Shader入門(基礎知識篇+線性代數複習(未完待續

至於為什麼剛建立了指令碼,現在就要做Shader了。。說多了都是淚 1.建立一個新的材質 Material Assert -> Create -> Material 拖到Scene中的某個物體上 2.建立一個新的Shader Assert -> Create -

Java&Xml教程(使用DOM方式修改XML檔案內容

DOM解析方式也可用於修改XML資料,我們可以使用它完成新增元素、刪除元素、修改元素值、修改元素屬性等操作。 我們的XML檔案,內容如下: employee.xml <?xml version="1.0" encoding="UTF-8" sta

Cloudera Manager安裝之Cloudera Manager 5.3.X安裝((tar方式、rpm方式和yum方式

 前期部落格 ClouderaManager官網安裝 https://www.cloudera.com/documentation/manager/5-0-x/Cloudera-Manager-Installation-Guide/cm5ig_install_path_

【Unity3D基礎教程】給初學者看的Unity教程(:通過製作Flappy Bird瞭解Native 2D中的Sprite,Animation

引子 上一次我們講了MonoBehaviour的前世今生,瞭解了遊戲中的每一個GameObjec都是由指令碼控制的,這一次我們開始將Unity中Native 2D中的Sprite,並且使用Animation來讓Sprite動起來。 在接下來的幾篇部落格裡,我會通過做一個Flappy Bird來講解

Linux下的訊號----捕捉訊號與sleep模擬

Linux下的訊號(一):訊號的基本概念與產生 Linux下的訊號(二):阻塞訊號 一,什麼是捕捉訊號? 1,捕捉訊號:訊號處理方式三種方式中的一種,意思是既不忽略該訊號,又不執行訊號預設的動作,而是讓訊號執行自定義動作。捕捉訊號要使用signal函式

QT和opencv學習(Qt訊號

所謂訊號槽,簡單來說,就像是插銷一樣:一個插頭和一個插座。怎麼說呢?當某種事件發生之後,比如,點選了一下滑鼠,或者按了某個按鍵,這時,這個元件就會發出一個訊號。就像是廣播一樣,如果有了事件,它就漫天發聲。這時,如果有一個槽,正好對應上這個訊號,那麼,這個槽的函式就會執行,也就

OpenGL學習筆記(OpenGL繪製方式

(1)OpenGL圖元    點:void glPointSize()    線、條帶、迴圈線:void glLineWidth()    三角形、條帶、扇面:    將多邊形渲染為點集、輪廓或者實體:   P68 正反面採用不同的方式繪製: glPolygonMode(GL

Linux程序通訊(IPC訊號

若通過kill命令把其中一個程序殺死,且該程序還沒有執行V操作釋放資源。若使用SEM_UNDO標誌,則作業系統將自動釋放該程序持有的訊號量,從而使得另外一個程序可以繼續工作。若沒有這個標誌,另外程序將P操作永遠阻塞。

Scrapy原始碼分析(訊號管理器SignalManager

類的位置scrapy.signalmanager.SignalManager。主要是對pydispatch.dispatcher的一層封裝。 首先來看看pydispatch.dispatcher都有哪些功能:專案主頁 這個模組主要提供了訊息的傳送和接收功能,主頁的示例:

Spark基礎入門(--------作業執行方式

(一)SparkContext 代表對叢集的一個連線 驅動程式通過sparkContext連線spark叢集 每個JVM只允許啟動一個SparkContext,一個sparkContext連線代表一個application,每個application中可能有多個job(jo

linux系統程式設計之訊號訊號的阻塞與未決

/*************************************************************************     > File Name: process_.c     > Author: Simba     > Mail: [email 

unity 中使用種簡單的方式實現實時時鐘動畫

目標 這非常容易實現。你需要寫幾行程式碼就可以實現了。在這篇文章中,我們將實現兩種動畫方式。 效果圖 數字時鐘型別 模擬時鐘型別 在開始編碼之前,我想要告訴你一些下面會用到的關於 unity 的知識。 什麼是材質 在 unit

控制反轉IOC的依賴注入方式 【調侃】IOC前世今生 IoC模式 談談對Spring IOC的理解 一個簡單的小程式演示Unity種依賴注入方式 小菜學習設計模式(五—控制反轉(Ioc IoC模式(依賴、依賴倒置、依賴注入、控制反轉 IoC模式

轉自:https://www.cnblogs.com/ysyn/p/5563256.html 引言:    專案中遇到關於IOC的一些內容,因為和正常的邏輯程式碼比較起來,IOC有點反常。因此本文記錄IOC的一些基礎知識,並附有相應的簡單例項,而在實際專案中再複雜的應用也只是在

【遠端呼叫框架】如何實現一個簡單的RPC框架優化一:利用動態代理改變使用者服務呼叫方式

【如何實現一個簡單的RPC框架】系列文章: 這篇部落格,在(一)(二)的基礎上,對第一版本實現的服務框架進行改善,不定期更新,每次更新都會增加一個優化的地方。 1、優化一:利用動態代理改變使用者服務呼叫方式 1.1 目的 改變使用者

自定義統一api返回json格式(app後臺框架搭建

pub ble ace proc 2.3 resp think err ons 在統一json自定義格式的方式有多種:1,[email protected]/* */,2,自定義一個註解,自己去解析對象成為json字符串進行返回 第一種方式,我就不推薦,想弄得的

微信公眾平臺開發教程( 基礎框架搭建

開發 images wxs user 設計實現 bytes trre 來源 app 上一章,我們已經初步講解了微信公眾賬號開發的基本原理,今天我們來探索設計實現。 首先我們設計了模塊層次圖,當然圖中只是給出一種實現方式,不局限於此。具體見下圖。 主要功能介紹如下: 1)請求