보물찾기

ScavengerHunt 개발자 모듈은 플레이어가 본질적으로 게임화된 방식을 통해 체험을 탐색할 수 있게 하고, 전체 장소를 유기적으로 소개합니다. 플레이어의 진행 상황은 지속적이므로, Scavenger Hunt는 여러 세션에서 계속될 수 있습니다.

모듈 사용

설치

체험에서 ScavengerHunt 모듈을 사용하려면:

  1. 보기 탭에서 도구 상자를 열고 마켓플레이스 탭을 선택합니다.

    Studio의 도구상자 토글 버튼
  2. 모델 정렬이 선택되었는지 확인한 다음 카테고리에서 모두 보기 버튼을 클릭합니다.

  3. DEV MODULES 타일을 찾아 클릭합니다.

  4. Scavenger Hunt 모듈을 찾아 클릭하거나 3D 보기로 끌어다 놓습니다.

  5. 탐색기 창에서 전체 ScavengerHunt 모델을 ServerScriptService로 이동시킵니다. 체험을 실행하면 모듈이 다양한 서비스에 배포되고 실행되기 시작합니다.

토큰 사용

Scavenger Hunt 모듈은 플레이어가 검색하고 수집하는 아이템으로 토큰을 사용합니다. 이러한 모듈은 3D 월드에 배치할 수 있는 하나의 토큰 모델과 함께 제공됩니다.

  1. 모듈 기본 폴더의 Workspace 폴더에서 Token1 메시를 찾습니다.

  2. Token1을 최상위 작업 공간 계층으로 이동하고 원하는 위치에 배치합니다.

  3. 토큰에 고유한 이름을 지정합니다. 이러한 이름은 모듈이 각 플레이어가 수집한 토큰을 추적하는 방법입니다.

  4. 더 많은 토큰을 추가하려면 기존 토큰을 복제하고 고유한 이름을 지정하십시오.

번들 메쉬 토큰을 사용하지 않는다면, 다음 기준을 충족시키는 한 Model 또는 BasePart이(가) 작동합니다.

  • 개체에 ScavengerHuntPart(이)라는 CollectionService 태그가 있습니다. 원하는 경우, configureServer 호출에서 tokenTag에 다른 값을 설정하여 모듈이 활용하는 태그 이름을 변경할 수 있습니다.
  • 개체에는 토큰이 수집될 때 표시되는 '플레이버 텍스트'로 자식 StringValue 인스턴스가 포함되어 있습니다.

BasePart

Model

지역 사용

지역은 플레이어가 입장하면 '수집됨'으로 표시되는 넓은 지역이라는 점이 토큰과 약간 다릅니다. 또한 플레이어가 지역을 떠나면 플레이버 텍스트 모달이 자동으로 닫히고 지역 자체가 작업 공간에서 제거됩니다.

  1. 지역 주위에 블록이나 구체 등의 고정된 파트를 생성합니다. 모듈은 런타임에 CanCollide 속성을 자동으로 비활성화하여 플레이어가 지역과 물리적으로 충돌하지 않도록 합니다.

  2. 고유한 이름을 지정합니다. 이러한 이름은 모듈이 각 플레이어가 입력한 지역을 추적하는 방법입니다.

  3. ScavengerHuntPart 파트에 CollectionService 태그를 지정합니다. 원하는 경우, configureServer 호출에서 tokenTag에 다른 값을 설정하여 모듈이 활용하는 태그 이름을 변경할 수 있습니다.

  4. 지역을 입력할 때 표시할 '플레이버 텍스트'로 설정된 자식 StringValue 인스턴스를 포함시킵니다.

구성

이러한 모듈은 대부분의 사용 사례에서 작동하도록 미리 구성되어 있지만, 쉽게 사용자 지정할 수 있습니다. 예를 들어, 토큰 회전 속도를 변경하고 모달 정보 메시지를 사용자 지정하려면 다음을 수행하십시오.

  1. StarterPlayerScripts에서 새 LocalScript을(를) 생성하고 ConfigureScavengerHunt로 이름을 바꿉니다.

  2. 새로운 스크립트에 다음의 코드를 붙여 넣습니다.

    LocalScript - ConfigureScavengerHunt

    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,
    })

수집물 이벤트

플레이어가 토큰을 수집하거나 지역에 들어갈 때마다 수집됨 이벤트가 발동됩니다. 서버 측 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를 결정하려면, hideOtherGuisshowOtherGuis 콜백을 포함시켜 고유한 사용자 지정 논리로 대응하십시오.

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
completeModalTextScavenger 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.colorColorSequence 세그먼트 전체에서 빔의 색상을 정의합니다. 자세한 내용은 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.textureLengthnavigationBeam.textureMode의 설정에 따른 빔 텍스처의 길이. 자세한 내용은 Beam.TextureLength을(를) 참조하십시오.1
navigationBeam.textureMode빔 텍스처의 크기가 조정되고 반복되는 방식(Enum.TextureMode).Wrap
navigationBeam.textureSpeed텍스처 이미지가 빔을 따라 이동하는 속도.1
navigationBeam.transparencyNumberSequence 세그먼트 전체에서 빔의 투명도를 정의함. 자세한 내용은 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에서만 호출할 수 있습니다.

설명기본
tokenTagScavenger Hunt에 사용된 모든 토큰 또는 지역을 찾기 위해 CollectionService이(가) 사용하는 태그."ScavengerHuntPart"
datastoreNameScavenger 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: numberplayer(으)로 표시된 사용자가 수집한 총 토큰 수.
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 가시성을 참조하십시오.