宝さがし(スカベンジャーハント)

ScavengerHunt開発者モジュールは、プレイヤーがあなたのバーチャル空間を探索するための本質的にゲーミフィケーションされた方法を提供し、プレース全体を有機的に紹介できるようにします。 プレイヤーの進行状況は永続的であるため、Scavenger Hunts はセッション間で継続できます。

モジュールの使用法

インストール

バーチャル空間でScavengerHuntモジュールを使用する方法

  1. 表示タブから、ツールボックスを開き、マーケットプレイスタブを選択します。

    Studioのツールボックストグルボタン
  2. モデルのソートが選択されていることを確認し、カテゴリすべてのボタンを表示をクリックします。

  3. DEV モジュールタイルを見つけてクリックします。

  4. Scavenger Huntモジュールを見つけてクリックするか、3D ビューにドラッグアンドドロップします。

  5. エクスプローラウィンドウで、ScavengerHuntモデル全体をServerScriptServiceに移動します。 バーチャル空間を実行すると、モジュールはそれ自体をさまざまなサービスに配布し、実行を開始します。

トークンの使用

Scavenger hunt モジュールは、プレイヤーが検索して収集するアイテムとしてトークンを使用します。 モジュールには、3D ワールドに配置できるトークンモデルが 1 つ付属しています。

  1. モジュールのメインフォルダのワークスペースフォルダにToken1メッシュを見つけます。

  2. Token1を最上位レベルのワークスペース階層に移動し、必要な場所に配置します。

  3. トークンにユニークな名前を付けます。 どのトークンをプレイヤーが収集したかをこの名前で追跡します。

  4. トークンを追加するには、既存のトークンを複製し、ユニークな名前を付けます。

付属のメッシュトークンを使用したくない場合は、以下の基準を満たす限り、ModelまたはBasePartは動作します。

  • オブジェクトにはScavengerHuntPartCollectionServiceタグが付いています。 必要に応じて、モジュールが使用する CollectionService は、configureServerコールのtokenTagに別の値を設定することで変更できます。
  • オブジェクトには、トークンが収集されたときに表示する「フレーバーテキスト」に設定された子StringValueインスタンスが含まれています。

BasePart

モデル

領域の使用

領域は、トークンとは少し異なり、プレイヤーが入ると、「収集済」としてマークされる大きな領域です。 さらに、プレイヤーが領域を離れると、フレーバーテキストモーダルが自動的に削除され、領域自体がワークスペースから削除されます。

  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を受け取ります。 この関数は、プレイヤー 1 人につき 1 回のみ発生し、そのプレイヤーにバッジ、新しいエリアへのアクセス、バーチャル空間内通貨などを与えるために使用できます。

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 要素を表示することを選択できます。

useCustomModalsconfigureClient関数trueに設定されている場合、showInfoModalイベントは、プレイヤーがトークントラッカーをアクティブ化するたびに発生します。 同様に、showCompleteModalイベントは、プレイヤーが Scavenger Hunt のすべてのものを収集すると発生します。 これら両方のイベントを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 は、情報モーダルまたは補完モーダルが表示されるときに、すべてのScreenGuisCoreGuis(プレイヤーリストを除く)を非表示にします。 この自動非表示動作を上書きし、どの 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

configure(config:table):nil

デフォルトのクライアント側の設定オプションを、テーconfigブル内にある以下のキー/値を使用して上書きします。 この関数は、LocalScriptからのみ呼び出すことができます。

Script Editor

キー概要デフォルト
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
useCustomModalstrueの場合、デフォルトモーダルは表示されません。 これにより、カスタムGUIに概説されているカスタムモーダルを表示できます。false
useCustomTokenTrackertrueの場合、デフォルトトークントラッカーは表示されません。 これにより、代わりにカスタムトークントラッカーGUIを表示できます。false

ナビゲーションビーム

キー概要デフォルト
showNavigationBeamtrueの場合、プレイヤーから最も近いトークンBeamが表示されます。true
navigationBeam.colorColorSequenceセグメントにわたるビームの色を定義します。 詳細については、Beam.Colorを参照してください。[255, 255, 255] → [255, 255, 255]
navigationBeam.curveSize0ビームのベジェ曲線内の最初の制御点の位置です。 詳細については、Beam.CurveSize0を参照してください。0
navigationBeam.curveSize1ビームのベジェ曲線内の2番目の制御点の位置です。 詳細については、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.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からのみ呼び出すことができます。

キー概要デフォルト
tokenTagScavenger Huntで使用されるすべてのトークンまたは領域を見つけるために、CollectionServiceによって使用されるタグ。"ScavengerHuntPart"
datastoreNameScavenger Huntが各プレイヤーのコレクションの進行状況を保存するために使用するDataStoreの名前。"ScavengerHuntTokens"
resetOnPlayerRemovingtrueの場合、バーチャル空間を離れるときにユーザーの進行状況をリセットします。 宝さがしのテスト中に進行状況を保存しない場合に便利です。false
Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.configureServer({
tokenTag = "GreenGem",
})

無効

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トークンに衝突した、または領域に入ったユーザー。
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すべてトークンを収集した、またはすべての領域に入ったプレイヤー。
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 設定オプションが true に設定されているときに、プレイヤーがトークントラッカーをクリックしたときに発生します。 このイベントは、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)

このコールバックは、モーダルが削除された直後に実行され、全体のScreenGuisまたはそれの内の要素を有効化できます。 詳細とサンプルコードについてはGUI の可視性をご覧ください。