InputService

유저의 입력과 관련된 기능을 제공합니다.

# Methods

[{"index":"void CursorLockMode(CursorLockMode lockMode) (ClientOnly)","0":"마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다."}]

[{"index":"CursorLockMode GetCursorLockMode() (ClientOnly)","0":"마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다."}]

[{"index":"Vector2 GetCursorPosition() (ClientOnly)","0":"커서의 현재 위치 정보를 가져옵니다. 모바일 환경에서 동시에 두 곳 이상을 터치했을 경우 중점을 반환합니다."}]

[{"index":"boolean IsAnyKeyPressed() (ClientOnly)","0":"현재 어떤 키라도 눌린 상태라면 true를 반환합니다."}]

[{"index":"boolean IsKeyPressed(KeyboardKey key) (ClientOnly)","0":"현재 key가 눌린 상태라면 true를 반환합니다."}]

[{"index":"boolean IsPointerOverUI() (ClientOnly)","0":"커서가 UI 위에 있는지 여부를 가져옵니다. RaycastTarget이 false인 UI는 무시됩니다."}]

[{"index":"boolean IsPointerOverUI(int32 pointerId) (ClientOnly)","0":"pointerId에 해당하는 커서가 UI 위에 있는지 여부를 반환합니다. RaycastTarget 프로퍼티의 값이 false인 UI Entity는 무시됩니다.마우스 커서의 pointerId는 1이며, 모바일 기기는 터치 입력마다 1, 2, 3, ...과 같이 1부터 순서대로 부여됩니다."}]

[{"index":"void ResetCursor() (ClientOnly)","0":"커서를 기본 모양으로 초기화합니다."}]

[{"index":"void SetCursor(string spriteRUID, Vector2 offset) (ClientOnly)","0":"커서의 모양을 변경합니다. spriteRUID는 스프라이트 또는 애니메이션 클립의 RUID입니다. offset은 커서의 상대적인 위치를 픽셀 단위로 나타낸 값으로 offset이 (0, 0)이면 스프라이트의 Pivot이 커서의 위치가 됩니다. 룸을 이동하면 커서 모양이 초기화됩니다."}]

[{"index":"void SetCursorVisible(boolean visible) (ClientOnly)","0":"마우스 커서의 표시 여부를 설정합니다."}]

##### inherited from Service:

[{"index":"EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)","0":"이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다."}]

[{"index":"EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)","0":"이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다."}]

[{"index":"boolean DisconnectEvent(string key, EventHandlerBase eventHandler)","0":"타입의 이름이 key인 이벤트와 핸들러와의 이벤트 연결을 끊습니다."}]

[{"index":"boolean DisconnectEvent(Type eventType, EventHandlerBase eventHandler)","0":"타입이 eventType인 이벤트와 핸들러와의 연결을 끊습니다."}]

[{"index":"void SendEvent(EventType sendEvent)","0":"이벤트를 발생시킵니다."}]

# Events

[{"index":"ExitPopupClosedEvent","0":"종료 팝업을 닫을 때 발생하는 이벤트입니다."}]

[{"index":"ExitPopupOpenedEvent","0":"종료 팝업을 열 때 발생하는 이벤트입니다."}]

[{"index":"KeyDownEvent","0":"Key를 눌렀을 때 1회 발생합니다."}]

[{"index":"KeyHoldEvent","0":"Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다."}]

[{"index":"KeyReleaseEvent","0":"Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다."}]

[{"index":"KeyUpEvent","0":"Key를 눌렀다 뗐을 때 1회 발생합니다."}]

[{"index":"MenuPopupClosedEvent","0":"메뉴 팝업을 닫을 때 발생하는 이벤트입니다."}]

[{"index":"MenuPopupOpenedEvent","0":"메뉴 팝업을 열 때 발생하는 이벤트입니다."}]

[{"index":"MouseMoveEvent","0":"마우스가 움직일 때 InputService에서 발생하는 이벤트입니다."}]

[{"index":"MouseScrollEvent","0":"마우스 스크롤을 올리거나 내릴 때 InputService에서 발생합니다."}]

[{"index":"PinchInOutEvent","0":"화면의 두 곳을 터치한 채로, 간격을 넓히거나 좁힐 때 InputService에서 발생합니다."}]

[{"index":"ScreenTouchEvent","0":"화면을 터치하거나 클릭했을 때 발생하는 이벤트입니다."}]

[{"index":"ScreenTouchHoldEvent","0":"화면을 터치하거나 클릭하고 있는 동안 발생하는 이벤트입니다."}]

[{"index":"ScreenTouchReleaseEvent","0":"화면을 계속 터치하거나 클릭하고 있다가 뗐을 때 발생하는 이벤트입니다."}]

# Examples

#### 키 입력

Z키를 누른 시간만큼 플레이어의 크기가 커지고, 높게 점프하는 컴포넌트를 만드는 예제입니다. 만든 컴포넌트를 DefaultPlayer에 추가해야 정상 작동합니다.

먼저 Z키를 눌렀을 때 웅크린 자세로 바꾸기 위해 `KeyDownEvent`를 아래와 같이 작성합니다. 누른 시간을 계산하기 위해서 KeyDownTime 프로퍼티를 만들고 현재 시간을 기록합니다.
    
    
    @Component
    script CrouchInputHandler extends Component
        property number KeyDownTime = 0
    
        @EventSender("Service", "InputService")
        handler HandleKeyDownEvent(KeyDownEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local key = event.key
        ---------------------------------------------------------
        if key == KeyboardKey.Z then
        	self.Entity.StateComponent:ChangeState("CROUCH")
        	self.KeyDownTime = _UtilLogic.ElapsedSeconds
        end
        end
    end
    

Z키 입력이 끝나면 점프하도록 `KeyUpEvent`에 아래와 같이 작성합니다. 누른 시간의 10배만큼의 힘으로 점프시킵니다.
    
    
    @Component
    script ChargeJumpHandler extends Component
        @EventSender("Service", "InputService")
        handler HandleKeyUpEvent(KeyUpEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local key = event.key
        ---------------------------------------------------------
        if key == KeyboardKey.Z then
        local force = (_UtilLogic.ElapsedSeconds - self.KeyDownTime) * 10
        	self.Entity.RigidbodyComponent:SetForce(Vector2(0, force))
        	self.Entity.StateComponent:ChangeState("JUMP")
        end
        end
    end
    

누른 시간을 시각적으로 표현하기 위해 플레이어의 크기를 시간만큼 커지게 만듭니다. Z키를 누르는 동안 쌓이는 점프력을 표현하기 위해 `KeyHoldEvent`에 아래와 같이 작성합니다.
    
    
    @Component
    script ZKeyScaler extends Component
        @EventSender("Service", "InputService")
        handler HandleKeyHoldEvent(KeyHoldEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local key = event.key
        ---------------------------------------------------------
        if key == KeyboardKey.Z then
        	local keyHoldTime = _UtilLogic.ElapsedSeconds - self.KeyDownTime
        	local scale = 1 + keyHoldTime
        	self.Entity.TransformComponent.Scale = Vector3.one * scale
    
        end
        end
    end
    

커진 크기가 유지된 채로 다른 행동을 하지 못하도록 `KeyReleaseEvent`에 아래와 같이 작성합니다. 만약 아주 짧게 눌러서 `KeyHoldEvent`가 호출되지 않았다면 `KeyReleaseEvent`도 호출되지 않습니다.
    
    
    @Component
    script ZKeyScaleResetter extends Component
        @EventSender("Service", "InputService")
        handler HandleKeyReleaseEvent(KeyReleaseEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
         local key = event.key
        ---------------------------------------------------------
        if key == KeyboardKey.Z then
        	self.Entity.TransformComponent.Scale = Vector3.one
        end
        end
    end
    

#### 터치 입력

터치한 위치에 파티클을 보여주는 예제입니다.
    
    
    @Component
    script MultiTouchIndicator extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        local root = _EntityService:GetEntityByPath(EntityPath)
        for i = 1, #root.Children do
        	root.Children[i].Enable = false
        end
        end
    
        @EventSender("Service", "InputService")
        handler HandleScreenTouchEvent(ScreenTouchEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local TouchId = event.TouchId
        local TouchPoint = event.TouchPoint
        ---------------------------------------------------------
    
        if TouchId < 1 then
        	return
        end
    
        local root = _EntityService:GetEntityByPath(EntityPath)
        root.Children[TouchId].Enable = true
        root.Children[TouchId].BasicParticleComponent.Color = Color.green
        root.Children[TouchId].TransformComponent.WorldPosition = _UILogic:ScreenToWorldPosition(TouchPoint):ToVector3()
        end
    
        @EventSender("Service", "InputService")
        handler HandleScreenTouchReleaseEvent(ScreenTouchReleaseEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local TouchId = event.TouchId
        local TouchPoint = event.TouchPoint
        ---------------------------------------------------------
        if TouchId < 1 then
        	return
        end
    
        local root = _EntityService:GetEntityByPath(EntityPath)
        root.Children[TouchId].Enable = false
        root.Children[TouchId].BasicParticleComponent.Color = Color.white
        end
    end
    

#### 커서 변경

마우스 왼쪽 버튼의 입력 상태에 따라 커서 모양을 변경하는 예제입니다.
    
    
    @Component
    script ClickCursorHandler extends Component
        property string CursorRUID_Normal = "3930c5d2e85b4bff8467aada64fda7f5"
        property string CursorRUID_Click = "79819392249746f88952f3b2321f2f17"
        property boolean IsClicking = nil
    
        @ExecSpace("ClientOnly")
        method void OnUpdate(number delta)
        local click = _InputService:IsKeyPressed(KeyboardKey.Mouse0)
    
        if self.IsClicking == click then
        	return
        end
    
        if click == true then
        	_InputService:SetCursor(self.CursorRUID_Click, Vector2.zero)
        else
        	_InputService:SetCursor(self.CursorRUID_Normal, Vector2.zero)
        end
    
        self.IsClicking = click
        end
    end
    

# SeeAlso

  * BasicParticleComponent
  * RigidbodyComponent
  * StateComponent
  * TransformComponent
  * KeyboardKey
  * KeyDownEvent
  * KeyHoldEvent
  * KeyReleaseEvent
  * KeyUpEvent
  * ScreenTouchEvent
  * ScreenTouchReleaseEvent
  * UILogic
  * UtilLogic
  * Vector3
  * EntityService
  * [InputService를 활용한 입력과 액션](/docs?postId=209)