最近做项目,因为要将游戏的代码基本全部改成lua的,对c#层面的东西基本只要unity的生命周期就可以了。刚开始接触lua,心痒痒,决定上网买了《Lua游戏AI开发指南》看看,决定实现一个fsm以便于在项目中使用。在这里贴出代码,其实代码都是直接抄这本书的。建议直接买书看,对于不想买书又想实现lua的状态机的可以直接拿下面的代码使用就可以了。
1 Action = {} 2 3 Action.Status = { 4 RUNNING = "RUNNING", 5 TERMINATED = "TERMINATED", 6 UNINIIALIZED = "UNINIIALIZED" 7 } 8 9 Action.Type = "Action" 10 11 12 function Action.new(name,initializeFunction,updateFunction,cleanUpFunction,userData) 13 14 local action = {} 15 16 action.cleanUpFunction_ = cleanUpFunction 17 action.initializeFunction_ = initializeFunction 18 action.updateFunction_ = updateFunction 19 action.name_ = name or "" 20 action.status_ = Action.Status.UNINIIALIZED 21 action.type_ = Action.Type 22 action.userData_ = userData 23 24 action.CleanUp = Action.CleanUp 25 action.Initialize = Action.Initialize 26 action.Update = Action.Update 27 28 return action 29 end 30 31 function Action.Initialize(self) 32 if self.status_ == Action.Status.UNINIIALIZED then 33 if self.initializeFunction_ then 34 self.initializeFunction_(self.userData_) 35 end 36 end 37 38 self.status_ = Action.Status.RUNNING 39 end 40 41 42 function Action.Update(self,deltaTimeInMillis) 43 if self.status_ == Action.Status.TERMINATED then 44 return Action.Status.TERMINATED 45 elseif self.status_ == Action.Status.RUNNING then 46 if self.updateFunction_ then 47 self.status_ = self.updateFunction_(deltaTimeInMillis,self.userData_) 48 49 assert(self.status_) 50 else 51 self.status_ = Action.Status.TERMINATED 52 end 53 end 54 55 return self.status_ 56 57 end 58 function Action.CleanUp(self) 59 if self.status_ == Action.Status.TERMINATED then 60 if self.cleanUpFunction_ then 61 self.cleanUpFunction_(self.userData_) 62 end 63 end 64 65 self.status_ = Action.Status.UNINIIALIZED 66 end