InventoryComponent

소유한 아이템들을 관리하는 컴포넌트입니다.

# Properties

[{"index":"boolean IsInitialized (ReadOnly) (HideFromInspector)","0":"인벤토리의 초기화가 완료 여부를 확인합니다. 초기화된 이후 InventoryComponent 관련 기능이 정상 작동하게 됩니다."}]

##### 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":"table GetItemList()","0":"소유한 아이템들을 가져옵니다."}]

[{"index":"table GetItemsWithType(Type itemType)","0":"소유한 아이템들 중 입력한 타입의 아이템을 가져옵니다."}]

##### inherited from Component:

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

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

# Events

[{"index":"InventoryItemAddedEvent","0":"인벤토리의 아이템이 추가되었을 때 발생하는 이벤트입니다."}]

[{"index":"InventoryItemInitEvent","0":"인벤토리가 초기화되었을 때 발생하는 이벤트입니다. 이 이벤트가 발생한 이후 InventoryComponent 관련 기능이 정상 작동하게 됩니다."}]

[{"index":"InventoryItemModifiedEvent","0":"인벤토리의 아이템이 수정되었을 때 발생하는 이벤트입니다."}]

[{"index":"InventoryItemRemovedEvent","0":"인벤토리의 아이템이 제거되었을 때 발생하는 이벤트입니다."}]

# Examples

인벤토리에 아이템이 추가, 제거되거나 변경 사항이 생기면 `InventoryComponent`는 해당하는 이벤트를 발생시킵니다. `ItemService`의 예제 코드를 예시로 각 이벤트의 호출 시점을 살펴보면 다음과 같습니다.
    
    
    @Component
    script ItemTriggerProcessor extends Component
        @EventSender("Self")
        handler HandleTriggerEnterEvent(TriggerEnterEvent event)
        -- Parameters
        local TriggerBodyEntity = event.TriggerBodyEntity
        --------------------------------------------------------
        if self:IsClient() then
            return
        end
    
        local inventory = self.Entity.InventoryComponent
        local items = inventory:GetItemList()
    
        if TriggerBodyEntity.Name == "Get Item" then
            local newItem = _ItemService:CreateItem(TestItem, "Test Item", inventory)
            newItem.ItemCount = 3
        elseif TriggerBodyEntity.Name == "Give Item" then
            if #items > 0 then
                items[1].ItemCount = items[1].ItemCount - 1
                if items[1].ItemCount == 0 then
                    _ItemService:RemoveItem(items[1])
                end
            end
        elseif TriggerBodyEntity.Name == "Trash Can" then
            if #items > 0 then
                _ItemService:RemoveItem(items[1])
            end
        end
        end
    end
    

`_ItemService:CreateItem` 함수와 `_ItemService:RemoveItem` 함수로 인해 인벤토리에 아이템이 추가, 제거될 때  
각각 `InventoryItemAddedEvent`, `InventoryItemRemovedEvent` 이벤트가 발생합니다.
    
    
    @Component
    script ClientInventoryLogger extends Component
        @EventSender("Self")
        handler HandleInventoryItemAddedEvent(InventoryItemAddedEvent event)
        -- Parameters
        local Entity = event.Entity
        local Items = event.Items
        --------------------------------------------------------
        if self:IsServer() then
            return
        end
    
        log("[Get Item]")
        end
    
        @EventSender("Self")
        handler HandleInventoryItemRemovedEvent(InventoryItemRemovedEvent event)
        -- Parameters
        local Entity = event.Entity
        local Items = event.Items
        --------------------------------------------------------
        if self:IsServer() then
            return
        end
    
        log("[Item Removed]")
        end
    end
    

ItemCount 프로퍼티 값이 변할 때 `InventoryItemModifiedEvent` 이벤트가 발생합니다. 그 외 이벤트가 발생하는 경우는 아래와 같습니다.

  * 아이템의 소유자(Owner)가 변경될 때
  * 아이템 타입의 프로퍼티 값이 변경될 때


    
    
    @Component
    script ClientGiveItemHandler extends Component
        @EventSender("Self")
        handler HandleInventoryItemModifiedEvent(InventoryItemModifiedEvent event)
        -- Parameters
        local Entity = event.Entity
        local Items = event.Items
        --------------------------------------------------------
        if self:IsServer() then
            return
        end
    
        log ("[Give Item]")
        end
    end
    

인벤토리는 게임을 나가도 계속 유지됩니다. 게임에 입장하면 발생하는 `InventoryItemInitEvent` 이벤트에서 아이템 목록을 확인합니다.
    
    
    @Component
    script InventoryInitLogger extends Component
        @EventSender("Self")
        handler HandleInventoryItemInitEvent(InventoryItemInitEvent event)
        -- Parameters
        local Entity = event.Entity
        local Items = event.Items
        --------------------------------------------------------
        if self:IsServer() then
            return
        end
    
        log("[Current Items]")
        for i = 1, #Items do
            log("Item" .. i .. ": ", Items[i].ItemDataTableName)
        end	
        end
    end
    

# SeeAlso

  * InventoryItemAddedEvent
  * InventoryItemInitEvent
  * InventoryItemModifiedEvent
  * InventoryItemRemovedEvent
  * TriggerEnterEvent
  * ItemService