:DitoLand
Studio ManualAPI ReferenceVideo TutorialSample
  • DitoLand Developer
  • 📚Glossary
  • 🥳EVENT
    • 2024 메타버스 개발자 경진대회
    • 🎊[종료] 🖥 전남관광메타버스 스탬프 투어 인증 이벤트
  • Notice
    • 약관 개정(2024.06.17)
    • 약관 개정 (2024.03.04)
    • 약관 개정 (2023.08.25)
    • 약관 개정 (2022.12.14)
  • Manual
    • Studio
    • Resources
    • Studio Workflow Tips
    • NPC
    • NavMeshVolume
    • Land Teleport
    • Enterprise Account
    • Enterprise Studio Manual
    • Coroutine
    • AddTimeEvent
    • SaveUserData
    • Set Object Parameter
    • Toolbox Upload
    • Debugging (Breakpoint)
    • Gun Toy
    • Coupon / Event Key
    • Optimization
    • AI FSM
    • SpreadSheet
    • Mod Kit
    • AddReplicateValue / ConnectChangeEventFunction
    • Event Execution Order
    • WorldTree Search Filter
    • Object
    • Coordinate
    • Inworld Product
    • Management UserData & Leaderboard
    • Channel
    • World Event
    • Matchmaking
    • Collecting Game Logs
    • External Avatar
  • Coding Style
  • API Reference
    • Global
      • Variables
    • Lua
      • Built-in
      • NotSupport
    • Enums
      • AttachPoint
      • Bone
      • CharacterType
      • ChatCategoryType
      • ChatVisibleType
      • CollisionResponse
      • ControlMode
      • DivideTeamType
      • EventKeyState
      • InputMode
      • InventoryState
      • Key
      • KeyInputType
      • LuckyDrawOrderState
      • MaterialType
      • MediaStateType
      • ModeAnimStateType
      • ObjectSelectType
      • ObjectType
      • PathFollowingStatus
      • PointSpawnType
      • ProgressFillType
      • ProjectionType
      • QuickSlotState
      • ReplicateType
      • ScrollOrientationType
      • SimulatePhysicsType
      • SpawnType
      • TeamType
      • TeleportErrorType
      • TouchType
      • TransformPlayType
      • UIDisplayType
      • UIWidgetType
      • WidgetAnchorType
    • Common
      • BindEvent
      • Character
      • Collision
      • Color
      • CouponReturnData
      • DateTime
      • Environment
      • EventKeyReturnData
      • FactorPhysics
      • FiniteState
      • FiniteStateMachine
      • Game
      • GameStatisticsData
      • HitResult
      • Item
      • LandTransferData
      • Matrix
      • MouseHitResult
      • Object
      • Physics
      • ScriptPhase
      • TimeEvent
      • Track
      • Vector
      • WorldObject
    • Client
      • AnimStateBase
      • AnimStateMachine
      • AnimStateMachineSetting
      • BlendAnimationDataSetting
      • BlendAnimState
      • BlendAnimStateSetting
      • Button
      • Camera
      • CameraClient
      • Character
      • CharacterAnimationSetting
      • CharacterAppearanceSetting
      • CharacterBaseSetting
      • CharacterClient
      • CharacterSetting
      • Collider
      • Collision
      • DPad
      • Environment
      • FiniteStateMachine
      • Frame
      • FX
      • Game
      • GridBox
      • HyperLinkButton
      • Image
      • Input
      • InputGroup
      • InventoryBox
      • Item
      • ListView
      • LocalPlayer
      • Media
      • MediaView
      • NPC
      • ObjectGroup
      • ObjectNoneClient
      • PDFView
      • Physics
      • PointLight
      • ProgressBar
      • RemotePlayer
      • ScreenButton
      • ScreenUI
      • Script
      • ScrollBox
      • SequenceAnimState
      • SequenceAnimStateSetting
      • Sound
      • SpotLight
      • StaticMesh
      • SurfaceUI
      • Text
      • TextBox
      • UIScene
      • WebBrowser
      • WebForum
      • WidgetBase
      • YouTubeView
    • Server
      • Character
      • CharacterAnimationSetting
      • CharacterAppearanceSetting
      • CharacterBaseSetting
      • CharacterServer
      • CharacterSetting
      • Collider
      • Collision
      • Environment
      • FactorPhysics
      • FiniteStateMachine
      • FX
      • Game
      • Item
      • Media
      • NPC
      • Physics
      • Player
      • PointLight
      • Script
      • ScriptObjectGroup
      • ScriptObjectNoneServer
      • Sound
      • Spawner
      • SpawnPoint
      • SpawnPointGroup
      • SpotLight
      • StaticMesh
      • Team
      • UIScene
      • Widget
  • Tutorial
    • Script Tutorial
      • 스크립트 심화 강좌
        • 1. 스크립트의 종류, 호출 순서, 호출, 통신
        • 2. 동기화, 파라미터, 예외사항
        • 3. 디토랜드로 루아 활용하기
  • Sample
    • Scripting
    • Event
    • Collision & Physics
    • Transform
    • UI
    • Camera
    • Input
    • FX
    • Sound
  • Guide for Developers
    • Guide For Unity Developer
    • Guide For Roblox Developer
  • Release Note
    • Script Changes
      • 1.5.0 Map Changes
      • 1.2.0 Map Changes
      • 1.1.0 Map Changes
      • 1.0.0 Map Changes
      • 0.9.0 Map Changes
      • 0.7.0 Map Changes
      • 0.6.0 Map Changes
      • 0.5.0 Map Changes
      • 0.4.0 Map Changes
      • 0.3.0 Map Changes
      • 0.2.0 Map Changes
    • Known Issues
Powered by GitBook
On this page

Was this helpful?

  1. Manual

AI FSM

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

PreviousOptimizationNextSpreadSheet

Last updated 11 months ago

Was this helpful?

샘플맵 바로가기🔗

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 종료할 수 있는 함수에요.
Scripting