ゲーム内アセット作成機能を使用すると、ユーザーがゲーム内で作成した作品をインベントリに保存できるようになります。ユーザーはこれらのゲーム内作品を他のアセットと同様に使用できます。さらに、これらの作品はRobloxプラットフォーム上で表示される際にあなたのゲームに帰属するため、どのユーザーでも帰属リンクを使用してあなたのゲームにアクセスし、自分自身の作品を作成できます。
例えば、ユーザーがゲーム内でペットとしてカスタムクリーチャーを作成し、お気に入りのペットをインベントリに保存できるようにすることができます。ユーザーがどのオブジェクトを変更し、ゲームから保存できるかを指定する完全なコントロールがあります。ユーザーは自分のプロフィールに作品を表示し、あなたのゲームに帰属させることで、ゲームの可視性を高めることができます。
サポートされているアセットタイプと制限
プラットフォーム上のすべてのアセットと同様に、ゲーム内作品はアセットのモデレーションの対象となります。現在、ユーザーが作成できるゲーム内コンテンツのタイプは以下の通りです:
ゲームを実行またはテストしているときに保存アクションが失敗した場合、Studioは出力ウィンドウまたは開発者コンソールにエラーメッセージを表示します。
ゲーム内プラットフォームコンテンツ作成の有効化
ユーザーのゲーム内作成を有効にするには、サーバーサイドスクリプト内で AssetService:PromptCreatePlatformContentAsync() APIメソッドを使用し、他の作成ロジックと組み合わせます。ゲーム内でこの機能を有効にしたいオブジェクトを指定し、メソッドを呼び出すためのカスタムトリガー(UIアイコンなど)を設定し、アセットを保存するためのクライアントリモートイベントをリッスンします。
AssetService:PromptCreatePlatformContentAsync() は以下のパラメータを取ります:
- 作成を提出するユーザーを表す Player オブジェクト。
- 作成のためのコンテンツを表す Object(例えば、EditableImage)。
- 現在は画像用の Enum.AssetType(Enum.AssetType.Image のみ)。
サーバーが AssetService:PromptCreatePlatformContentAsync() を呼び出すと、クライアントに 提出 ダイアログが表示され、保存アクションをトリガーしたユーザーがアセットの名前と説明を入力できます。Robloxは、保存ワークフローがプラットフォームレベルの機能であるため、ダイアログUIを標準で提供します。
このメソッドを使用する前に、以下を確認してください:
- AssetService:PromptCreatePlatformContentAsync() を呼び出すスクリプトはサーバー上で実行されます。
- あなたのプレースは公開されています。未公開のプレースでStudio内でプロンプトをテストすると失敗します。
- メッシュ/画像APIを許可 があなたの体験のためにオンになっています。
EditableImageから画像を作成する
ユーザーがランタイムで生成した画像を公開できるようにすることもできます。以下の例は、サーバーサイドスクリプトが EditableImage にシンプルなロゴをプロシージャルに描画し、プレイヤーがゲームに参加したときにそれを画像アセットとして公開するように促します:
local AssetService = game:GetService("AssetService")
local Players = game:GetService("Players")
local BLUE = Color3.fromRGB(49, 86, 255)
local WHITE = Color3.new(1, 1, 1)
local SIZE = 400
local OUTER_SIZE = 200
local INNER_SIZE = 56
local ANGLE = 15 -- 度、時計回り
local function generateLogo()
-- 回転していないロゴ:中央に青い四角のある白い四角。
local logo = AssetService:CreateEditableImage({
Size = Vector2.new(OUTER_SIZE, OUTER_SIZE),
})
-- 最終キャンバス:ソリッドブルー。
local canvas = AssetService:CreateEditableImage({
Size = Vector2.new(SIZE, SIZE),
})
if not logo or not canvas then
warn("EditableImageを作成できませんでした。Editable Mesh / Image APIへのアクセスが有効になっていることを確認してください。")
return nil
end
logo:DrawRectangle(
Vector2.zero,
Vector2.new(OUTER_SIZE, OUTER_SIZE),
WHITE, 0, Enum.ImageCombineType.Overwrite
)
logo:DrawRectangle(
Vector2.new((OUTER_SIZE - INNER_SIZE) / 2, (OUTER_SIZE - INNER_SIZE) / 2),
Vector2.new(INNER_SIZE, INNER_SIZE),
BLUE, 0, Enum.ImageCombineType.Overwrite
)
canvas:DrawRectangle(
Vector2.zero,
Vector2.new(SIZE, SIZE),
BLUE, 0, Enum.ImageCombineType.Overwrite
)
-- ロゴをキャンバスに投影し、その中心を回転させます。
canvas:DrawImageTransformed(
Vector2.new(SIZE / 2, SIZE / 2),
Vector2.one,
ANGLE,
logo,
{
CombineType = Enum.ImageCombineType.BlendSourceOver,
ResamplerMode = Enum.ResamplerMode.Default, -- エッジを滑らかに
}
)
logo:Destroy()
return canvas
end
Players.PlayerAdded:Connect(function(player)
-- Promptメソッドが機能するためにはCoreGuiがロードされている必要があります。
player.CharacterAdded:Wait()
local logo = generateLogo()
if not logo then
return
end
local complete, result, assetId = pcall(function()
return AssetService:PromptCreatePlatformContentAsync(player, logo, Enum.AssetType.Image)
end)
if complete then
if result == Enum.PromptCreateAssetResult.Success then
print("正常にアップロードされました, AssetId:", assetId)
else
print("結果を受け取りました", result)
end
else
print("エラー")
print(result)
end
end)体験内作成デモアリーナ は、この機能をどのように使用できるかの例を示しています。デモに参加して、ユーザーとしてゲーム内作成ワークフローを体験するか、Studioでプレースを編集してデザインを参照できます。
作成後と帰属
ユーザーがあなたのゲームからアセットを作成して保存した後、以下の場所でそれを見つけることができます:
ユーザーが友達のプロフィールやインベントリでゲーム内作品を見ると、アセットが作成された元のゲームへの帰属が表示されます。ユーザーは帰属リンクをクリックしてゲームページにリダイレクトされ、ゲームに参加して自分自身の作品を作成できます。