プレイヤーは、自分がいる空間の構築に参加しているように感じることを楽しむことがよくあります。SurfaceArt 開発者モジュールは、プレイヤーが体験の中で文字通り自分の痕跡を残すことを可能にします。
モジュールの使用法
インストール
体験でSurfaceArtモジュールを使用するには:
スタジオのウィンドウメニューまたはホームタブツールバーから、ツールボックスを開き、クリエイターストアタブを選択します。

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

パッケージタイルを見つけてクリックします。
サーフェスアートモジュールを見つけてクリックするか、3Dビューにドラッグ&ドロップします。

エクスプローラーウィンドウで、SurfaceArtモデル全体をReplicatedStorageに移動します。体験を実行すると、モジュールが動作を開始します。
キャンバスの配置
モジュールには、3D世界に配置できる1つのSurfaceCanvasモデルが付属しています。このモデルは、プレイヤーがその表面にアートを設置するためにインタラクトする対象です。
モジュールのメインフォルダー内のWorkspaceフォルダーにあるSurfaceCanvasメッシュを見つけます。

トップレベルのWorkspace階層に移動し、希望の位置に配置します。

テストセッションを公開/実行すると、プレイヤーはProximityPromptを介してオブジェクトとインタラクトし、定義された表面にアートを設置できるようになります。

キャンバスの面の変更
モジュールの内部では、アートアイテムを表示するためにSurfaceGuiを使用しています。アートが表示される面を構成するには:
SurfaceCanvasメッシュを選択します。
プロパティウィンドウの下部で、デフォルト値が右のSurfaceCanvasFace属性を見つけます。

属性をクリックし、Enum.NormalIdを表す6つの値のいずれかを入力します。
| 属性値 | 対応するノーマルID |
|---|---|
| 前面 | Enum.NormalId.Front |
| 背面 | Enum.NormalId.Back |
| 右 | Enum.NormalId.Right |
| 左 | Enum.NormalId.Left |
| 上 | Enum.NormalId.Top |
| 下 | Enum.NormalId.Bottom |
カスタムアートアセットの使用
体験のテーマによりよくフィットさせるために、デフォルトの代わりに独自のカスタムアセットのセットを使用することができます。これは、ServerScriptServiceのScriptから呼び出されるconfigure関数を介って行うことができます。
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "カスタムアセット1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "カスタムアセット2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
すべてのキャンバスをクリアする
世界のすべてのキャンバスから既存のアートを削除するには、ScriptからremoveAllArt関数を呼び出します。
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
カスタムエフェクトの表示
アートワークが設置されたときに追加の視覚効果を含めたい場合があるかもしれません。このモジュールは、クライアントにartChangedというイベントを公開しており、これに接続して独自のロジックを追加できます。
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local function createParticleEmitter(canvas, position)
local attachment = Instance.new("Attachment")
attachment.Position = canvas.CFrame:PointToObjectSpace(position)
attachment.Axis = Vector3.new(0, 0, 1)
attachment.SecondaryAxis = Vector3.new(1, 0, 0)
attachment.Parent = canvas
local particleEmitter = Instance.new("ParticleEmitter")
particleEmitter.Speed = NumberRange.new(50)
particleEmitter.Rate = 50
particleEmitter.Color = ColorSequence.new(Color3.fromRGB(128, 254, 7))
particleEmitter.SpreadAngle = Vector2.new(35, 35)
particleEmitter.Parent = attachment
return attachment
end
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
if artId then
-- 3秒間スパークルを表示
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
APIリファレンス
タイプ
SurfaceArtAsset
キャンバス用のアートとして使用される画像は、2つの値を持つテーブルで表されます。
| キー | 説明 |
|---|---|
| name | メタデータ表示名。 |
| assetId | 含める画像のアセットID。 |
関数
configure
configure(config: table)
以下のキー/値を使用してデフォルトの設定オプションを上書きします。この関数は、Scriptからのみ呼び出すことができます。
| キー | 説明 | デフォルト |
|---|---|---|
| enabled | モジュールの機能をオンまたはオフにします。 | true |
| assets | SurfaceArtAssetタイプのリスト。 | (下のコードを参照) |
| quotaPerPlayer | 各プレイヤーが設置できるアート作品の最大数。 | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
SurfaceCanvasタグが付けられたすべてのキャンバスを返します。
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
プレイヤーの代理でプログラム的にアート作品を設置します。canvasオブジェクトは、サーバーが初期化される際にSurfaceCanvasタグが付けられている必要があります。これは、getCanvasesから返されるキャンバスに対してのみ使用することをお勧めします。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- デフォルトアート資産からBloxy Awardを最初のキャンバスに設置します
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
すべての表面からすべてのアートワークを削除します。
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
イベント
artChanged
キャンバスの特定の位置でアートワークが変更されるときに発火します。アートワークが削除されるとartIdはnilになります。カスタムエフェクトをアートワークが設置された正確な位置に配置できるようにするために、イベントハンドラーにVector3値が3番目のパラメータとして渡されることに注意してください。このイベントはLocalScriptでのみ接続できます。
| パラメータ | |
|---|---|
| canvas: BasePart | アートワークが変更されたキャンバス。 |
| spot: Frame | アートワークImageLabelを含む内部Frame。 |
| spotPosition: Vector3 | アートワークが設置された正確な位置。 |
| artId: string | 新しいアートワークのアセットID。 |
| ownerUserId: number | アートを設置したプレイヤーのUserId。 |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("アートが配置された位置:", spotPosition)
print("アートアセットID:", artId)
print("アートを配置したのは:", ownerId)
end)
promptShown
キャンバスインタラクションプロンプトがプレイヤーに表示されたときに発火します。接続された関数は、プロンプトが表示されているキャンバスを受け取ります。このイベントはLocalScriptでのみ接続できます。
| パラメータ | |
|---|---|
| canvas: BasePart | プロンプトが表示されているキャンバス。 |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.promptShown:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)
promptHidden
キャンバスインタラクションプロンプトが隠されると発火します。接続された関数は、プロンプトが表示されていたキャンバスを受け取ります。このイベントはLocalScriptでのみ接続できます。
| パラメータ | |
|---|---|
| canvas: BasePart | プロンプトが表示されていたキャンバス。 |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.promptClosed:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)
selectorShown
サーフェスアートセレクターUIがプレイヤーに表示されると発火します。このイベントはLocalScriptでのみ接続できます。
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "サーフェスアートセレクターを開きました")
end)
selectorHidden
サーフェスアートセレクターUIがプレイヤーに隠されると発火します。このイベントはLocalScriptでのみ接続できます。
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "サーフェスアートセレクターを閉じました")
end)