다른 상태로 전환할 때 사용하는 함수에요.
시작 상태 이름, 전이할 상태 이름, 연결 함수, 우선순위(0에 가까울수록 높아요.)가
필요해요.
void StartFSM()
Server/Client
FSM를 활성화 해요.
void StopFSM()
Server/Client
FSM를 비활성화 해요.
void GetOrCreateFSM
(string StateName)
Client
FSM을 생성하거나 Server에 있는 FSM을
불러와요.
Server에서 FSM 사용 예
local NPC = Script.Parent
local FSM = Game:AddFSM("FSM") --FSM 추가해요.
---------------------------------------------------------------------
--FSM 상태 추가
local IdleState = FSM:AddFiniteState("Idle")
local MoveState = FSM:AddFiniteState("Move")
--Move의 하위 상태 추가
local JumpState = MoveState:AddParallelState("Jump")
FSM:AddReplicateValue("Timer", 0, Enum.ReplicateType.Changed, 0)
---------------------------------------------------------------------
--각 상태마다 EnterEvent -> UpdateEvent -> ExitEvent 순서로 진행
--Idle 상태
local function EnterIdle(fsm)
print("GetCurrentState", fsm.CurrentFiniteState) --현재 상태 반환
end
IdleState.EnterEvent:Connect(EnterIdle)
local function UpdateIdle(fsm, updateTime)
fsm.Timer = fsm.Timer + updateTime
end
IdleState.UpdateEvent:Connect(UpdateIdle)
local function ExitIdle(fsm)
end
IdleState.ExitEvent:Connect(ExitIdle)
---------------------------------------------------------------------
--Move 상태
local function EnterMove(fsm)
print("GetCurrentState", fsm.CurrentFiniteState) --현재 상태 반환
end
MoveState.EnterEvent:Connect(EnterMove)
local function UpdateMove(fsm, updateTime)
fsm.Timer = fsm.Timer - updateTime
end
MoveState.UpdateEvent:Connect(UpdateMove)
local function ExitMove(fsm)
end
MoveState.ExitEvent:Connect(ExitMove)
---------------------------------------------------------------------
--하위 상태도 동일하게
--Jump상태
local function EnterJump(fsm)
print("GetCurrentState", fsm.CurrentFiniteState, " ", JumpState) --현재 상태 반환
NPC:Jump()
end
JumpState.EnterEvent:Connect(EnterJump)
local function UpdateJump(fsm, updateTime)
end
JumpState.UpdateEvent:Connect(UpdateJump)
local function ExitJump(fsm)
end
JumpState.ExitEvent:Connect(ExitJump)
---------------------------------------------------------------------
local function ToMoveCondition(fsm)
if fsm.Timer >= 1.5 then return true
else return false end
end
local function ToStandCondition(fsm)
if fsm.Timer <= 0 then return true
else return false end
end
---------------------------------------------------------------------
--두 상태간 전이 조건 연결하는 함수에요.
--인자로 시작 상태 이름, 전이할 상태 이름, 연결 함수, 우선순위 (0에 가까울수록 높아요.)가 필요해요.
FSM:AddTransition("Idle", "Move", ToMoveCondition, 0)
FSM:AddTransition("Move", "Idle", ToStandCondition, 0)
---------------------------------------------------------------------
FSM.StartFiniteState = "Idle" --시작 상태를 설정해요.
NPC.FSM = FSM --NPC에게 FSM를 할당해요.
NPC:StartFSM() --FSM 활성화시켜요.
NPC:StopFSM() --FSM 종료할 수 있는 함수에요.
Client에서 FSM 사용 예
local NPC = Script.Parent
local FSM = Game:GetOrCreateFSM("FSM", NPC:GetKey()) --Server에 있는 FSM를 가져와요.
---------------------------------------------------------------------
--FSM 상태 추가
local IdleState = FSM:AddFiniteState("Idle")
local MoveState = FSM:AddFiniteState("Move")
--FSM 하위 상태 추가
local JumpState = MoveState:AddParallelState("Jump")
---------------------------------------------------------------------
--Idle 상태
local function EnterIdle(fsm)
NPC.SurfaceUI.Text:SetText("Idle: Idle")
end
IdleState.EnterEvent:Connect(EnterStand)
---------------------------------------------------------------------
--Move 상태
local function EnterMove(fsm)
NPC.SurfaceUI.Text:SetText("State : Move")
end
MoveState.EnterEvent:Connect(EnterMove)
---------------------------------------------------------------------
--Move의 하위 상태
local function EnterJump(fsm)
NPC.SurfaceUI.Text:SetText("State : Move (Jump)")
end
JumpState.EnterEvent:Connect(EnterJump)
---------------------------------------------------------------------
FSM.StartFiniteState = "Idle" --시작 상태를 설정해요.
NPC.FSM = FSM --NPC에게 FSM를 설정해요.
NPC:StartFSM() --FSM 활성화시켜요.
NPC:StopFSM() --FSM 종료할 수 있는 함수에요.