يستمتع اللاعبون غالبًا بالشعور بأنهم جزء من بناء المكان الذي يتواجدون فيه. يتيح لك نموذج SurfaceArt نموذج المطور ترك علامتك حرفيًا في تجربة ما.
استخدام النموذج
التثبيت
لاستخدام نموذج SurfaceArt في تجربة ما:
من قائمة نافذة في الاستوديو أو من شريط أدوات علامة الرئيسية، افتح صندوق الأدوات وحدد علامة متجر المبدعين.

تأكد من تحديد فرز النماذج، ثم انقر على زر عرض الكل لعلامات الفئات.

حدد موقع وانقر على بلاطة الحزم.
حدد موقع نموذج فن السطح وانقر عليه، أو اسحب وأفلت إلى عرض 3D.

في نافذة المستعرض، انقل النموذج بالكامل SurfaceArt إلى ReplicatedStorage. عند تشغيل التجربة، سيبدأ النموذج في العمل.
وضع القماش
يأتي النموذج مع نموذج SurfaceCanvas واحد يمكنك وضعه في العالم ثلاثي الأبعاد. هذا النموذج هو ما سيتفاعل معه اللاعبون لوضع الفن على سطحه.
حدد موقع شبكة SurfaceCanvas داخل مجلد Workspace الخاص بالمجلد الرئيسي للنموذج.

قم بنقله إلى هيكل Workspace الأعلى وضعه في المكان المرغوب.

عند نشر/تشغيل جلسة اختبار، سيتمكن اللاعبون من التفاعل مع الكائن عبر ProximityPrompt ووضع الفن على السطح المحدد.

تغيير وجه القماش
في الخلفية، يستخدم النموذج SurfaceGui لعرض عناصر الفن. لتكوين أي سطح يظهر الفن عليه:
حدد شبكة SurfaceCanvas.
في الجزء السفلي من نافذة الخصائص، حدد سمة SurfaceCanvasFace مع قيمة افتراضية Right.

انقر على السمة وأدخل واحدة من ست قيم تصف Enum.NormalId.
| قيمة السمة | معرف عادي مطابق |
|---|---|
| أمام | Enum.NormalId.Front |
| خلف | Enum.NormalId.Back |
| يمين | Enum.NormalId.Right |
| يسار | Enum.NormalId.Left |
| أعلى | Enum.NormalId.Top |
| أسفل | Enum.NormalId.Bottom |
استخدام أصول الفن المخصصة
لتناسب موضوع تجربتك بشكل أفضل، يمكنك استخدام مجموعتك الخاصة من الأصول المخصصة بدلاً من الافتراضات. يمكن القيام بذلك عبر وظيفة تكوين، التي يتم استدعاؤها من Script في ServerScriptService.
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,})
مسح جميع القماشات
لإزالة كل الفن الحالي من جميع القماشات في العالم، قم باستدعاء وظيفة removeAllArt من Script.
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)
مرجع واجهة برمجة التطبيقات
الأنواع
SurfaceArtAsset
تُستخدم الصور كفن للقماشة من خلال جدول يحتوي على قيمتين.
| المفتاح | الوصف |
|---|---|
| name | اسم العرض الوصفي للبيانات الوصفية. |
| assetId | معرف الأصول للصورة المراد تضمينها. |
الدوال
configure
configure(config: table)
تقوم بتجاوز خيارات التكوين الافتراضية من خلال المفاتيح/القيم التالية في جدول config. لا يمكن استدعاء هذه الوظيفة إلا من 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 من الأصول الفنية الافتراضية في أول قماشة
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 كمعامل ثالث إلى معالج الحدث حتى تتمكن من وضع تأثير مخصص في الموقع الدقيق حيث تم وضع العمل الفني. يمكن توصيل هذا الحدث فقط في LocalScript.
| المعلمات | |
|---|---|
| canvas: BasePart | القماش الذي تم تغيير العمل الفني عليه. |
| spot: Frame | الإطار الداخلي Frame الذي يحتوي على ImageLabel للعمل الفني. |
| spotPosition: Vector3 | الموقع الدقيق حيث تم وضع العمل الفني. |
| artId: string | معرف الأصول للعمل الفني الجديد. |
| 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("معرف أصول الفن:", 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
ينطلق عندما يتم عرض واجهة مستخدم محدد فن السطح للاعب. يمكن توصيل هذا الحدث فقط في 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
ينطلق عندما يتم إخفاء واجهة مستخدم محدد فن السطح للاعب. يمكن توصيل هذا الحدث فقط في 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)