بالتأكيد، يمكنني مساعدتك في إنشاء سكربت لشخصية غير لاعب (NPC) تتبع اللاعب وتحقق من شروط معينة.
هذا السكربت يقوم بالتالي:
safezone.ستحتاج إلى دمج دالة updateNPC في حلقة التحديث الرئيسية للعبتك، وتزويدها باستمرار بالمواقع المحدثة للاعب والـ NPC. يمكنك تعديل قيم FOLLOW_DISTANCE و CLOSE_KILL_DISTANCE و npc.speed لتناسب لعبتك._
حسنًا، سأقوم بتعديل السكربت وإضافة واجهة المستخدم (GUI) لتأثير الـ "jumpscare" مع التأثيرات البصرية التي وصفتها.
سنحتاج إلى ملف HTML لإنشاء الواجهة وملف CSS لتنسيقها وتحريكها، بالإضافة إلى تحديث ملف JavaScript.
شرح التغييرات:
HTML (index.html):
div بـ id jumpscare-overlay لعمل تأثير الوميض على الشاشة بأكملها.div بـ id jumpscare-gui ليحتوي على صورة الـ jumpscare (jumpscare-image). تأكد من تغيير src للصورة التي تريدها.span في قسم المعلومات لتحديث حالة اللاعب والمسافات ديناميكيًا.style.css وملف game_simulation.js (اختياري للمحاكاة).CSS (style.css):
jumpscare-overlay, jumpscare-gui, jumpscare-image).position: fixed لتغطية الشاشة بأكملها و z-index عالي لتكون فوق كل شيء.opacity: 0 و transform: scale(0.1) لإخفاء وتصغير الـ jumpscare في البداية..hidden لإخفاء العناصر.@keyframes screenFlash لعمل وميض سريع بين الأسود والأبيض.@keyframes zoomIn لتحريك الصورة من المنتصف وتكبيرها..flash-active و .jumpscare-active لتطبيق هذه الأنيميشن عند الحاجة.JavaScript (npc_script.js):
isJumpscareActive لمنع تكرار الـ jumpscare.JUMPSCARE_DURATION.triggerJumpscare(playerObj):
hidden وتضيف كلاسات الأنيميشن (jumpscare-active, flash-active).setTimeout لانتظار انتهاء مدة الـ jumpscare ثم تستدعي killPlayer وتوقف الوميض.updateNPC(...):
isJumpscareActive صحيحًا.distToTarget (المسافة إلى النقطة المستهدفة خلف اللاعب).!playerInSafezone && (distToPlayer < CLOSE_KILL_DISTANCE || distToTarget < TARGET_REACH_THRESHOLD). هذا يعني أن الـ jumpscare (والقتل) يحدث إذا كان اللاعب خارج المنطقة الآمنة و إما أن الـ NPC قريب جدًا من اللاعب أو أن الـ NPC وصل تقريبًا إلى نقطة التتبع خلف اللاعب.triggerJumpscare(playerObj) بدلاً من killPlayer مباشرة.killPlayer(...): لم تتغير وظيفته الأساسية، لكنه الآن يُستدعى من triggerJumpscare.resetGame(): دالة إضافية لإعادة تعيين حالة اللعبة والـ jumpscare (مفيدة للاختبار).updateNPC و updatePlayerPosition.JavaScript (game_simulation.js):
setInterval).game-area.updatePlayerPosition و updateNPC في كل دورة.resetGame.الآن، عندما يتحقق شرط الاقتراب أو الوصول للهدف خارج المنطقة الآمنة، ستظهر شاشة الوميض وصورة الـ jumpscare التي تكبر بسرعة قبل أن يتم قتل اللاعب.*
تمام، فهمت. أنت تريد هذا السلوك في لعبة Roblox باستخدام لغة Lua، وليس كصفحة ويب.
سنحتاج إلى تقسيم الكود إلى جزأين رئيسيين:
ServerScriptService أو يكون ملحقًا بنموذج الـ NPC. هذا السكربت سيتحكم في حركة الـ NPC، يتحقق من الشروط (المسافة، المنطقة الآمنة)، ويقرر متى يتم تشغيل الـ jumpscare وقتل اللاعب.StarterPlayer > StarterPlayerScripts أو StarterGui. هذا السكربت سيستمع لحدث من الخادم ليعرض واجهة الـ jumpscare (GUI) مع التأثيرات البصرية المطلوبة على شاشة اللاعب.الخطوات:
إنشاء العناصر في Roblox Studio:
Humanoid و HumanoidRootPart (أو جزء آخر معين كـ PrimaryPart).Part في Workspace ليمثل المنطقة الآمنة. سمّه "SafeZone" (أو أي اسم تختاره، لكن تأكد من مطابقته في السكربت). اجعله شفافًا (Transparency = 1) وغير قابل للاصطدام (CanCollide = false) إذا أردت.ReplicatedStorage، أنشئ RemoteEvent وسمّه "TriggerJumpscareEvent".StarterGui، أنشئ ScreenGui وسمّه "JumpscareGui". داخل هذا الـ Gui:
Frame وسمّه "FlashOverlay". اجعل حجمه UDim2.new(1, 0, 1, 0) ليغطي الشاشة بالكامل. اضبط BackgroundColor3 على الأسود (0, 0, 0) و BackgroundTransparency على 1 (شفاف تمامًا في البداية). اضبط ZIndex على قيمة عالية (مثل 10).ImageLabel وسمّه "JumpscareImage". اضبط AnchorPoint على Vector2.new(0.5, 0.5) و Position على UDim2.new(0.5, 0, 0.5, 0) ليكون في المنتصف. اضبط Size على قيمة صغيرة جدًا في البداية (مثل UDim2.new(0, 50, 0, 50)). اضبط BackgroundTransparency على 1. اضبط ImageTransparency على 1. قم بتعيين Image إلى معرف الصورة (asset ID) الذي تريده للـ jumpscare. اضبط ZIndex على قيمة أعلى من الـ Frame (مثل 11).ScreenGui نفسه غير مفعل (Enabled = false) في البداية.كتابة السكربتات:
شرح الكود:
NPC_AI_Script.server.lua (الخادم):
findNearestPlayerCharacter: تبحث عن أقرب لاعب حي للـ NPC.isPlayerInSafeZone: تستخدم Workspace:GetPartsInPart() للتحقق مما إذا كان أي جزء من جسم اللاعب يلامس منطقة الأمان.npcLogic: الحلقة الرئيسية التي تعمل باستمرار.
targetPosition).Humanoid:MoveTo().CLOSE_KILL_DISTANCE) أو قريب جدًا من نقطة الهدف (TARGET_REACH_THRESHOLD)؟activeJumpscares لمنع إرسال الحدث بشكل متكرر لنفس اللاعب، ثم تطلق JUMPSCARE_EVENT:FireClient(targetPlayer).playerHumanoid.Health = 0).JumpscareHandler.client.lua (العميل):
playJumpscare: الدالة التي تنفذ التأثيرات البصرية.
ScreenGui.Frame والصورة مرئيين.TweenService لتغيير لون FlashOverlay بسرعة بين الأسود والأبيض لعدد محدد من الدورات (FLASH_CYCLES).TweenService لتكبير JumpscareImage من حجم صغير إلى الحجم المستهدف (TARGET_IMAGE_SCALE) خلال فترة ZOOM_DURATION.isJumpscareActive.JUMPSCARE_EVENT.OnClientEvent:Connect(...): تستمع للحدث القادم من الخادم وعند استقباله، تستدعي playJumpscare.ملاحظات هامة:
"NPC_Model" و "SafeZone" بالأسماء الصحيحة للعناصر في لعبتك.Image للـ JumpscareImage في Roblox Studio.isPlayerInSafeZone باستخدام طرق أخرى مثل Region3 أو تتبع اللاعبين الذين يدخلون ويخرجون من المنطقة باستخدام أحداث .Touched و .TouchEnded إذا كان لديك عدد كبير من اللاعبين. الطريقة الحالية (GetPartsInPart) مناسبة لعدد قليل من اللاعبين.else من npcLogic.*_بالتأكيد. يمكنك وضع سكربت الخادم مباشرة داخل نموذج الـ NPC في Workspace. هذا يجعل الـ NPC أكثر استقلالية.
السكربت المحلي (JumpscareHandler.client.lua) سيبقى في StarterPlayer > StarterPlayerScripts لأنه يحتاج للتشغيل على جهاز كل لاعب للتحكم في واجهة المستخدم الخاصة به.
التعديل المطلوب:
في سكربت الخادم، سنقوم بتغيير طريقة الحصول على مرجع نموذج الـ NPC. بدلاً من البحث عنه في Workspace بالاسم، سنستخدم script.Parent للإشارة إلى النموذج الذي يحتوي على السكربت مباشرة.
إليك السكربتات المحدثة مع التعليمات لوضعها في الأماكن الصحيحة:
الخطوات:
NPC_AI_Script.server.lua: داخل نموذج الـ NPC الخاص بك في Workspace (مثلاً Workspace.MyScaryNPC.NPC_AI_Script).JumpscareHandler.client.lua: داخل StarterPlayer > StarterPlayerScripts.MyScaryNPC في المثال) لديه Humanoid و HumanoidRootPart.SafeZone) موجود في Workspace.RemoteEvent باسم TriggerJumpscareEvent موجود في ReplicatedStorage.ScreenGui باسم JumpscareGui موجود في StarterGui ويحتوي على FlashOverlay (Frame) و JumpscareImage (ImageLabel) بالإعدادات المذكورة سابقًا.بهذه الطريقة، كل NPC تضع فيه سكربت NPC_AI_Script.server.lua سيعمل بشكل مستقل ويستخدم نفس الحدث لتشغيل الـ jumpscare على اللاعبين القريبين.
تمام، فهمت الآن. أنت تريد أن يتبع الـ NPC اللاعب، ولكن باستخدام نظام تحديد المسارات (Pathfinding) لتجنب الاصطدام بالعوائق مثل الجدران. هذا يتطلب استخدام PathfindingService في Roblox.
سنقوم بتعديل سكربت الخادم (NPC_AI_Script.server.lua) لاستخدام PathfindingService. السكربت المحلي (JumpscareHandler.client.lua) سيبقى كما هو لأنه مسؤول فقط عن عرض التأثير البصري عند تلقي الحدث.
المتطلبات:
CanCollide لها مفعلة (أو على الأقل ليست CanQuery = false).إليك سكربت الخادم المحدث:
شرح التغييرات الرئيسية في سكربت الخادم:
PathfindingService: تم الحصول على الخدمة.pathComputeParams: تم تعريف جدول يحتوي على معلمات حجم الـ NPC للـ Pathfinding. عدّل AGENT_RADIUS و AGENT_HEIGHT لتناسب حجم الـ NPC الخاص بك.currentPath, currentWaypointIndex, lastTargetPosition, pathBlockedConnection لتتبع حالة المسار الحالي.followPath(targetPosition):
PathfindingService:CreatePath(pathComputeParams) لإنشاء كائن مسار مع الأخذ في الاعتبار حجم الـ NPC.currentPath:ComputeAsync(npcPosition, targetPosition) لحساب المسار بشكل غير متزامن.currentPath.Status للتأكد من نجاح الحساب.GetWaypoints).currentPath.Blocked لاكتشاف ما إذا أصبح المسار غير صالح وتحتاج إلى إعادة الحساب.npcLogic() (الحلقة الرئيسية):
RECALCULATE_DISTANCE_THRESHOLD) منذ آخر حساب. إذا كان الأمر كذلك، تستدعي followPath.currentPath)، تتحقق من المسافة إلى نقطة المسار الحالية (targetWaypoint).WAYPOINT_REACH_THRESHOLD، تنتقل إلى النقطة التالية (currentWaypointIndex + 1) وتحرك الـ NPC إليها.currentPath للسماح بإعادة الحساب في الدورة التالية.distToPlayer) والمنطقة الآمنة، وليس على طول المسار المتبقي. يتم تشغيله إذا كان اللاعب قريبًا جدًا بغض النظر عن المسار.Humanoid.Died: تمت إضافة معالج لتنظيف متغيرات المسار عند موت الـ NPC.كيفية الاستخدام:
NPC_Pathfinding_AI.server.lua داخل نموذج الـ NPC في Workspace.HumanoidRootPath صحيح في السكربت (أو غيره إلى PrimaryPart إذا كنت تستخدم ذلك).SafeZone و TriggerJumpscareEvent و JumpscareGui بالإعدادات الصحيحة كما في الشروحات السابقة.AGENT_RADIUS و AGENT_HEIGHT في بداية السكربت لتناسب حجم الـ NPC.