在遊戲中,人物的狀態是不斷變化的,所以寫個fsm來管理狀態是必要的。
乙個有限狀態機是乙個裝置,或者是乙個裝置模型,具有有限數量的狀態,它可以在任何給定的時間根據輸入進行操作,使得乙個狀態變換到另乙個狀態,或者是使乙個輸入或者一種行為的發生。乙個有限狀態機在任何瞬間只能處在一種狀態。
我們這裡設定了幾個普通的idle,run,death的常量
public
class conststrings
///
/// 狀態圖,儲存角色可以切換的所有狀態
///public
class charstategraph
~charstategraph()
下面來定義一般的狀態圖,繼承於上面的狀態圖。
///
/// 一般狀態圖
///public
class sgcommon : charstategraph
}
在狀態圖裡面,常需要的就是切換狀態的行為,改變人物的狀態。
這個了類是用來管理狀態機的,就是在實際應用時候去呼叫的了。
///
/// 狀態圖例項,用於實現狀態切換等功能
///public
class stategraphinstance
~stategraphinstance()
public
void
start()
public
void
update()
}public
void
stop()
////// 進入狀態
//////
///public
void
gotostate(string statename, params
object objs)
sg.stoptimers();
currentstate = state;
currentstate.enter(inst, objs);}}
另外還定義了角色的狀態,角色狀態的名字,角色的狀態的進入和退出。
其實這裡的 charstategraph就是狀態機,裡面儲存狀態圖的簡單資訊,名字,停止時間等。
charstatebase就是普通的狀態。
在狀態圖裡面,我們使用來管理狀態圖的。相當於這個就是乙個狀態機,狀態機和狀態的關係是一對多的關係。
在charstatebase裡面有三個常用的狀態的改變,狀態進入enter,更新update,退出exit。
/// 角色狀態
///public
class charsatebase
}public
void
update(basecontroller bc,float curtime)
}///
/// 退出狀態
///public
void
exit(basecontroller bc,params
object objs)
}其實上面的是狀態機的名字的改變,實質上還是普通的狀態機,下面看下常見的狀態機模式。
istate是狀態機的抽象基類。以後的很多的狀態就可以去繼承這個基類的。
public
abstract
class istate
public f fsm
public istateparam baseparam
public
void
setparam(istateparam _param)
public
void
setfsmid(f id)
public
abstract
bool
checktransition();
public
abstract
void
enter();
public
abstract
void
execute();
public
abstract
void
exit();
}
我們現在使用的是來管理攝像機的一些狀態,下面只去列舉一種攝像機的狀態,實際上有很多種的。如若不是,實現狀態機的意義也就是沒有的了。
// 相機展示時裝直接跟隨
public
class camfashionshowfollowstate : istate
public
override
void
enter()
public
override
void
execute()
public
override
void
exit()
}
public
class istatemachine
private dictionary> mstates;
private istatemcurrstate;
private istatemprevstate;
private istatemglobalstate;
public
istatemachine(t owner)
public
bool
contains(f fsmid)
public
void
addstate(f fsmid, istatestate)
state.setfsmid(fsmid);
state.owner = owner;
mstates.add(fsmid, state);
}public istategetstate(f fsmid)
return
null;
}public
void
changestate(istatenewstate)
public
void
changestate(f newfsm)
}public
void
setcurrstate(istatefsm)
public istategetcurstate()
public f getcurrstateid()
return mcurrstate.fsm;
}public
void
start()
if (mglobalstate != null)}}
這裡就是差不多就要完成的了,上文還有乙個例項化狀態機的類stategraphinstance,這是用來管理狀態機的,在這裡就不如列舉了。 Unity中的簡單有限狀態機
當需要實現角色的狀態時,相信我們第一時間想到的是if else,但是當角色的某個狀態時條件狀態時 即該狀態需要在某個特定狀態下才能觸發 if else就顯得臃腫麻煩了。假如我們現在正在開發一款橫版遊戲。當前的任務是實現玩家用按鍵上操縱女英雄。void heroine handleinput inpu...
狀態機 狀態機0
近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...
Unity有限狀態機實現
有限狀態機主要是用於狀態之間的切換,狀態之間的切換也可以通過switch case或者if else實現。由於使用二者實現主要是對用使用者擴充套件不是很方便,所以就有了有限狀態機的概念。有限狀態機主要是用於不同的狀態頻繁的切換。那在unity中我們如何定義有限狀態機?其實有限狀態機主要包括三部分,切...