본문 바로가기

로블록스 개발 중급

플레이어의 키입력 처리하기

플레이어의 키입력을 원하는 작업에 연결하면 어떨까? 플레이어가 키를 누를 때마다 직관적이고 게임 기능을 훨씬 빠르게 제어할 수 있게 되어서 몰입감을 높이는데 도움을 줄 것이다. 이 포스팅에서는 총(Tool)의 장전(reload)을 특정 키에 바인딩하여 제어 할 수 있는 방법을 알아보겠다.

시작하기

이전 포스팅와 내용이 이어지므로 설정과 소스 코드등을 참고하기 바란다.

2021.05.04 - [로블록스 개발 중급] - Player Tools 사용하기

액션 핸들러(Action Handler) 생성

먼저 플레이어의 키입력을 감지하는 함수가 필요하다. Blaster모델에 ToolController라는 이름으로 로컬스크립트를 추가하자. 

 

ToolController에 키 바인딩(키와 함수를 연결)하는 코드를 추가한다.

  • 액션의 이름을 "reloadWeapon"이라고 정하고 변수를 생성해두고, 
local RELOAD_ACTION = "reloadWeapon"
  • 키바인딩에 사용될 함수 OnAction()함수를 정의한다. OnAction함수는 세가지 인자를 가지는데, 각각 actionName(액션의 이름), inputState(입력 상태), inputObject(입력 부가데이터)이다. 이 함수는 키입력이 감지되면 실행될 것이다.
local function onAction(actionName, inputState, inputObject)
	
end
  • OnAction함수의 내용은 다음과 같다.
    1. actionName을 확인하고 원하는 액션인지를 체크한다.
    2. 원하는 액션임을 확인하면, inputState를 확인하여 키입력이 시작된 상태(Enum.UserInputState.Begin)인지 확인한다. 키상태가 바뀔 때마다 불려지는 함수에 대해서 가드를 해줘야 하기 때문에 필요한 작업이다.
local function onAction(actionName, inputState, inputObject)
	if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin then
		
	end
end
  • 플레이어가 다시 총 장전이 필요한 타이밍인지 아닌지를 명확하게 명시적으로 알려주기 위해서 Tool의 이미지를 교체해준다. Tool의 TextureId를 "rbxassetid://6593020923"으로 잠시 변경한 다음 원래 값인 "rbxassetid://92628145"로 다시 변경한다.
local function onAction(actionName, inputState, inputObject)
    if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin then
        tool.TextureId = "rbxassetid://6593020923"
        wait(2)
        tool.TextureId = "rbxassetid://92628145"
    end
end

키입력과 함수의 연결(키 바인딩 작업)

ContextActionService라는 서비스의 BindAction 함수를 사용하여 특정 입력(키입력)에 함수를 바인딩하는 데 사용할 수 있다. ContextActionService:BindAction() 함수의 인자를 살펴보면 다음과 같다.

  • 액션의 이름
  • 액션을 처리할 함수(콜백 함수)
  • 터치 스크린 버튼을 화면에 보여줄 것인지 아닌지(Boolean)
  • 액션과 연결 시킬 키 코드(KeyCode, 여러개 가능)

키 코드는 단순히 키보드의 키뿐 아니라 컨트롤러의 버튼과 같은 다양한 입력 버튼을 내타낸다. 가능한 키 코드 리스트는 KeyCode List 링크를 참고하자.

 

1. ContextActionService라는 서비스를 얻어오자.

local ContextActionService = game:GetService("ContextActionService")

2. toolEquipped() 함수(Blast를 장착할 때마다 호출되는 함수) 내에서 BindAction을 호출하고 아래의 인수들를 전달한다.

  • 액션의 이름 : RELOAD_ACTION
  • 액션을 처리할 함수 : onAction
  • 터치 스크린 버튼을 화면에 보여줄 것인지 아닌지 : true
  • 액션과 연결 시킬 키 코드 : Enum.KeyCode.R
local function toolEquipped()
	ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)
	tool.Handle.Equip:Play()
end

3. R키를 눌러서 테스트를 해본다. R키를 누르면 Tool 이미지가 교체되어야 한다.

키입력과 액션을 끊기(Unbinding the Action)

플레이어가 Blast의 사용을 그만 두었을 때는 "R"키로 리로드되는 기능을 정지 시켜야 한다. 그러기 위해서 Unbinding 작을 해줘서 더 이상 "R"키의 입력에 반응하지 않게 만들자

1. toolUnpowered이라는 새로운 함수를 만들어서 UnbindAction을 호출하여 액션의 이름을 전달한다.

local function toolUnequipped()
	ContextActionService:UnbindAction(RELOAD_ACTION)
end

2. toolUnequipped() 함수와 Unequipped 이벤트를 연결하여 Blast가 장착 해제 이벤트마다 호출되게 하자.

tool.Unequipped:Connect(toolUnequipped)

이제 Blast의 리로드(장전) 애니메이션의 키입력 바인딩의 내용은 끝났다. 다음 포스팅에서 블라스터가 발사될 때마다 탄약 카운트를 1씩 다운시키고 탄약이 바닥나면 그때만, 리로드(재장전)하는 식으로 고쳐보겠다.