이벤트는 게임 내에서 발생하는 사건으로, 이에 대해 수신하고 응답할 수 있습니다. 많은 Roblox 서비스 및 객체에는 특정 작업이나 변경 사항에 자동으로 발생하는 기본 제공 이벤트가 있습니다.
예를 들어, 플레이어의 Character가 BasePart와 접촉하면 자동으로 Touched 이벤트가 발생합니다. 플레이어가 게임에 입장할 때마다 Players.PlayerAdded 이벤트가 발생합니다.
이벤트의 수가 방대하고 클라이언트-서버 아키텍처 때문에, Roblox 스크립팅은 종종 이벤트 기반이라고 불립니다. 이 접근 방식은 많은 다른 게임 엔진과 차별화되며, 이들 게임 엔진은 프레임별로 코드를 실행하는 것에 중점을 둡니다.
이벤트를 수신하거나 그에 대한 조치를 취할 필요는 없지만, 이벤트는 여전히 발생하며 사용 가능합니다. 이벤트에 응답하고 싶을 때는 이를 함수에 연결합니다.
이벤트에 함수 연결하기
이벤트에 함수를 연결하려면 Connect()를 사용하여 이벤트가 발생할 때마다 코드를 실행합니다. 대부분의 이벤트는 연결된 함수에 인수를 전달합니다. 예를 들어, BasePart.Touched 이벤트는 부품에 접촉한 객체(왼손이나 자동차 바퀴 등)를 전달하고, Players.PlayerAdded 이벤트는 게임에 입장한 Player를 전달합니다.
다음 코드 샘플은 onPartTouched()라는 함수를 부품의 Touched 이벤트에 연결하는 방법을 보여줍니다:
-- 스크립트가 부품에 부모로 설정되어 있다고 가정
local part = script.Parent
-- 실행할 함수
local function onPartTouched(object)
print("부품이", object:GetFullName(), "에 의해 터치되었습니다.")
end
-- 부품의 Touched 이벤트에 함수를 연결
part.Touched:Connect(onPartTouched)
변수를 부모 스코프에서 사용하고 함수를 다른 곳에서 사용하지 않으려는 경우에는 익명 함수를 이벤트에 연결할 수도 있습니다. 예를 들어, 아래 코드 샘플은 서비스의 유사한 샘플에서 중간 함수의 불편함을 피합니다:
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SaveManager = require(ReplicatedStorage:WaitForChild("SaveManager"))
local function saveProgress(character)
local position = character:FindFirstChild("HumanoidRootPart").Position
SaveManager.saveData(character, position)
end
-- 캐릭터가 게임에서 제거될 때 saveProgress()를 호출하는 익명 함수
-- (이 경우, 플레이어가 나갈 때).
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
이벤트에서 함수 연결 해제하기
Connect() 메서드는 RBXScriptConnection 객체를 반환합니다. 이벤트에 함수를 연결했지만 다음 번 이벤트 발생 시 그 함수를 호출하고 싶지 않은 경우, RBXScriptConnection 객체에서 Disconnect()를 호출하여 연결을 해제합니다.
다음 코드 샘플은 Part.Touched 이벤트에서 함수 연결 및 해제의 방법을 보여줍니다:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- 연결을 위한 빈 플레이스홀더 변수 선언
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("부품이 목표에 닿았습니다!")
-- 연결 해제
connection:Disconnect()
end
end
-- 위의 함수를 Touched 이벤트에 연결
connection = part.Touched:Connect(onPartTouched)
이벤트가 발생할 때까지 대기하기
특정 이벤트가 발생할 때까지 스크립트를 대기시키고 싶다면, Wait() 메서드를 사용하십시오. 이 메서드는 이벤트의 인수를 반환하며, 나중에 사용하기 위해 변수를 할당할 수 있습니다:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("부품이", touchedPart:GetFullName(), "에 의해 터치되었습니다.")