오브젝트에 상태 머신🤖을 설정🔧하여 조건에 따른 상태 전환 기능을 제공해요.
ParallelState를 설정하면 FinteState와 함께 실행돼요.
FiniteState 하위에는 하나☝️의 ParallelState만 생성할 수 있어요.
각 상태🏃마다 EnterEvent > UpdateEvent > ExitEvent 순으로 진행돼요.
💡하위 상태(ParallelState)가 존재하는 경우,
상위 EnterEvent > 하위 EntetEvent > 상위 UpdateEvent… 순서로 진행돼요.
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 종료할 수 있는 함수에요.
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 종료할 수 있는 함수에요.