Unity中狀態機的使用

2021-08-02 15:56:44 字數 3569 閱讀 6109

在遊戲中,人物的狀態是不斷變化的,所以寫個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中我們如何定義有限狀態機?其實有限狀態機主要包括三部分,切...