更新日期:2019年9月26日。
Github源碼:[點我獲取源碼]
使用StepEditor
StepEditor流程
對於StepEditor的執行流程,有以下的流程圖可以更形象的說明:
創建任務步驟
接下來,我們在Step Content List面板中創建了三個任務步驟:
編輯任務步驟屬性
選中第一個任務步驟,我們編輯他的屬性:
1.勾選Instant:標註此步驟爲立即完成,也就是步驟被觸發並執行後,會立即激活並進入下一個步驟。
提示:找到NPC張三以後,我們可能不需要其他任何的延時等待,直接進入下一個任務步驟就可以了。
2.將場景中的角色張三拖拽到Target:將此角色作爲步驟的目標。
提示:如果角色張三是一個動態加載的預製體,也可以先將其拖拽到場景中,在拖拽到Target欄,物體會被標記一個全局唯一的GUID,任何時候任何地方StepEditor都能找到他。
3.設置Trigger:設置步驟觸發方式爲Mouse Click(鼠標點擊),也就是當鼠標點擊Target(張三)時,此步驟便觸發。
提示:請必須確保Tatget上有碰撞盒組件,僅當觸發方式爲Mouse Click時,因爲這裏使用的是射線檢測。目前觸發方式共有四種:(根據情況可以任意擴展)
△ Mouse Click:鼠標點擊目標觸發。
△ Button Click:UGUI Button被點擊時觸發(必須確保目標上有Button組件)。
△ State Change:目標狀態改變時觸發(每個目標都會有一個狀態標記,當該標記變爲Done時觸發)。
△ Auto Execute:自動執行(步驟激活後,自動觸發)。
爲步驟添加操作節點
目前的節點類型共有如下十幾種,大致是封裝了一些較爲常見的基本操作,比如移動、旋轉、縮放動畫(底層封裝DOTween),根據情況可以任意擴展:
例子:比如Move(移動)節點,面板如下:
功能:將目標移動到指定位置。
界面:
1.Move to:移動的目的地。
2.Ease:移動動畫的緩動類型。
3.Transformation:是否瞬間抵達?如果勾選,則忽略動畫,瞬間移動到目的地。
其他的節點就不再一一贅述,這裏我們爲任務找到張三添加一個Action節點:
當主角點擊NPC以後,NPC會看向主角,然後就直接觸發下一個任務與張三交談,所以沒有其他的操作。
操作節點連線
上一步添加的節點並未激活,因爲從Enter節點進入,沒有任何一條連線可以抵達張三看向主角這個節點。
我們在Enter節點上點擊右鍵,(也可以鼠標從節點兩側的小耳朵處拖拽連線)在彈出菜單中選擇:Connect or break -> 張三看向主角!連線完成後,步驟從Enter節點進入,會首先執行張三看向主角節點,多個節點根據連線順序依次執行。
操作節點斷開連線
若要斷開節點間的連線,按住Alt鍵,所有連線上會顯示斷開按鈕,直接點擊按鈕便斷開該連線。
編輯操作節點屬性
在面板選中張三看向主角節點,將角色張三拖拽到Target欄,作爲此操作節點的目標。
勾選Instant,這個節點不需要等待,執行完後立即退出,並激活下一個任務步驟。
Action節點爲呼叫一個自定義方法,必須是void返回值、且不帶參數的方法,在Action欄點擊下拉菜單,可以直接在目標身上的所有組件中選擇方法,這裏選擇NPC的LookToHero方法(看向主角)。
爲任務步驟使用Helper
接下來我們遇到了一個特殊的任務,幫張三教訓大黃蜂!這個任務的觸發條件應該是大黃蜂被擊殺到指定數量,Mouse Click或者Button Click觸發條件在這裏明顯不能用於這個步驟。
所以我們要使用State Change。
State Change觸發方式一般情況下都要搭配助手,不然你就得在其他地方來獲取步驟目標,並設置他的狀態,以觸發步驟。
我們點擊Helper後面的下拉框,可以在現有的助手中選擇,也可以一鍵快速創建新的助手,創建後的助手會自動指定給本步驟。
這裏我們創建名爲KillBumblebeeHelper的助手,他會自動生成爲一個.cs類文件,並自動在VS中打開。
Helper類結構如下:
[CustomHelper("任務1/殺死100只大黃蜂")]
public class KillBumblebeeHelper : StepHelper
{
/// <summary>
/// 跳過時生命週期(僅在跳過時生效)
/// </summary>
public override float SkipLifeTime
{
get
{
return 0;
}
}
/// <summary>
/// 跳過步驟(僅在跳過時執行)
/// </summary>
public override void OnSkip()
{
base.OnSkip();
}
/// <summary>
/// 恢復步驟(僅在倒退時執行)
/// </summary>
public override void OnRestore()
{
base.OnRestore();
}
/// <summary>
/// 步驟指引
/// </summary>
public override void OnGuide()
{
base.OnGuide();
}
/// <summary>
/// 初始化
/// </summary>
public override void OnInit()
{
base.OnInit();
}
/// <summary>
/// 幀刷新
/// </summary>
public override void OnUpdate()
{
base.OnUpdate();
}
/// <summary>
/// 銷燬
/// </summary>
public override void OnTermination()
{
base.OnTermination();
}
}
Helper生命週期:
1.OnInit():會在本次任務步驟激活時呼叫一次。
2.OnUpdate():會在步驟激活後按幀執行,直到任務進入執行狀態。
3.OnSkip():會在步驟跳過時執行一次。
4.OnRestore():會在步驟恢復時執行一次。
5.SkipLifeTime:步驟跳過時等待時長。
6.OnGuide:會在執行指引時呼叫一次。
7.OnTermination():會在步驟結束後呼叫一次。
修改目標身上的State狀態爲StepTargetState.Done便是觸發這個步驟(僅當觸發類型爲State Change時)。
CustomHelper爲指定本助手在面板的顯示層級與名稱,如下:
接下來,我們要判斷主角已經殺死了100只大黃蜂,從而觸發此任務步驟,我們在OnUpdate生命週期中寫點東西:
/// <summary>
/// 幀刷新
/// </summary>
public override void OnUpdate()
{
//擊殺記錄池中大黃蜂數量
if (KillManager.KillRecord.Bumblebee.Count == 100)
{
//StepHelper 基類中的方法,執行當前步驟
Execute();
}
}
這樣的話,Helper便可以正常的工作了,當殺死100只大黃蜂時,此任務步驟便會進入執行狀態,接下來在任務操作面板中加入一些節點,在任務完成後需要做的某些事就可以了,比如獲得任務獎勵等。
如下,略微複雜的節點連線,從Enter進入後,會根據連線從左到右執行,每個節點執行完成後等待Elapse Time設置的時間(Instant狀態則不等待),不同支路的節點不影響其他支路節點的執行。
在代碼中總控
1、首先,需要將StepContentAsset資源指定給StepMaster(靜態指定和動態指定均可):
2、然後,開始整個StepEditor流程:
//重新編譯所有步驟內容
Main.m_StepMaster.RecompileStepContent();
//StepEditor流程開始
Main.m_StepMaster.Begin();
3、終止整個StepEditor流程:
//StepEditor流程終止
Main.m_StepMaster.End();
4、自定義執行順序:(可以讓整個步驟流程不再線性執行)
//添加自定義順序,當執行完【id1】步驟時,無條件轉到【id7】步驟
Main.m_StepMaster.AddCustomOrder("id1", "id7");
//做一些事
//移除添加在【id1】步驟上的自定義順序
Main.m_StepMaster.RemoveCustomOrder("id1");
5、跳過步驟:
//設置跳過速度
StepMaster.SkipMultiple = 10;
//跳過到步驟【id10】,步驟【id10】之前的步驟會自動:激活、觸發、執行
Main.m_StepMaster.SkipStep("id10");
6、監聽事件:
//整個流程開始事件
Main.m_StepMaster.Begin += OnBegin;
//整個流程結束事件
Main.m_StepMaster.End += OnEnd;
//任意步驟被激活事件
Main.m_StepMaster.BeginStepEvent += OnBeginStepEvent;
//任意步驟執行事件
Main.m_StepMaster.ExecuteStepEvent += OnExecuteStepEvent;
運行時檢視面板
在編輯器中運行時將會出現運行時檢視面板(Runtime Data),主要用以調試或數據監測,目前面板如下:
1.Step Count:當前步驟總數。
2.Current Step:當前激活的步驟索引,點擊Skip按鈕可以模擬跳過當前任務步驟。
3.Current Step Name:當前激活的步驟名稱。
4.Current Step Target:當前步驟目標。
5.Current Step Helper:當前步驟的助手。
6.Disabled Steps:當前未啓用的步驟數量。
7.Custom Order:當前存在的自定義順序。