AIComponent

엔티티에 AI를 부여하기 위한 행동 트리 기능을 제공합니다.

# Properties

[{"index":"string BehaviourTreeId (ReadOnly)","0":"행동 트리 엔트리의 고유 식별자입니다."}]

[{"index":"Blackboard BlackBoard (ReadOnly)","0":"AI 행동 트리에서 사용하는 데이터 저장소입니다. 키-값 쌍으로 데이터를 관리하며 행동 트리 노드 간 데이터를 공유합니다."}]

[{"index":"boolean IsLegacy (ReadOnly)","0":"Legacy 시스템 지원 여부를 설정합니다. 이전 시스템은 노드의 Running 상태를 구현하기 위해 ExclusiveExecutionWhenRunning 프로퍼티를 사용해야 합니다. Legacy 시스템은 더 이상 지원하지 않으며, 추후 삭제 예정입니다."}]

[{"index":"boolean LogEnabled (ReadOnly)","0":"값이 true면 행동 트리가 실행될 때 실행 관련 정보가 로그로 출력됩니다. 메이커 환경에서만 동작합니다."}]

[{"index":"UpdateAuthorityType UpdateAuthority (ReadOnly)","0":"업데이트 권한입니다. Server와 Client 중 설정한 곳에서 실행됩니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

[{"index":"BTNode CreateLeafNode(string nodeName, func -> BehaviourTreeStatus onBehaveFunction)","0":"Action 노드를 생성합니다. 노드가 실행될 때 onBehaveFunction으로 전달된 함수가 호출됩니다. onBehaveFunction의 매개 변수는 프레임당 시간인 delta입니다."}]

[{"index":"BTNode CreateNode(string nodeType, string nodeName = nil, func -> BehaviourTreeStatus onBehaveFunction = nil)","0":"BTNodeType을 기반으로 Action 노드를 생성합니다. nodeType은 BTNodeType의 타입명입니다. onBehaveFunction가 nil이 아니라면 노드가 실행될 때 BTNodeType의 OnInit(), OnBehave() 함수 대신 onBehaveFunction으로 전달된 함수가 호출됩니다. onBehaveFunction의 매개 변수는 프레임당 시간인 delta입니다."}]

[{"index":"void SetRootNode(BTNode node)","0":"node를 최상위 노드로 설정합니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]

# Examples

몬스터가 잠을 자다가 플레이어가 다가오면 다가오지 말라고 말하는 예제입니다. AIComponent를 Extend해 사용합니다. 작성한 스크립트 컴포넌트를 static 몬스터에 추가해 사용합니다.
    
    
    @Component
    script PlayerProximityReactor extends Component
        @Sync
        property number DetectDistance = 4
    
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        local chatBallon = self.Entity.ChatBalloonComponent
        if chatBallon == nil then
        	chatBallon = self.Entity:AddComponent(ChatBalloonComponent)
        end
    
        self._T.nearestPlayer = nil
    
        chatBallon.AutoShowEnabled = true
        chatBallon.ChatModeEnabled = false
        chatBallon.ShowDuration = 1
        chatBallon.HideDuration = 0
        chatBallon.FontSize = 1.5
    
        local function isNearPlayer(deltaTime)
        	local players = _UserService:GetUsersByMapComponent(self.Entity.CurrentMap.MapComponent)
        	self._T.nearestPlayer = nil
        	local dist = math.maxinteger
        	for i, player in pairs(players) do
        		if isvalid(player) then
        			local distTemp = Vector2.Distance(
        			player.TransformComponent.Position:ToVector2(), self.Entity.TransformComponent.Position:ToVector2())
        			dist = math.min(dist, distTemp)
        			if dist <= self.DetectDistance then
        				self._T.nearestPlayer = player
        			end
        		end
        	end
    
        	if self._T.nearestPlayer == nil then
        		return BehaviourTreeStatus.Failure
        	else
        		return BehaviourTreeStatus.Success
        	end
        end
    
        local function lookAtNearestPlayer(deltaTime)
        	local flipX = self.Entity.TransformComponent.Position.x < self._T.nearestPlayer.TransformComponent.Position.x
        	self.Entity.SpriteRendererComponent.FlipX = flipX
        	return BehaviourTreeStatus.Success
        end
    
        local function warn(deltaTime)
        	chatBallon.Message = "Don't come!"
        	return BehaviourTreeStatus.Success
        end
    
        local function sleep(deltaTime)
        	chatBallon.Message = "Zzz..."
        	return BehaviourTreeStatus.Success
        end
    
        local rootNode = SelectorNode("Root")
    
        local alertSeq = SequenceNode("AlertSequence")
        alertSeq:AttachChild(self:CreateLeafNode("IsNearPlayer", isNearPlayer))
        alertSeq:AttachChild(self:CreateLeafNode("LookAtNearestPlayer", lookAtNearestPlayer))
        alertSeq:AttachChild(self:CreateLeafNode("Warn", warn))
    
        rootNode:AttachChild(alertSeq)
        rootNode:AttachChild(self:CreateLeafNode("Sleep", sleep))
    
        self:SetRootNode(rootNode)
        end
    end
    

# SeeAlso

  * ChatBalloonComponent
  * SpriteRendererComponent
  * TransformComponent
  * BTNode
  * SelectorNode
  * SequenceNode
  * UserService
  * [행동 트리를 활용한 AI 만들기](/docs?postId=562)