AI FSM

NPC나 오브젝트에 AI 상태를 설정하는 기능이에요.

샘플맵 바로가기🔗

Scripting

Finite State Machine

오브젝트에 상태 머신🤖을 설정🔧하여 조건에 따른 상태 전환 기능을 제공해요.

FinteState

객체의 각 상태를 나타내요.🧍🏃🧘

ParallelState

FinteState의 하위 상태에요.⛹️

ParallelState를 설정하면 FinteState와 함께 실행돼요.

FiniteState 하위에는 하나☝️의 ParallelState만 생성할 수 있어요.

하나의 FiniteState에 2개 이상의 ParallelState를 설정하면 마지막에 설정한 ParallelState만 적용돼요.⏭️

FSM의 상태 플로우(동작 순서)

각 상태🏃마다 EnterEvent > UpdateEvent > ExitEvent 순으로 진행돼요.

💡하위 상태(ParallelState)가 존재하는 경우, 상위 EnterEvent > 하위 EntetEvent > 상위 UpdateEvent… 순서로 진행돼요.

FSM 사용 함수

함수사용가능 스크립트설명

void AddFSM()

Server / Client

대상에게 FSM를 부여해요.

void AddFiniteState (string StateName)

Server / Client

FSM 내부에 상태 추가해요.

void AddParallelState (string StateName)

Server / Client

FSM 추가된 상태에 하위 상태를 추가해요. 각 상태마다 하나씩만 추가할 수 있어요.

EnterEvent

Server / Client

상태가 시작될 때 호출되는 이벤트에요.

UpdateEvent

Server / Client

상태가 진행중일 때 호출되는 이벤트에요.

ExitEvent

Server / Client

상태가 끝날 때 호출되는 이벤트에요.

void AddTransition (string StateName, string StateName, function, number)

Server / Client

다른 상태로 전환할 때 사용하는 함수에요. 시작 상태 이름, 전이할 상태 이름, 연결 함수, 우선순위(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 종료할 수 있는 함수에요.

Last updated