QF框架使用之案例解析(四) ------ NodeActionSystem
阿新 • • 發佈:2018-12-15
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;
}
}
}
實用很簡單~
好啦,分享結束