ScavengerHunt 개발자 모듈은 플레이어가 본질적으로 게임화된 방식을 통해 체험을 탐색할 수 있게 하고, 전체 장소를 유기적으로 소개합니다. 플레이어의 진행 상황은 지속적이므로, Scavenger Hunt는 여러 세션에서 계속될 수 있습니다.
모듈 사용
설치
체험에서 ScavengerHunt 모듈을 사용하려면:
보기 탭에서 도구 상자를 열고 마켓플레이스 탭을 선택합니다.
모델 정렬이 선택되었는지 확인한 다음 카테고리에서 모두 보기 버튼을 클릭합니다.
DEV MODULES 타일을 찾아 클릭합니다.
Scavenger Hunt 모듈을 찾아 클릭하거나 3D 보기로 끌어다 놓습니다.
탐색기 창에서 전체 ScavengerHunt 모델을 ServerScriptService로 이동시킵니다. 체험을 실행하면 모듈이 다양한 서비스에 배포되고 실행되기 시작합니다.
토큰 사용
Scavenger Hunt 모듈은 플레이어가 검색하고 수집하는 아이템으로 토큰을 사용합니다. 이러한 모듈은 3D 월드에 배치할 수 있는 하나의 토큰 모델과 함께 제공됩니다.
모듈 기본 폴더의 Workspace 폴더에서 Token1 메시를 찾습니다.
Token1을 최상위 작업 공간 계층으로 이동하고 원하는 위치에 배치합니다.
토큰에 고유한 이름을 지정합니다. 이러한 이름은 모듈이 각 플레이어가 수집한 토큰을 추적하는 방법입니다.
더 많은 토큰을 추가하려면 기존 토큰을 복제하고 고유한 이름을 지정하십시오.
번들 메쉬 토큰을 사용하지 않는다면, 다음 기준을 충족시키는 한 Model 또는 BasePart이(가) 작동합니다.
- 개체에 ScavengerHuntPart(이)라는 CollectionService 태그가 있습니다. 원하는 경우, configureServer 호출에서 tokenTag에 다른 값을 설정하여 모듈이 활용하는 태그 이름을 변경할 수 있습니다.
- 개체에는 토큰이 수집될 때 표시되는 '플레이버 텍스트'로 자식 StringValue 인스턴스가 포함되어 있습니다.
지역 사용
지역은 플레이어가 입장하면 '수집됨'으로 표시되는 넓은 지역이라는 점이 토큰과 약간 다릅니다. 또한 플레이어가 지역을 떠나면 플레이버 텍스트 모달이 자동으로 닫히고 지역 자체가 작업 공간에서 제거됩니다.
지역 주위에 블록이나 구체 등의 고정된 파트를 생성합니다. 모듈은 런타임에 CanCollide 속성을 자동으로 비활성화하여 플레이어가 지역과 물리적으로 충돌하지 않도록 합니다.
고유한 이름을 지정합니다. 이러한 이름은 모듈이 각 플레이어가 입력한 지역을 추적하는 방법입니다.
ScavengerHuntPart 파트에 CollectionService 태그를 지정합니다. 원하는 경우, configureServer 호출에서 tokenTag에 다른 값을 설정하여 모듈이 활용하는 태그 이름을 변경할 수 있습니다.
지역을 입력할 때 표시할 '플레이버 텍스트'로 설정된 자식 StringValue 인스턴스를 포함시킵니다.
구성
이러한 모듈은 대부분의 사용 사례에서 작동하도록 미리 구성되어 있지만, 쉽게 사용자 지정할 수 있습니다. 예를 들어, 토큰 회전 속도를 변경하고 모달 정보 메시지를 사용자 지정하려면 다음을 수행하십시오.
StarterPlayerScripts에서 새 LocalScript을(를) 생성하고 ConfigureScavengerHunt로 이름을 바꿉니다.
새로운 스크립트에 다음의 코드를 붙여 넣습니다.
LocalScript - ConfigureScavengerHuntlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))ScavengerHunt.configureClient({infoModalText = "Welcome to my Scavenger Hunt!",completeModalText = "Thanks for playing my Scavenger Hunt!",tokenRotationSpeed = 60,})
수집물 이벤트
플레이어가 토큰을 수집하거나 지역에 들어갈 때마다 수집됨 이벤트가 발동됩니다. 서버 측 Script에서 해당 이벤트를 수신하고 이에 응답할 수 있습니다. 연결된 함수는 토큰과 충돌했거나 지역에 들어간 Player와(과) 해당 토큰 또는 지역의 이름을 전달받습니다.
마찬가지로 플레이어가 모든 토큰을 수집하거나 태그가 지정된 모든 지역에 들어가면 allCollected 이벤트가 발동되고 연결된 함수가 관련 Player을(를) 수신합니다. 해당 함수는 플레이어당 한 번만 발동되며, 해당 플레이어에게 배지, 새로운 영역에 대한 액세스 권한, 체험 내 화폐 등을 통해 보상하는 데 사용됩니다.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.collected:Connect(function(player, itemName)
print(player.DisplayName, itemName)
end)
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completed the hunt!")
end)
사용자 지정 GUI
해당 모듈은 기본 GUI를 사용자 지정하는 다양한 옵션을 제공하지만, 사용자 지정 GUI 요소를 표시하도록 설정할 수도 있습니다.
configureClient 함수에서 useCustomModals이(가) true(으)로 설정되면 플레이어가 토큰 추적기를 활성화할 때마다 항상 showInfoModal 이벤트가 발동됩니다. 마찬가지로 showCompleteModal 이벤트는 플레이어가 보물 찾기에서 모든 것을 수집했을 때 발동됩니다. 해당 두 이벤트 모두 LocalScript에서 들을 수 있습니니다.
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.showInfoModal:Connect(function()
-- Show a custom info modal
local infoModal = Players.LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal.Enabled = true
end)
ScavengerHunt.showCompleteModal:Connect(function()
-- Show a custom complete modal
local completeModal = Players.LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)
GUI 가시성
기본적으로 Scavenger Hunt에서는 정보 모달 또는 완료 모달이 나타날 때 모든 ScreenGuis와(과) CoreGuis(플레이어 목록 제외)이(가) 숨겨집니다. 해당 자동 숨기기 동작을 무효화하고 프로그래밍 방식으로 가시화할 GUI를 결정하려면, hideOtherGuis 및 showOtherGuis 콜백을 포함시켜 고유한 사용자 지정 논리로 대응하십시오.
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local hiddenInstances = {}
-- Create a screen GUI that will not be hidden
local specialGuiInstance = Instance.new("ScreenGui")
-- Draw the screen GUI above the scavenger hunt GUI
specialGuiInstance.DisplayOrder = 1
specialGuiInstance.Parent = playerGui
-- Add text label to the GUI
local specialLabel = Instance.new("TextLabel")
specialLabel.Size = UDim2.fromScale(1, 0.1)
specialLabel.Text = "Remains visible when displaying modals"
specialLabel.Font = Enum.Font.GothamMedium
specialLabel.TextSize = 24
specialLabel.Parent = specialGuiInstance
ScavengerHunt.hideOtherGuis(function()
-- Hide all developer-defined screen GUIs
local instances = playerGui:GetChildren()
for _, instance in pairs(instances) do
if instance:IsA("ScreenGui") and not instance.Name == "ScavengerHunt" and instance.Enabled then
instance.Enabled = false
table.insert(hiddenInstances, instance)
end
end
-- Hide specific core GUIs
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)
ScavengerHunt.showOtherGuis(function()
-- Show all developer-defined screen GUIs that were hidden
for _, instance in pairs(hiddenInstances) do
instance.Enabled = true
end
hiddenInstances = {}
-- Show specific core GUIs that were hidden
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)
API 참조
함수
configureClient
configureClient(config:table):nil
config 테이블의 다음 키/값을 통해 기본 클라이언트 측 구성 옵션을 무효화합니다. 해당 함수는 LocalScript에서만 호출할 수 있습니다.
일반
키 | 설명 | 기본 |
---|---|---|
autoDismissTime | 모달이 자동으로 닫히거나 다음 페이지(존재하는 경우)로 이동하기까지의 시간(초). 비활성화하려면 0으로 설정합니다. | 20 |
closeModalGamepad | 모달을 닫는 데 사용되는 게임 패드 버튼(Enum.KeyCode). | ButtonA |
closeModalKeyboard | 모달을 닫는 데 사용되는 키보드 키(Enum.KeyCode). | E |
completeModalText | Scavenger Hunt가 완료되고 토큰 추적기를 클릭했을 때 나타나는 모달에 표시할 텍스트. | "Thanks for participating!" |
infoModalText | 토큰 추적기를 클릭했을 때 나타나는 모달에 표시할 텍스트. | "Find all the tokens to complete the hunt" |
tokenRotationSpeed | 토큰이 회전하는 속도(초당 각도). 회전하지 않게 하려면 0으로 설정합니다. | 20 |
nextArrowImage | 현재 모달 페이지 다음에 모달 페이지가 추가로 표시된다는 것을 나타내는 이미지. | "rbxassetid://8167172095" |
openTokenTrackerGamepad | 토큰 추적기를 활성화했을 때 나타나는 모달을 표시하는 데 사용되는 게임 패드 버튼(Enum.KeyCode). | ButtonY |
openTokenTrackerKeyboard | 토큰 추적기를 활성화했을 때 나타나는 모달을 표시하는 데 사용되는 키보드 키(Enum.KeyCode). | Y |
openTokenTrackerGamepadButtonImage | 토큰 추적기를 활성화하는 데 사용되는 게임 패드 버튼 이미지. | "rbxassetid://8025860488" |
regionIcon | 지역 진입 시 토큰 트래커 옆에 표시되는 아이콘. | "rbxassetid://8073794624" |
tokenIcon | 토큰을 수집할 때 토큰 추적기 옆에 표시되는 아이콘. | "rbxassetid://8073794477" |
tokenTrackerPositionSmallDevice | 휴대폰 등 소형 장치의 토큰 추적기 UI 위치(UDim2). | (1, 0, 0, 84) |
tokenTrackerPositionLargeDevice | 태블릿 및 PC 등 더 큰 장치의 토큰 추적기 UI 위치(UDim2). | (1, 0, 1, -16) |
useRegions | 토큰 대신 지역을(를) 사용하십시오. | false |
모달
키 | 설명 | 기본 |
---|---|---|
modal.backgroundColor | 모달의 배경색(Color3). | [0, 0, 0] |
modal.font | 모달에 표시되는 텍스트 글꼴(Enum.Font). | GothamMedium |
modal.textColor | 모달에 표시되는 텍스트 색상(Color3). | [255, 255, 255] |
modal.textSize | 모달에 표시되는 텍스트 크기. | 16 |
useCustomModals | 참인 경우, 기본 모달이 표시되지 않습니다. 사용자 지정 GUI에 설명된 대로, 이를 통해 사용자 정의 모달을 표시할 수 있습니다. | false |
useCustomTokenTracker | 참인 경우, 기본 토큰 추적기가 표시되지 않습니다. 이를 통해 사용자 지정 토큰 추적기 GUI를 대신 표시할 수 있습니다. | false |
내비게이션 빔
키 | 설명 | 기본 |
---|---|---|
showNavigationBeam | 참이면 플레이어에서 가장 가까운 토큰까지 Beam이(가) 표시됩니다. | true |
navigationBeam.color | ColorSequence 세그먼트 전체에서 빔의 색상을 정의합니다. 자세한 내용은 Beam.Color을(를) 참조하십시오. | [255, 255, 255] → [255, 255, 255] |
navigationBeam.curveSize0 | 빔의 베지어 곡선 위의 첫 번째 제어점 위치. 자세한 내용은 Beam.CurveSize0을(를) 참조하십시오. | 0 |
navigationBeam.curveSize1 | 빔의 베지어 곡선의 두 번째 제어점 위치. 자세한 내용은 Beam.CurveSize1을(를) 참조하십시오. | 0 |
navigationBeam.faceCamera | 빔의 세그먼트가 방향에 관계없이 항상 카메라를 향할지 여부. 자세한 내용은 Beam.FaceCamera을(를) 참조하십시오. | true |
navigationBeam.lightEmission | 빔의 색상이 빔 뒤에 있는 색상과 혼합되는 정도. 자세한 내용은 Beam.LightEmission을(를) 참조하십시오. | 0 |
navigationBeam.lightInfluence | 빔이 환경 조명의 영향을 받는 정도. 자세한 내용은 Beam.LightInfluence을(를) 참조하십시오. | 0 |
navigationBeam.segments | 빔을 구성하는 직선 세그먼트 수. | 10 |
navigationBeam.texture | 빔에 표시할 텍스처의 자산 ID. | "rbxassetid://8081777495" |
navigationBeam.textureLength | navigationBeam.textureMode의 설정에 따른 빔 텍스처의 길이. 자세한 내용은 Beam.TextureLength을(를) 참조하십시오. | 1 |
navigationBeam.textureMode | 빔 텍스처의 크기가 조정되고 반복되는 방식(Enum.TextureMode). | Wrap |
navigationBeam.textureSpeed | 텍스처 이미지가 빔을 따라 이동하는 속도. | 1 |
navigationBeam.transparency | NumberSequence 세그먼트 전체에서 빔의 투명도를 정의함. 자세한 내용은 Beam.Transparency을(를) 참조하십시오. | (0, 0) → (0.15, 1) → (1, 1) |
navigationBeam.width0 | 베이스의 빔 폭(스터드 내). | 1 |
navigationBeam.width1 | 가장자리 빔 폭(스터드 내). | 1 |
navigationBeam.zOffset | 빔의 디스플레이가 카메라를 기준으로 오프셋되는 거리(스터드 단위). | 0 |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))ScavengerHunt.configureClient({infoModalText = "Welcome to my Scavenger Hunt!",completeModalText = "Thanks for playing my Scavenger Hunt!",tokenRotationSpeed = 60,navigationBeam = {lightEmission = 1},modal = {textSize = 14},})
configureServer
configureServer(config:table):nil
config 테이블의 다음 키/값을 통해 기본 서버측 구성 옵션을 무효화합니다. 해당 함수는 Script에서만 호출할 수 있습니다.
키 | 설명 | 기본 |
---|---|---|
tokenTag | Scavenger Hunt에 사용된 모든 토큰 또는 지역을 찾기 위해 CollectionService이(가) 사용하는 태그. | "ScavengerHuntPart" |
datastoreName | Scavenger Hunt에서 각 플레이어의 수집 진행 상황을 저장하는 데 사용하는 DataStore의 이름. | "ScavengerHuntTokens" |
resetOnPlayerRemoving | 참인 경우, 사용자가 체험을 떠날 때 사용자의 진행 상황을 재설정합니다. Scavenger Hunt를 테스트하는 동안 진행 상황을 저장하지 않으므로 편리합니다. | false |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))ScavengerHunt.configureServer({tokenTag = "GreenGem",})
disable
disable():nil
Scavenger Hunt에 대한 모든 UI를 숨기고, 모든 입력 이벤트 리스너의 연결을 끊고, 플레이어가 토큰을 수집하거나 지역과 상호 작용하지 못하도록 합니다. 해당 함수는 Script에서만 호출할 수 있습니다.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))ScavengerHunt.disable()
가능
enable():nil
Scavenger Hunt에 대한 모든 UI를 표시하고, 모든 입력 이벤트 리스너를 연결하고, 플레이어가 토큰을 수집하고 지역과 상호 작용할 수 있도록 합니다. 해당 함수는 Script에서만 호출할 수 있습니다.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))ScavengerHunt.enable()
이벤트
수집됨
collected(player:Player, itemName:string, totalCollected:number): RBXScriptSignal
플레이어가 토큰과 충돌하거나 지역에 들어갈 때 발동됩니다. 연결된 함수는 토큰과 충돌하거나 영역에 들어간 Player와(과) 충돌한 토큰의 이름 또는 입력된 영역을 수신합니다. 해당 이벤트는 Script에서만 연결할 수 있습니다.
**매개변수 ** | |
---|---|
player: Player | 토큰과 충돌하거나 지역에 진입한 사용자. |
itemName: string | 충돌한 토큰의 이름 또는 입력한 지역. |
totalCollected: number | player(으)로 표시된 사용자가 수집한 총 토큰 수. |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.collected:Connect(function(player, itemName, totalCollected)
print(player.DisplayName, itemName, totalCollected)
end)
allCollected
allCollected(player:Player): RBXScriptSignal
플레이어가 Scavenger Hunt에서 모든 토큰을 수집하거나 모든 지역에 들어갈 때 발동됩니다. 연결된 함수는 모든 토큰을 수집한 Player을(를) 수신하고 플레이어당 한 번만 발동됩니다. 해당 이벤트는 Script에서만 연결할 수 있습니다.
**매개변수 ** | |
---|---|
player: Player | 모든 토큰을 모았거나 모든 지역에 입장한 플레이어. |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completed the hunt!")
end)
showInfoModal
showInfoModal(): RBXScriptSignal
useCustomModals 구성 옵션이 참으로 설정된 경우, 플레이어가 토큰 추적기를 클릭하면 발동됩니다. 해당 이벤트는 LocalScript에서만 연결할 수 있습니다.
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.showInfoModal:Connect(function()
local infoModal = Players.LocalPlayer.PlayerGui.InfoModal
infoModal.Enabled = true
end)
showCompleteModal
showCompleteModal(): RBXScriptSignal
플레이어가 useCustomModals 구성 옵션이 true(으)로 설정되어 있고 플레이어가 Scavenger Hunt에서 모든 토큰을 수집한 경우, 토큰 추적기를 클릭하면 발동됩니다. 해당 이벤트는 LocalScript에서만 연결할 수 있습니다.
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.showCompleteModal:Connect(function()
local completeModal = Players.LocalPlayer.PlayerGui.CompleteModal
completeModal.Enabled = true
end)
콜백
hideOtherGuis
hideOtherGuis(callback:function)
해당 콜백은 모달이 표시되기 직전에 실행되므로, 모달이 표시되기 전에 전체 ScreenGuis 또는 요소를 비활성화할 수 있습니다. 자세한 내용 및 샘플 코드는 GUI 가시성을 참조하십시오.
showOtherGuis
showOtherGuis(callback:function)
해당 콜백은 모달이 제거된 후 즉시 실행되므로, 전체 B 또는 요소 내에서 전체 ScreenGuis 또는 요소를 활성화할 수 있습니다. 자세한 내용 및 샘플 코드는 GUI 가시성을 참조하십시오.