Unity進階:PlayMaker


版權申明:

  • 本文原創首發於以下網站:
  1. 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
  2. 優夢創客的官方博客:https://91make.top
  3. 優夢創客的游戲講堂:https://91make.ke.qq.com
  4. 『優夢創客』的微信公眾號: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變量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM