版權申明:
- 本文原創首發於以下網站:
- 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
- 優夢創客的官方博客:https://91make.top
- 優夢創客的游戲講堂:https://91make.ke.qq.com
- 『優夢創客』的微信公眾號:umaketop
-
您可以自由轉載,但必須加入完整的版權聲明
-
PlayMaker基於狀態機的可視化編程工具,playmaker內部實現會為其創建一個類,在其實例化和序列化時會有開銷(建立通過緩沖池避免),對復雜度要求較高的邏輯也可以將其封裝到PlayMaker的Action中
-
playMaker基於有限狀態機,一個狀態機包括若干個狀態節點,組合在一起形成游戲邏輯。每個狀態節點包括若干Action,這些Action對應的就是Unity內的具體游戲功能,如播放動畫,移動位置
-
PlayMaker狀態機不能單獨存在(其本身也是繼承自MonoBehaviour),選擇一個GameObjec,- PlayerMaker -> Components -> Add FSM to Selected Objects;將狀態機指定給選中的GameObject,一個GameObject可以有多個狀態機
-
State(狀態)
-
創建狀態機后,默認擁有一個狀態節點,也就是起始節點,名為State1
-
在PlayMaker窗口中點擊鼠標右鍵,選擇Add State即可添加新的狀態節點
-
Event 事件
-
在不同狀態之間切換的條件,在PlayMaker中被稱為事件,
-
選中狀態節點並單擊鼠標右鍵,選擇Add Transition -> Finished創建一個結束事件,然后在狀態節點下方會出現一個Finish選項,選中它並拖動到其他狀態節點即可創建過渡,由當前節點轉換到其他節點;此外還有很多事件,如System Event和Network Events
-
Custom Events(自定義事件)默認是空的,可以自定義事件的名稱
-
Action 動作
-
狀態節點本身沒有任何功能,可以為狀態節點添加Action實現功能
-
選中一個狀態節點后,在狀態機編輯窗口選擇State,單擊下方的Action Browser按鈕,打開Action列表,選擇Action(如Debug Log),單擊Add Action to State,就為當前狀態添加Action;在State中設置Log的文本即可在允許時輸出日志;使用Finished事件切換狀態實在1幀內完成的,我們添加一個Wait動作,等待2秒再切換,注意要把Wait動作的Finish Event設置為FINISHED(這樣它在結束時應該會觸發Finished事件)
-
變量
-
可以在Variable Type中選擇變量類型,輸入變量名稱,點擊Add添加變量,並可以編輯變量的初始值;如果希望創建全局變量,選擇Global Variables即可創建全局變量,所有狀態機對象均可訪問,注意全局變量保存在PlayMakerGlobals.assets文件中
-
如果使用自定義Action,獲取在狀態機中設置的變量:
-
FsmString speed = this.Fsm.GetFsmString("speed");
-
發送事件 //在playMaker中事件意味着狀態切換
-
使用Action列表中的StateMachine -> Send Event 或 Send Event By Name 即可;二者的區別在與Send Event By Name通過字符串名稱來發生事件,當通信對象是不同狀態機時,只能使用這種方式(有點像Unity自身用String發送的全局事件);選擇Send Event的Event Target和Send Event的事件類型即可,如果是Send Event By Name,Send Event中輸入的是一個字符串;
-
Aciton是一個動作啊,SendEvent就是一個Aciton,它的目的就是切換狀態
-
自定義Action
-
Unity編輯器菜單欄中:PlayMaker -> Tools -> Custom Action Wizard打開自定義Action窗口
-
在Name and Descriptin中輸入Aciton的名字和描述,
-
在Category中選擇Action的類型或自定義類型
-
在Generated Code Folder中選擇自定義Action腳本的存放位置
-
在Add Methods中選擇默認的重載方法,OnEnter會在進入狀態時觸發,OnUpdate會在每幀執行,- OnExit會在退出狀態節點時觸發
-
最后單擊Save Custom Action 按鈕傳教自動義Action腳本;
-
編譯自定義MyAction腳本:
using UnityEngine;
namespace HutongGames.PlayMaker.Actions {
[ActionCategory("MyGame")]
public class MyAction : FsmStateAction {
[Tooltip("event name A")] //添加提示
public FsmString eventNameA = string.Empty; //下一個狀態節點的名稱 //再PlayMake創建該Action后,指定該Public變量對應的Event
[Tooltip("event name B")]
public FsmString eventNameB = string.Empty; //名稱B,注意變量類型都是以Fsm開頭
public FsmEventTarget target; //事件接收目標
public override void OnEnter()
{
target = new FsmEventTarget();
target.gameObject = new FsmOwnerDefault();
target.target = FsmEventTarget.EventTarget.GameObjectFSM; //選擇目標類型,一個帶有FSM的GameObject
target.gameObject.OwnerOption = OwnerDefaultOption.SpecifyGameObject; //事件類型
target.gameObject.GameObject = this.Owner; //這里設置事件接收對象時自己
}
public override void OnUpdate () { //每幀執行
if (Input.GetKeyUp(KeyCode.Keypad1)) {
Fsm.Event(target, eventNameA.Value); //如果按下數字鍵1,發送eventNameA事件
}
else if (Input.GetKeyUp(KeyCode.Keypad2)) {
Fsm.Event(target, eventNameB.Value);
}
}
public override void OnExit() {
Debug.Log("On Exit MyAction");
}
}
}
- 使用PlayMaker,默認只能在PlayMaker編輯器的Variables窗口中創建狀態機的變量,但是如果使用自定義Action可以將所有狀態機引用的變量單獨放到腳本中保存:
public class MyData
{
public string title = string.Empty;
public int money = 0;
public bool isActiv = true;
}
- 然后再Action中引用MyData:
public class MyAction : FsmStateAction
{
public MyData myData;
}
- 然后就可以再自定義的Action代碼中獲取MyData變量