تمثل رؤية المستخدم للعالم من خلال كائن Camera. يمكنك تغيير سلوك الكاميرا لتناسب تجربتك بطرق متنوعة. على سبيل المثال، يمكن أن تتفاعل الكاميرا مع الأحداث في العالم، مثل الاهتزاز عندما يمر وحش بجوارك، أو تتقيد بجانب شخصية المستخدم، كما هو الحال في الألعاب الجانبية.
إنشاء كاميرا من منظور الشخص الأول
كاميرا من منظور الشخص الأول هي عرض حيث تبقى الكاميرا مقيدة برأس الشخصية، وهو ما يتماشى بشكل أكبر مع الحياة الواقعية. وهو أمر شائع في تجارب إطلاق النار والقصص حيث الهدف هو جعل المستخدم يشعر بالانغماس في العالم.


في الاستوديو، يحتوي كائن StarterPlayer على عدد من الخصائص التي تؤثر على كاميرا المستخدم. تحدد خاصية CameraMode كيفية تصرف الكاميرا.
اختر StarterPlayer.

قم بتغيير CameraMode إلى LockFirstPerson. يضمن هذا عدم تحرك كاميرا المستخدم بعيدًا عن رأسه.

قم باختبار اللعب لرؤية كاميرا الشخص الأول قيد العمل.
إنشاء كاميرا جانبية
تحافظ الرؤية الجانبية على الكاميرا في وضع ثابت بالنسبة لجانب الشخصية، مما يمنح العالم إحساسًا ثنائي الأبعاد.

برمجة الكاميرا
قم بتوسيع StarterPlayer، وفي StarterPlayerScripts أضف LocalScript باسم CameraManager.

في بداية البرنامج النصي، انسخ والصق عينة الشفرة التالية للحصول على خدمة اللاعبين، ثم في متغير جديد احصل على المستخدم المحلي.
local Players = game:GetService("Players")local player = Players.LocalPlayerأنشئ دالة تُدعى updateCamera. تحتوي على المنطق اللازم للحصول على وتعيين موقع جديد للكاميرا.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endداخل الدالة، احصل على نموذج شخصية المستخدم وتحقق مما إذا كان موجودًا باستخدام عبارة if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
توجيه الكاميرا
تحتوي جميع نماذج الشخصيات على جزء يسمى HumanoidRootPart، والذي يمكن استخدامه للحصول على موضع الشخصية في العالم. يقوم بتعيين موضع الكاميرا الذي تشير إليه.
استخدم FindFirstChild للحصول على HumanoidRootPart وتحقق من وجوده باستخدام عبارة if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendموضع HumanoidRootPart هو في الواقع 2 وحدات أسفل رأس المستخدم. لإصلاح ذلك، أضف Vector3 جديدًا بارتفاع 2 وحدات إلى موضع الجذر.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal HEIGHT_OFFSET = 2local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)endendend
تعيين موضع الكاميرا
تحتاج الكاميرا أيضًا إلى موضع. لمنح رؤية المستخدم مظهرًا ثنائي الأبعاد، تحتاج الكاميرا إلى النظر مباشرة إلى جانب الشخصية. قم بوضع الكاميرا بجانب المستخدم عن طريق إضافة عمق إلى فقط المحور Z من موضع الكاميرا باستخدام Vector3.
local player = Players.LocalPlayer
local CAMERA_DEPTH = 24
local HEIGHT_OFFSET = 2
local function updateCamera()
local character = player.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root then
local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
end
end
endتحديث CurrentCamera
الآن بعد أن أصبحت المتغيرات لموضع الكاميرا والهدف الخاص بها جاهزة، حان الوقت لتحديث موضع الكاميرا. يمكنك الوصول إلى كاميرا المستخدم من خلال خاصية CurrentCamera في Workspace. تحتوي الكاميرا على خاصية CFrame لتحديد موضعها.
يمكنك استخدام CFrame.lookAt() لتحديث الكاميرا. تأخذ موضعين وتقوم بإنشاء CFrame يقع في الموضع الأول مشيرًا إلى الثاني. استخدم CFrame.lookAt() لإنشاء CFrame يقع في cameraPosition وموجه نحو rootPosition.
local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
local CAMERA_DEPTH = 24
local HEIGHT_OFFSET = 2
local function updateCamera()
local character = player.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root then
local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)
end
end
endمزامنة الكاميرا
الخطوة الأخيرة هي تشغيل هذه الدالة بشكل متكرر للحفاظ على مزامنة الكاميرا مع المستخدم. الصورة التي يراها المستخدم تتجدد باستمرار. تُسمى اللحظة التي تستغرقها جميع الحسابات اللازمة خطوة العرض.
يسهل RunService:BindToRenderStep() تنفيذ دالة في كل إطار من خلال قبول هذه المعلمات الثلاثة:
- name - اسم هذا الربط، والذي يجب أن يكون فريدًا حتى لا يتعارض مع دوال أخرى بنفس الاسم.
- priority - كلما زاد الرقم، زادت الأولوية. يجب أن تعمل هذه الدالة بعد تحديث الكاميرا الافتراضية لروبلكس، لذا يتم تعيين الأولوية إلى مستوى أعلى بمقدار 1 من RenderPriority للكاميرا الداخلية.
- function - الدالة التي سيتم ربطها بخطوة العرض.
استخدم RunService:BindToRenderStep() لربط دالة updateCamera بخطوة العرض.
local Players = game:GetService("Players")local RunService = game:GetService("RunService")local player = Players.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 24local HEIGHT_OFFSET = 2local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)endendendRunService:BindToRenderStep("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)اختبر رمزك. استخدم مفاتيح A وD لتحريك الشخصية من جانب إلى جانب.
إنشاء كاميرا إيزومترية
يمكن تعديل الهيكل الأساسي للحصول على موضع المستخدم وتحديث موضع الكاميرا في كل إطار ليتناسب مع العديد من أنماط الكاميرات الأخرى، مثل الكاميرا الإيزومترية. الكاميرا الإيزومترية هي عرض ثلاثي الأبعاد موجه قليلاً لأسفل بزاوية ثابتة تجاه شخصية المستخدم.

تعديل الموضع والرؤية
باستخدام الشفرة من المثال السابق، عدل cameraPosition لإضافة نفس المقدار إلى جميع الأبعاد الثلاثة.
local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)local cameraPosition = rootPosition + Vector3.new(CAMERA_DEPTH, CAMERA_DEPTH, CAMERA_DEPTH)camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)endendendRunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)تغيير خاصية FieldOfView للكاميرا يحاكي التكبير والتصغير، مما يمكن أن يعطي العرض مظهرًا أكثر تسطحًا. جرب تعيينه لقيمة 20 للتقريب وزيادة مسافة الكاميرا من المستخدم لتعويض ذلك.
local Players = game:GetService("Players")local RunService = game:GetService("RunService")local player = Players.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local function updateCamera()
من خلال تغيير سلوك الكاميرا، يمكنك تحقيق مظهر جديد تمامًا لتجربتك. تحقق مما إذا كنت تستطيع تغيير cameraPosition لتحقيق كاميرا من الأعلى باستخدام نفس البرنامج النصي. جرب تعديل الإعدادات للحصول على نتيجة تعجبك!