바인드 가능한 이벤트와 콜백

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

및 개체는 클라이언트-서버 경계의 동일한 측면에서 스크립트 간의 동작을 바인딩하고 경험 내 작업에 대한 특정 원하는 결과를 커뮤니케이트할 수 있습니다.

바인딩 가능한 이벤트의 가장 일반적인 사용 사례는 라운드 기반 구조를 가진 경험입니다.예를 들어, 다른 스크립트가 타이머를 시작하고 리더보드를 표시할 수 있는 "매치 시작" 이벤트와 플레이어를 로비로 돌려 놓고 우승자를 표시할 수 있는 해당 "매치 종료" 이벤트가 있을 수 있습니다.

스크립트 간의 활동을 조정하기 때문에, 바인딩 가능한 이벤트는 일반적으로 서버에서 사용되지만 클라이언트에서도 사용할 수 있습니다.

경험이 어떻게 작동하는지에 따라 바인딩 가능한 이벤트는 코드를 더 모듈화하는 데 도움이 될 수 있지만 모듈 스크립트는 데이터를 스크립트 간에 공유해야 하는 상황에서 종종 더 나은 대안입니다.사용자 지정 이벤트에 모듈 스크립트를 결합하여 더 깔끔한 구문을 사용할 수도 있습니다(사용자 지정 이벤트에 참조).

바인드 가능한 이벤트

오브젝트는 비동기적이고 일방적인 스크립트 간 통신을 통해 사용자 지정 이벤트를 활성화합니다.

방법을 통해 발사할 때, 발사 스크립트는 생성하지 않습니다 및 대상 함수는 특정 제한으로 전달된 인수를 받습니다.모든 이벤트와 마찬가지로, BindableEvents 연결된 각 함수의 스레드를 생성하므로 오류가 발생해도 다른 사람들이 계속됩니다.

Studio의 BindableEvent 창을 사용하여 새로운 를 생성하려면:

  1. BindableEvent를 삽입하려는 컨테이너에 마우스를 이동합니다.서버 스크립트와 클라이언트 스크립트 간의 통신에는 ServerScriptService를, 클라이언트 스크립트와 서버 스크립트 간의 통신에는 ReplicatedStorage를 사용하는 것이 좋습니다.
  2. 컨테이너의 이름 오른쪽에 나타나는 버튼을 클릭하고 바인드 가능한 이벤트 인스턴스를 삽입합니다.
  3. 인스턴스를 TestBindableEvent로 이름 바꾸기.

을 생성한 후, 한 스크립트에서 함수를 연결하여 해당 이벤트에 연결하고 다른 스크립트에서 이벤트를 합니다.

이벤트 연결

local ServerScriptService = game:GetService("ServerScriptService")
-- 바인딩할 수 있는 이벤트 인스턴스에 대한 참조 가져오기
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- 무명 함수를 이벤트에 연결 Connect anonymous function to event
bindableEvent.Event:Connect(function(data)
print(data) --> 라운드가 시작되었습니다!
end)
이벤트 발사

local ServerScriptService = game:GetService("ServerScriptService")
-- 바인딩할 수 있는 이벤트 인스턴스에 대한 참조 가져오기
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- 화염 바인드 이벤트
bindableEvent:Fire("Round started!")

사용자 지정 콜백

BindableFunction 개체는 스크립트 간의 동기 2방향 통신을 허용합니다.사용자 지정 콜백 함수를 정의하고 BindableFunction:Invoke() 를 호출하여 수동으로 호출할 수 있습니다.함수를 호출하는 코드 는 해당 콜백을 찾을 때까지 반환하고, 콜백은 전달한 인수를 받습니다.콜백이 설정되지 않았으면 콜백을 호출하는 스크립트는 실행을 재개하지 않습니다.

Studio의 BindableFunction 창을 사용하여 새로운 를 생성하려면:

  1. BindableFunction를 삽입하려는 컨테이너에 마우스를 이동합니다.서버 스크립트와 클라이언트 스크립트 간의 통신에는 ServerScriptService를, 클라이언트 스크립트와 서버 스크립트 간의 통신에는 ReplicatedStorage를 사용하는 것이 좋습니다.
  2. 컨테이너의 이름 오른쪽에 나타나는 버튼을 클릭하고 바인더블 함수 인스턴스를 삽입합니다.
  3. 인스턴스를 TestBindableFunction로 이름 바꾸기.

을 생성한 후, 한 스크립트에서 해당 의 콜백에 연결한 다음, 다른 스크립트에서 콜백 함수를 연결할 수 있습니다.

콜백 연결

local ServerScriptService = game:GetService("ServerScriptService")
-- 바인딩할 수 있는 함수에 대한 참조 가져오기
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- 콜백 함수
local function addTwoNumbers(a, b)
return a + b
end
-- 함수를 바인드 가능한 함수의 콜백으로 설정
bindableFunction.OnInvoke = addTwoNumbers
이벤트 호출

local ServerScriptService = game:GetService("ServerScriptService")
-- 바인딩할 수 있는 함수에 대한 참조 가져오기
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- 콜백 함수 호출 및 반환된 값 출력
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

인수 제한

를 발사하거나 콜백 함수에 전달하는 모든 인수를 전달하면 이벤트나 콜백 함수에서 전달하는 모든 인수를 전달합니다.When you fire a or invoke a , it forwards any arguments that you pass with the event or to the callback function.모든 종류의 Roblox 개체(Enum, Instance 등)와 Luau 형식(숫자, 문자열 및 부울과 같은)을 통과할 수 있지만, 다음 제한 사항을 신중하게 고려해야 합니다.

문자열이 아닌 인덱스

패스된 테이블의 모든 인덱스 가 문자열이 아닌 경우, 예를 들어 Instance , 사용자 데이터 또는 함수 , Roblox는 자동으로 이러한 인덱스를 문자열로 변환합니다.

이벤트 연결

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> 문자열
end
end
-- 연결 함수를 이벤트에 연결 Connect function to event
bindableEvent.Event:Connect(onEventFire)
이벤트 발사

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- 키로 작업 영역 인스턴스가 포함된 테이블로 화재 이벤트 발생
bindableEvent:Fire({
[workspace.Baseplate] = true
})

테이블 인덱싱

데이터 테이블을 전달하는 경우 숫자와 문자열 키의 혼합 테이블을 전달하지 마십시오.대신, 전체 키-값 쌍(사전) 또는 전체 숫자 인덱스(배열)로 구성된 테이블을 전달합니다.

이벤트 연결

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
-->1 = 검
--> 2 = 보우
--> CharName = 디바 드래곤슬레이어
--> CharClass = 도둑
end
end
-- 연결 함수를 이벤트에 연결 Connect function to event
bindableEvent.Event:Connect(onEventFire)
이벤트 발사

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- 숫자로 인덱스된 테이블
local inventoryData = {
"Sword", "Bow"
}
-- 사전 테이블
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- 일관되게 인덱싱된 테이블로 화재 이벤트 발생
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

테이블 식별자

바인딩할 수 있는 이벤트와 콜백에 전달된 테이블은 복사되어 이벤트를 발사하거나 콜백을 호출할 때 제공된 것과 정확히 동일하지 않습니다.Tables passed as arguments to bindable events and callbacks are copied, meaning they will not be exactly equivalent to those provided when firing the event or invoking the callback.반환된 테이블은 제공된 것과 정확히 동일하지 않을 수도 있습니다.다음 스크립트를 실행하여 BindableFunction 에서 테이블 식별자가 어떻게 다른지 확인할 수 있습니다.

콜백 연결

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- 콜백 함수
local function returnTable(passedTable)
-- 호출 시 테이블 식별자 출력 Output table identity on invocation
print(tostring(passedTable)) --> 테이블: 0x48eb7aead27563d9
return passedTable
end
-- 함수를 바인드 가능한 함수의 콜백으로 설정
bindableFunction.OnInvoke = returnTable
이벤트 호출

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- 원래 테이블 식별자 출력
print(tostring(inventoryData)) --> 테이블: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- 반환 시 테이블 식별자 출력
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

메타테이블

테이블에 메타테이블이 있으면 모든 메타테이블 정보가 전송 중에 손실됩니다.다음 코드 샘플에서 NumWheels 속성은 Car 메타블에 속합니다.서버가 다음 테이블을 받을 때, 테이블에는 속성이 있지만 속성은 없습니다.

이벤트 연결

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> {["이름"] = "MyTruck()}
end
-- 연결 함수를 이벤트에 연결 Connect function to event
bindableEvent.Event:Connect(onEvent)
이벤트 발사

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- 메타테이블을 포함하는 테이블로 화재 이벤트 발생 Fire event with table including a metatable
bindableEvent:Fire(truck)