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


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

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

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

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

في أعلى البرنامج النصي، انسخ والصق عينة الكود التالية للحصول على خدمة Players، ثم في متغير جديد احصل على المستخدم المحلي.
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 لتحقيق كاميرا من الأعلى باستخدام نفس البرنامج النصي. جرب تعديل الإعدادات للحصول على نتيجة تعجبك!