ContextActionService는 게임이 사용자 입력을 상황 별 작업 또는 특정 조건이나 기간에서만 활성화되는 작업에 바인딩 할 수 있도록하는 게임 서비스다. (예를 들어 플레이어가 가까이있는 동안에만 문을 열 수 있도록 허용)
코드에서 액션은 고유한 액션을 구별하기 위해 서비스에서 사용하는 단순한 문자열 (액션 이름)입니다. 액션 문자열은 다른 멤버 함수 중에서 BindAction 및 UnbindAction에 제공된다. 두 액션이 동일한 입력에 바인딩된 경우 가장 최근의 바인딩이 우선한다. 가장 최근의 작업이 바인딩 해제되면 이전에 바인딩 된 작업이 다시 제어된다. ContextActionService는 사용자 입력을 처리하기 때문에 클라이언트에서 실행되는 LocalScripts에서만 사용할 수 있다.
What is a context?
컨텍스트는 단순히 플레이어가 어떤 행동을 수행할 수있는 조건이다. 도구를 들고 있거나 차에 앉거나 문 근처에 서있는 경우를 예로 들수 있다. 어떤 경우이든 컨텍스트가 입력 될 때 BindAction을 호출하고, 컨텍스트가 남아있을 때 UnbindAction을 호출하는 것은 LocalScripts에 달려있다.
What is an action?
액션은 해당 컨택스트에서 플레이어가 수행 할 수있는 입력이다. 이러한 액션은 일부 메뉴를 열거나 닫을 수 있으며, 보조 도구 액션을 트리거하거나 RemoteFunction:InvokeServer를 사용하여 서버에 요청을 보낼 수 있다. 액션은 BindAction 및 UnbindAction의 첫 번째 매개 변수로써, 고유한 문자열로 식별된다. 문자열은 무엇이든 될 수 있지만 사용중인 입력이 아니라 수행중인 작업을 반영해야 한다. 예를 들어 'KeyH'(키 이름)를 액션 이름으로 사용하지 말고 대신 'CarHorn'(액션 이름)을 사용해야 한다. 여러 위치에서 액션을 사용할 것이므로 스크립트 상단에서 액션을 상수로 정의하는 것이 가장 좋다.
Why bind actions contextually? (액션을 상황적으로 묶는 이유는 무엇인가?)
대부분의 경우 UserInputService.InputBegan보다 ContextActionService의 BindAction을 사용하는 것이 좋다. InputBegan의 경우 연결된 함수는 플레이어가 액션이 수행되는 컨텍스트에 있는지 확인해야 한다. 대부분의 경우 이 방식은 컨텍스트가 입력 / 남아 있을 때 함수를 호출하는 것보다 어렵다. 예를 들어, 플레이어가 앉아있는 동안 H 키로 자동차 경적 소리가 나도록하길 원할때, 플레이어는 채팅에서 "hello"를 입력하거나 다른 작업에 H 키를 사용할 수도 있다. 이럴 경우, H 키 (예 : 채팅)를 사용하고 있는지 확인하기가 더 어렵고, 플레이어가 의도하지 않았을 때 차 경적이 울릴 수 있다!
BindAction 및 UnbindAction을 사용하는 경우, 플레이어가 자동차에 승하차 할 때 ContextActionService는 H 키가 눌려졌을 때 가장 최근에 바인딩 된 동작인 경우에만 경적 동작을 트리거하도록한다. 채팅과 같은 다른 항목이 제어권을 행사하는 경우 체크할 필요가 없다.
InputBegan - H키를 일반 공격으로 설정해놨을 때, 채팅 또는 다른 작업 중에 H키를 눌렀는지 일일히 확인해야 한다.
BindAction, UnbindAction - H를 눌렀을때 어떤 상황인지 체크할 필요가 없다. (갓)
Inspecting Bound Actions
액션 목록과 바운드 입력을 보려면 개발자 콘솔의 "Action Bindings"탭 (게임에서 F9)을 통해 검사 할 수 있다. 이것은 Roblox CoreScripts 및 기본 카메라 / 제어 스크립트로 바인딩 된 바인딩을 포함한 모든 바인딩을 보여준다. 이것은 디버깅에 유용하다. 액션이 올바른 시간에 바인딩 / 바인딩 해제되었는지 또는 다른 액션이 입력을 가로채는지 확인한다.
예를 들어, WASD를 바인딩하려는 경우 기본 캐릭터 이동 스크립트가 동일한 키에 바인딩되는 경우일 수 있다. 마찬가지로 카메라 제어 스크립트가 당신의 스크립트보다 늦게 실행되는 경우 오른쪽 클릭 입력을 가로챌 수 있다.
Keyboardless Input
ContextActionService는 게임 패드 및 터치 입력을 지원하는 데 특히 유용하다. 게임 패드 입력의 경우 사용자가 다른 메뉴를 모두 사용할 때 이전 메뉴로 돌아가는 액션에 B 버튼을 바인딩하도록 선택할 수 있다.
터치의 경우 키 누름 대신 스크린 터치 버튼을 사용할 수 있다.이 버튼은 동작이 바인딩 된 동안에만 표시되며, 이 서비스를 통해 이러한 버튼의 위치, 텍스트 및 이미지를 구성할 수 있다.
하지만 커스터마이징이 다소 제한되기 때문에, 일반적으로 ImageButton 또는 TextButton을 사용하여 자신만의 화면 버튼을 만드는 것이 좋다.
Code Samples
이 예제는 사용자 입력을 컨텍스트 액션에 바인딩 할 때 ContextActionService를 사용하는 방법을 올바르게 보여준다. 컨텍스트는 장착된 도구다. 이 액션은 일부 무기를 재장전합니다. 이 코드 샘플을 Tool의 자식이 되는 위치에 LocalScript를 배치하여 테스트하도록 하자. 도구가 장착되면 "Reload" 액션이 바인딩되고 도구가 장착 해제되면 "Reload" 액션이 바인딩 해제된다. 플레이어가 도구를 장착한 상태에서 R을 누르면 "재장전 중!"이라는 메시지가 표시된다.
local ContextActionService = game:GetService("ContextActionService")
local ACTION_RELOAD = "Reload"
local tool = script.Parent
local function handleAction(actionName, inputState, inputObject)
if actionName == ACTION_RELOAD and inputState == Enum.UserInputState.Begin then
print("Reloading!")
end
end
tool.Equipped:Connect(function ()
ContextActionService:BindAction(ACTION_RELOAD, handleAction, true, Enum.KeyCode.R)
end)
tool.Unequipped:Connect(function ()
ContextActionService:UnbindAction(ACTION_RELOAD)
end)
참고 링크
developer.roblox.com/en-us/api-reference/class/ContextActionService
ContextActionService
ContextActionService is a game service that allows a game to bind user input to contextual actions, or actions that are only enabled under some condition or period of time. For example, allowing a player to open a door only while close by. In code, an acti
developer.roblox.com
'API 문서' 카테고리의 다른 글
WeldConstraints (0) | 2021.04.17 |
---|---|
ManualWeld (0) | 2021.04.11 |
TweenService (0) | 2021.04.11 |
Debris (0) | 2021.04.11 |
UserInputService (0) | 2021.04.10 |
댓글