1. 程式人生 > >Unity3D C# 狀態機封裝

Unity3D C# 狀態機封裝

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

namespace OnePixelFramework
{
	public class StateMachine : MonoBehaviour
	{
		private Dictionary<int, State> stateDict = new Dictionary<int, State>();

         // 當前狀態
		public State curState 
		{
			private set;
			get;
		}

        // 前一個狀態
		public State preState 
		{
			private set;
			get;
		}

        // T 必須是Enum型別
		public T GetCurStateId<T>() where T : struct, IConvertible
		{
			return GetStateId<T>(this.curState);
		}

        // T 必須是Enum型別
        public T GetPreStateId<T>() where T : struct, IConvertible
		{
			return GetStateId<T>(this.preState);
		}

        // 獲取State的狀態id
        private static T GetStateId<T>(State state)
		{
			Type enumType = typeof(T);

			if (!enumType.IsEnum) 
			{
				throw new ArgumentException("T must be an enumerated type");
			}

			int value;

			if (state != null)
			{
				value = Convert.ToInt32(state.id);
			}
			else
			{
				value = -1;
			}

			return (T) Enum.ToObject(enumType, value);
		}

        // 根據自定義Enum建立State
		public State CreateState(Enum stateId)
		{
			State state        = new State();
			state.id           = stateId;
			state.stateMachine = this;
			this.stateDict.Add(Convert.ToInt32(stateId), state);

			return state;
		}

        // 狀態切換
		public State SetState(Enum stateId)
		{
			if (this.curState != null)
			{
				if (this.curState.OnExit != null)
				{
					this.curState.OnExit();
				}
			}

			this.preState = this.curState;
			this.curState = this.stateDict[Convert.ToInt32(stateId)];

			if (this.curState.OnEnter != null)
			{
				this.curState.OnEnter();
			}

			return this.curState;
		}

        // 狀態執行
        public virtual void Update()
		{
			if (this.curState != null)
			{
				if (this.curState.Update != null)
				{
					this.curState.Update();
				}
			}
		}

        // 狀態物件
		public class State
		{
			public Enum         id;
			public object       userData;
			public StateMachine stateMachine;
			public Action       OnEnter;
			public Action       OnExit ;
			public Action       Update ;

			public State SetId(Enum id)
			{
				this.id = id;
				return this;
			}

			public State SetUserData(object userData)
			{
				this.userData = userData;
				return this;
			}

			public State SetOnEnter(Action OnEnter)
			{
				this.OnExit = OnEnter;
				return this;
			}

			public State SetOnExit(Action OnExit)
			{
				this.OnExit = OnExit;
				return this;
			}

			public State SetUpdate(Action Update)
			{
				this.Update = Update;
				return this;
			}
		}
	}
}



相關推薦

Unity3D C# 狀態封裝

using UnityEngine; using System.Collections; using System.Collections.Generic; using System; namespace OnePixelFramework { public class StateMachine : Mo

C#狀態

  public enum PersonState{ EatMeal, //--->0 Work, //--->1 Sleep, //--->2 Chat //--->3} public class StateTest : MonoBehaviour{ //當前幀的狀態

Unity3d 有限狀態

using System.Collections; using System.Collections.Generic; using UnityEngine; //裝換條件 public enum Transition { NullTransition=0, SeePlayer, LostPlaye

Unity3D有限狀態(FSM)學習筆記【7】使用例項

using UnityEngine; using System.Collections; public class TestUIState : MonoBehaviour { public static EventSystem.Dispatcher Events = new EventSystem.Di

Unity3D有限狀態的使用

FSM(有限狀態機):多型 在各個小狀態類中因為是在保持動作的過程中執行的退出動作,所以將退出動畫的函式放在了保持動畫的函式中 在各個小狀態的類中判斷狀態是否在執行是根據動畫本身的播放屬性來判斷的,與其它的無關,是動畫自己的事情 簡而言之:在英雄類中的Upd

Unity3D有限狀態(FSM)學習筆記【3】FSState類

本系列筆記轉載自遊戲蠻牛專欄作家Jackel的論壇文章,詳細介紹了FSM的建立與使用,特與眾分享。連結:http://www.manew.com/thread-37136-1-1.html 該類主要是狀態的基本操作及事件的新增與觸發。程式碼如下: using System;

C#狀態Stateless

最近在折騰一些控制相關的軟體設計,想起來狀態機這個東西,對解決一些控制系統狀態切換還是挺有用的。 狀態機(有限狀態自動機)網上有很多[介紹](https://zhuanlan.zhihu.com/p/47434856)。簡單理解就是定義一系列狀態,通過一系列的事件,可以使得狀態可以相互之間切換。

geek青年的狀態,查表,純C語言實現

fill south 總結 target 堅持 str 分享 接收 backward geek青年的狀態機,查表,純C語言實現 1. 問題的提出。抽象 建一,不止是他,不少人跟我討論過這種問題:怎樣才幹保證在需求變更、擴充的情況下。程序的主體部分不動呢? 這是一個

C/C++用狀態轉移表聯合函數指針數組實現狀態FSM

pre nsf div script addclass .text 特點 sed 二維 狀態機在project中使用很的頻繁,有例如以下常見的三種實現方法: 1. switch-case 實現。適合簡單的狀態機。 2. 二維狀態表state-even

C語言入門--狀態程式設計

狀態機的好處不用多說,自己百度去,但傳統的程式設計模式,無論是C語言,或是硬體FPGA的Verilog都是採用switch-case結構,硬體的還好說,是並行的,但如果是C語言實現狀態機則可能需要對每個case進行判斷,狀態少比如幾個可能沒什麼效率之類的問題,但狀態多幾十個上百個呢,那麼就需

C語言高階篇 - 4.連結串列&狀態與多執行緒

1.連結串列的引入 1、從陣列的缺陷說起         (1)陣列有2個缺陷,一個是陣列中所有元素的型別必須一致;第二個是陣列的元素個數必須事先制定並且一旦指定之後不能更改。         (2)如何解決

模組的封裝(五):狀態模板

出處:狀態機模板   說在前面的話       好久沒有整理程式碼了,最近一直在做ARMv8-M系統安全設計相關的研究,雖然忙,但不代表我對 自己無聊的愛好——整理一些好玩的程式碼模板,或者說語法糖——失去了興趣。人總是會變的,一段

基於委託與事件的有限狀態設計與實現(Unity3d)

有限狀態機設計與實現 前言 最近看到一句話,就是優秀是一種習慣,所以突然就總想寫點什麼,當作是遊戲開發這條路上的學習筆記吧,另外也時刻提醒自己需要不斷努力。 什麼是狀態機? 先貼百度百科的概念內容吧: 有限狀態機,(英語:Finite-state machine

C# —— IEnumerable和狀態

在上一篇文章中,我們看了一下列舉器以及.NET如何使用foreach迴圈,我們看到了列舉器實際上是如何通過使用MoveNext方法和Current屬性從一個狀態轉換到另一個狀態的物件。 我們知道,如果我們想要建立一個自定義列舉器,我們將需要實現IEnumerator介面或它的泛型 

嵌入式應用程式碼框架(C 語言訊號量 或狀態)ZosPost

應用場景:                在嵌入式工作中 ,大的專案通常是多人配合完成。每個人程式碼風格,命名習慣,工作思路 都可能不一樣。那程式碼在整個合過程中或後期維護都 是一件很頭痛的事情為此我整理了這個開源庫,希望能對有這方面困擾的朋友有一定幫助。  在專案開發過

基於有限狀態Unity3D中實現的簡單搓招系統

在諸如街霸、拳皇等格鬥遊戲中,搓招指的是玩家通過在短時間內連續輸入特定的指令來釋放角色的招式(比如右下右拳釋放升龍拳) 那麼如何通過狀態機來實現搓招呢? 我們可以讓每個招式都持有一個狀態機,把這個招式要求的輸入指令作為狀態機的狀態而存在。依然以升龍拳為例,我們可以

C/C++用狀態轉移表聯合函式指標陣列實現狀態FSM

狀態機在工程中使用非常的頻繁,有如下常見的三種實現方法: 1. switch-case 實現,適合簡單的狀態機; 2. 二維狀態表state-event實現,邏輯清晰,但是矩陣通常比較稀疏,而且維護麻煩; 3. 用狀態轉移表stateTransfer Ta

Unity3d實現有限狀態系統

在之前有過介紹一個視覺化有限狀態機編輯器外掛PlayerMaker在這裡也可以在我們的程式碼中實現一個狀態機首先建立一個指令碼,來管理我們的各個狀態using System.Collections; using System.Collections.Generic; usin

FSM有限狀態學習及Unity3D案例講解

引言:近日忙於畢業論文,今天看到漲了3個粉絲,不甚驚喜。遂今日更新FSM有限狀態機學習,希望大家共同進步! 開發版本:Unity 2017.1.1f1、VS 2017 適合人群:初學Unity者 一.有限狀態機定義 有限狀態機(英文:Finite State Mach

整理:狀態C語言程式設計

一有限狀態機的實現方式 有限狀態機(Finite State Machine或者Finite State Automata)是軟體領域中一種重要的工具,很多東西的模型實際上就是有限狀態機。 FSM