1. 程式人生 > >QF框架使用之案例解析(四) ------ NodeActionSystem

QF框架使用之案例解析(四) ------ NodeActionSystem

QFramework 是一套 漸進式 的 快速開發 框架。目標是作為無框架經驗的公司、獨立開發者、以及 Unity3D 初學者們的 第一套框架。框架內部積累了多個專案的在各個技術方向的解決方案。學習成本低,接入成本低,重構成本低,二次開發成本低,文件內容豐富(提供使用方式以及原理、開發文件)。github:https://github.com/liangxiegame/QFramework

今天分享的是QF的NodeActionSystem,原先沒有執行示例直接看官方文章是有點懵的,運行了之後發現真實用

案例地址 : QFramework\Assets\QFramework\Example\ActionKitExample

1.延時節點: DelayNode

執行案例 : 

通過 this(MonoBehaviour) 觸發延時回撥。

this.Delay(1.0f, () =>
{
    Log.I("延時 1s");
});

通過申請 DelayNode 物件,使用 this(MonoBehaviour) 觸發延時回撥。

var delay2s = DelayNode.Allocate(2.0f, () => { Log.I("延時 2s"); });
this.ExecuteNode(delay2s);

使用 Update 驅動延時回撥。

private DelayNode mDelay3s = DelayNode.Allocate(3.0f, () => { Log.I("延時 3s"); });

private void Update()
{
    if (mDelay3s != null && !mDelay3s.Finished && mDelay3s.Execute(Time.deltaTime))
    {
        Log.I("Delay3s 執行完成");
    }
}

灰常好用啊有木有

2.事件節點: EventNode

執行案例:

​ 字如其意,EventNode,也就是分發事件。也許單獨使用並不會發揮它的價值,但是在 容器節點 裡他是不可或缺的。

通過申請 EventNode 物件,使用 this(MonoBehaviour) 觸發事件執行。

var eventNode = EventNode.Allocate(() => { Log.I("event 1 called"); }, () => { Log.I("event 2 called"); });
this.ExecuteNode(eventNode);

使用 Update

 驅動回撥。

private EventNode mEventNode2 = EventNode.Allocate(() => { Log.I("event 3 called"); }, () => { Log.I("event 4 called"); });

private void Update()
{
    if (mEventNode2 != null && !mEventNode2.Finished && mEventNode2.Execute(Time.deltaTime))
    {
        Log.I("eventNode2 執行完成");
    }
}

3.容器節點

①.Sequence

執行案例:

SequenceNode 字如其意就是序列節點,是一種 容器節點 可以將孩子節點按順序依次執行,每次執行完一個節點再進行下一個節點。

通過 this(MonoBehaviour) 觸發延時回撥。

this.Sequence()
    .Delay(1.0f)
    .Event(() => Log.I("Sequence1 延時了 1s"))
    .Begin()
    .DisposeWhenFinished() // Default is DisposeWhenGameObjDestroyed
    .OnDisposed(() => { Log.I("Sequence1 destroyed"); });

通過申請 SequenceNode 物件,使用 this(MonoBehaviour) 觸發節點執行。

    var sequenceNode2 = SequenceNode.Allocate(DelayNode.Allocate(1.5f));
    sequenceNode2.Append(EventNode.Allocate(() => Log.I("Sequence2 延時 1.5s")));
    sequenceNode2.Append(DelayNode.Allocate(0.5f));
    sequenceNode2.Append(EventNode.Allocate(() => Log.I("Sequence2 延時 2.0s")));

    this.ExecuteNode(sequenceNode2);

    /* 這種方式需要自己手動進行銷燬
    sequenceNode2.Dispose();
    sequenceNode2 = null;
    */

    // 或者 OnDestroy 觸發時進行銷燬
    sequenceNode2.AddTo(this);

使用 Update 驅動執行。

private SequenceNode mSequenceNode3 = SequenceNode.Allocate(
            DelayNode.Allocate(3.0f),
            EventNode.Allocate(() => { Log.I("Sequence3 延時 3.0f"); }));

private void Update()
{
    if (mSequenceNode3 != null 
        && !mSequenceNode3.Finished 
        && mSequenceNode3.Execute(Time.deltaTime))
    {
        Log.I("SequenceNode3 執行完成");
    }
}

private void OnDestroy()
{
    mSequenceNode3.Dispose();
    mSequenceNode3 = null;
}

4.Timer

執行案例:

 

瞅瞅程式碼:

 private void OnGUI()
    {
        if (GUILayout.Button("開啟定時"))
        {
            text3.text = "";
            if (!Timer.Exist(timer))
            {
                timer = Timer.AddTimer(5, "12138").OnUpdated((v) =>
                {
                    image.fillAmount = v;
                    text.text = (v * timer.Duration).ToString();
                }).OnCompleted(
                   () =>
                   {
                       text3.text = "計時完成!";
                   }
                );
                text2.text = "當前設定時間為:" + timer.Duration;
            }
        }

        if (GUILayout.Button("定時2秒"))
        {
            if (Timer.Exist("12138"))
            {

                Timer.GetTimer("12138").SetTime(2);                  //當定時器走了大於2秒時按下,會提示錯誤,並瞬間完成事件
                text2.text = "當前設定時間為:" + timer.Duration;    //當定時器走了小於2秒時按下,會加速完成
            }
        }
        if (GUILayout.Button("定時-2秒"))                            //當定時器走了大於2秒時按下,會提示引數必須為正值,並瞬間完成事件
        {                                                            //當定時器走了小於2秒時按下,會提示引數必須為正值,會加速完成
            if (Timer.Exist("12138"))                                
            {
                Timer.GetTimer("12138").SetTime(-2);
                text2.text = "當前設定時間為:" + timer.Duration;
            }
        }
        if (GUILayout.Button("定時10秒"))                            //當定時器走了小於2秒時按下,會提示引數必須為正值,會加速完成
        {
            if (null != timer)
            {
                timer.SetTime(10);
                text2.text = "當前設定時間為:" + timer.Duration;
            }
        }
    }

實用很簡單~

好啦,分享結束