Drox Yf نشر 24 مارس 2023 أرسل تقرير نشر 24 مارس 2023 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { public float MoveSpeed = 3f; public float smoothRotationTime = 0.12f; public bool enableMobileInputs = false; float currentVelocity; float currentSpeed; float speedVelocity; Transform cameraTransform; private Animator ch_animator; public FixedJoystick joystick; void Start() { cameraTransform = Camera.main.transform; ch_animator = GetComponent<Animator>(); } void Update() { Vector2 input = Vector2.zero; if (enableMobileInputs) { input = new Vector2(joystick.input.x, joystick.input.y); ch_animator.SetBool("Walk", true); } else { input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); ch_animator.SetBool("Walk", false); } Vector2 inputDir = input.normalized; if (inputDir != Vector2.zero) { float rotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg+ cameraTransform.eulerAngles.y; transform.eulerAngles = Vector3.up *Mathf.SmoothDampAngle(transform.eulerAngles.y,rotation, ref currentVelocity, smoothRotationTime); } float targetSpeed = MoveSpeed * inputDir.magnitude; currentSpeed = Mathf.SmoothDamp(currentSpeed,targetSpeed,ref speedVelocity, 0.1f); transform.Translate(transform.forward * currentSpeed *Time.deltaTime,Space.World); } } السلام عليكم اريد اضافة Rigidbodyالى هدا الكود المشكل الدي لدي هو انه عندما احرك joystick قليلا يتحرك اللاعب بسرعة الى خارج الماب علما انني ابرمج لعبة على اليونتي للهاتف 1 اقتباس
0 Kais Hasan نشر 24 مارس 2023 أرسل تقرير نشر 24 مارس 2023 من فضلك هل يمكنك إرفاق فيديو يوضح ما الذي يحدث تماماً. تحياتي. اقتباس
0 Drox Yf نشر 24 مارس 2023 الكاتب أرسل تقرير نشر 24 مارس 2023 بتاريخ 12 ساعة قال Kais Hasan: من فضلك هل يمكنك إرفاق فيديو يوضح ما الذي يحدث تماماً. تحياتي. ها هو المشكل الذي يقابلني واد لاحظت ايضا فانميشن حركة الشخصية يعمل حتى ولو الشخصية متوقفة و شكرا مقدما على مساعدتك Try MobileGames - DemoDay - Android - Unity 2021.3.21f1 Personal _DX11_ 2023-03-25 02-30-35.mp4 1 اقتباس
0 Mustafa Suleiman نشر 24 مارس 2023 أرسل تقرير نشر 24 مارس 2023 لإضافة Rigidbody إلى اللاعب حاول تجربة الطريقة التالية: في محرر Unity، اختر اللاعب الذي تريد إضافة Rigidbody إليه. في الفرع الهيراركي (Hierarchy)، اختر Add Component من الزاوية اليمنى العليا من النافذة. اختر Physics ثم Rigidbody. ستظهر الآن مكونات Rigidbody في القائمة الجانبية، ويمكنك تعيين القيم التي تريدها. على سبيل المثال، يمكنك ضبط خاصية Mass لتحديد كمية الكتلة التي يمتلكها اللاعب. وبعد إضافة Rigidbody، يجب تغيير بعض الأجزاء في الكود لتحديث التحرك بشكل صحيح مع Rigidbody. أولاً، يمكنك استبدال transform.Translate بـ GetComponent<Rigidbody>().MovePosition لتحريك اللاعب باستخدام Rigidbody. ثانياً، يمكنك استبدال transform.eulerAngles بـ GetComponent<Rigidbody>().MoveRotation لتحديث دوران اللاعب بشكل صحيح مع Rigidbody. لذلك، سيبدو الكود بعد إضافة Rigidbody على النحو التالي: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { public float MoveSpeed = 3f; public float smoothRotationTime = 0.12f; public bool enableMobileInputs = false; float currentVelocity; float currentSpeed; float speedVelocity; Transform cameraTransform; private Animator ch_animator; public FixedJoystick joystick; Rigidbody rb; void Start() { cameraTransform = Camera.main.transform; ch_animator = GetComponent<Animator>(); // Get the Rigidbody component rb = GetComponent<Rigidbody>(); rb.freezeRotation = true; } void FixedUpdate() { Vector2 input = Vector2.zero; if (enableMobileInputs) { input = new Vector2(joystick.input.x, joystick.input.y); ch_animator.SetBool("Walk", true); } else { input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); ch_animator.SetBool("Walk", false); } Vector2 inputDir = input.normalized; if (inputDir != Vector2.zero) { float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraTransform.eulerAngles.y; transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothRotationTime); Vector3 moveDirection = Quaternion.Euler(0f, targetRotation, 0f) * Vector3.forward; Vector3 targetVelocity = moveDirection * MoveSpeed * inputDir.magnitude; // Move the rigidbody to the target velocity rb.MovePosition(rb.position + targetVelocity * Time.fixedDeltaTime); } } } يتم تعيين الـ Rigidbody عن طريق استخدام دالة GetComponent() في دالة Start() وتعيين الحركة باستخدام الدالة MovePosition() في دالة FixedUpdate() بدلاً من دالة Translate() لتجنب المشكلة التي واجهتها سابقًا. اقتباس
0 Drox Yf نشر 24 مارس 2023 الكاتب أرسل تقرير نشر 24 مارس 2023 بتاريخ 12 ساعة قال Mustafa Suleiman: لإضافة Rigidbody إلى اللاعب حاول تجربة الطريقة التالية: في محرر Unity، اختر اللاعب الذي تريد إضافة Rigidbody إليه. في الفرع الهيراركي (Hierarchy)، اختر Add Component من الزاوية اليمنى العليا من النافذة. اختر Physics ثم Rigidbody. ستظهر الآن مكونات Rigidbody في القائمة الجانبية، ويمكنك تعيين القيم التي تريدها. على سبيل المثال، يمكنك ضبط خاصية Mass لتحديد كمية الكتلة التي يمتلكها اللاعب. وبعد إضافة Rigidbody، يجب تغيير بعض الأجزاء في الكود لتحديث التحرك بشكل صحيح مع Rigidbody. أولاً، يمكنك استبدال transform.Translate بـ GetComponent<Rigidbody>().MovePosition لتحريك اللاعب باستخدام Rigidbody. ثانياً، يمكنك استبدال transform.eulerAngles بـ GetComponent<Rigidbody>().MoveRotation لتحديث دوران اللاعب بشكل صحيح مع Rigidbody. لذلك، سيبدو الكود بعد إضافة Rigidbody على النحو التالي: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { public float MoveSpeed = 3f; public float smoothRotationTime = 0.12f; public bool enableMobileInputs = false; float currentVelocity; float currentSpeed; float speedVelocity; Transform cameraTransform; private Animator ch_animator; public FixedJoystick joystick; Rigidbody rb; void Start() { cameraTransform = Camera.main.transform; ch_animator = GetComponent<Animator>(); // Get the Rigidbody component rb = GetComponent<Rigidbody>(); rb.freezeRotation = true; } void FixedUpdate() { Vector2 input = Vector2.zero; if (enableMobileInputs) { input = new Vector2(joystick.input.x, joystick.input.y); ch_animator.SetBool("Walk", true); } else { input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); ch_animator.SetBool("Walk", false); } Vector2 inputDir = input.normalized; if (inputDir != Vector2.zero) { float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraTransform.eulerAngles.y; transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothRotationTime); Vector3 moveDirection = Quaternion.Euler(0f, targetRotation, 0f) * Vector3.forward; Vector3 targetVelocity = moveDirection * MoveSpeed * inputDir.magnitude; // Move the rigidbody to the target velocity rb.MovePosition(rb.position + targetVelocity * Time.fixedDeltaTime); } } } يتم تعيين الـ Rigidbody عن طريق استخدام دالة GetComponent() في دالة Start() وتعيين الحركة باستخدام الدالة MovePosition() في دالة FixedUpdate() بدلاً من دالة Translate() لتجنب المشكلة التي واجهتها سابقًا. بتاريخ 13 ساعة قال Drox Yf: ها هو المشكل الذي يقابلني واد لاحظت ايضا فانميشن حركة الشخصية يعمل حتى ولو الشخصية متوقفة و شكرا مقدما على مساعدتك Try MobileGames - DemoDay - Android - Unity 2021.3.21f1 Personal _DX11_ 2023-03-25 02-30-35.mp4 شكرا على المساعدة - اريد ان اعرف ما سبب المشكل الذي في الفيديو و الحل ادا امكن ساشرح لك المشكل قليلا عندما اضغط عل الجويستيك فقط ضغطة يقوم اللاعب بحركة غير طبيعية كما موضح في الفيديو ولم اعرف من اين المشكل هل من كود الحركة او الريجيدبودي او كود ازرار التحكم اقتباس
0 Mustafa Suleiman نشر 24 مارس 2023 أرسل تقرير نشر 24 مارس 2023 بتاريخ 1 ساعة قال Drox Yf: شكرا على المساعدة - اريد ان اعرف ما سبب المشكل الذي في الفيديو و الحل ادا امكن ساشرح لك المشكل قليلا عندما اضغط عل الجويستيك فقط ضغطة يقوم اللاعب بحركة غير طبيعية كما موضح في الفيديو ولم اعرف من اين المشكل هل من كود الحركة او الريجيدبودي او كود ازرار التحكم حاول تجربة حل المشكلة بإضافة بعض الشروط إلى الكود. يمكنك محاولة تغيير الجزء الخاص بالحركة في الكود ليصبح على النحو التالي: if (inputDir != Vector2.zero) { float rotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg+ cameraTransform.eulerAngles.y; transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y,rotation, ref currentVelocity, smoothRotationTime); // إضافة الشروط if (inputDir.magnitude > 0.1f && currentSpeed < MoveSpeed) { currentSpeed = Mathf.SmoothDamp(currentSpeed,targetSpeed,ref speedVelocity, 0.1f); } else if (inputDir.magnitude <= 0.1f && currentSpeed > 0) { currentSpeed = Mathf.SmoothDamp(currentSpeed, 0, ref speedVelocity, 0.1f); } } // إضافة الشروط if (currentSpeed > 0) { rb.MovePosition(transform.position + transform.forward * currentSpeed * Time.deltaTime); } في الكود السابق، تم إضافة شروط إلى الجزء الذي يتحكم بسرعة اللاعب وحركته. يتم التحقق من مقدار inputDir.magnitude قبل تحديد سرعة اللاعب. إذا كانت قيمة inputDir.magnitude أكبر من 0.1 وكانت السرعة الحالية أقل من السرعة القصوى (MoveSpeed)، فسيتم زيادة السرعة ببطء. إذا كانت قيمة inputDir.magnitude أقل من 0.1، فسيتم تخفيض السرعة ببطء حتى يتم إيقاف حركة اللاعب تمامًا. وأخيرًا، إذا كانت السرعة الحالية أكبر من الصفر، سيتم استخدام الـ Rigidbody لتحريك اللاعب بالطريقة الصحيحة. يرجى ملاحظة أن الحل قد يحتاج إلى التعديل حسب احتياجات مشروعك. اقتباس
0 Drox Yf نشر 24 مارس 2023 الكاتب أرسل تقرير نشر 24 مارس 2023 بتاريخ 12 ساعة قال Mustafa Suleiman: حاول تجربة حل المشكلة بإضافة بعض الشروط إلى الكود. يمكنك محاولة تغيير الجزء الخاص بالحركة في الكود ليصبح على النحو التالي: if (inputDir != Vector2.zero) { float rotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg+ cameraTransform.eulerAngles.y; transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y,rotation, ref currentVelocity, smoothRotationTime); // إضافة الشروط if (inputDir.magnitude > 0.1f && currentSpeed < MoveSpeed) { currentSpeed = Mathf.SmoothDamp(currentSpeed,targetSpeed,ref speedVelocity, 0.1f); } else if (inputDir.magnitude <= 0.1f && currentSpeed > 0) { currentSpeed = Mathf.SmoothDamp(currentSpeed, 0, ref speedVelocity, 0.1f); } } // إضافة الشروط if (currentSpeed > 0) { rb.MovePosition(transform.position + transform.forward * currentSpeed * Time.deltaTime); } في الكود السابق، تم إضافة شروط إلى الجزء الذي يتحكم بسرعة اللاعب وحركته. يتم التحقق من مقدار inputDir.magnitude قبل تحديد سرعة اللاعب. إذا كانت قيمة inputDir.magnitude أكبر من 0.1 وكانت السرعة الحالية أقل من السرعة القصوى (MoveSpeed)، فسيتم زيادة السرعة ببطء. إذا كانت قيمة inputDir.magnitude أقل من 0.1، فسيتم تخفيض السرعة ببطء حتى يتم إيقاف حركة اللاعب تمامًا. وأخيرًا، إذا كانت السرعة الحالية أكبر من الصفر، سيتم استخدام الـ Rigidbody لتحريك اللاعب بالطريقة الصحيحة. يرجى ملاحظة أن الحل قد يحتاج إلى التعديل حسب احتياجات مشروعك. للاسف المشكل مازال مستمرا ولكن علمت ما سبب هده لحركة فعندما اضيف add component rigidbody يحدث هدا لمشكل اقتباس
السؤال
Drox Yf
السلام عليكم
اريد اضافة Rigidbodyالى هدا الكود
المشكل الدي لدي هو انه عندما احرك joystick قليلا يتحرك اللاعب بسرعة الى خارج الماب
علما انني ابرمج لعبة على اليونتي للهاتف
6 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.