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 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
0 Kais Hasan نشر 24 مارس 2023 أرسل تقرير مشاركة نشر 24 مارس 2023 من فضلك هل يمكنك إرفاق فيديو يوضح ما الذي يحدث تماماً. تحياتي. اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
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 اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
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() لتجنب المشكلة التي واجهتها سابقًا. اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
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 شكرا على المساعدة - اريد ان اعرف ما سبب المشكل الذي في الفيديو و الحل ادا امكن ساشرح لك المشكل قليلا عندما اضغط عل الجويستيك فقط ضغطة يقوم اللاعب بحركة غير طبيعية كما موضح في الفيديو ولم اعرف من اين المشكل هل من كود الحركة او الريجيدبودي او كود ازرار التحكم اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
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 لتحريك اللاعب بالطريقة الصحيحة. يرجى ملاحظة أن الحل قد يحتاج إلى التعديل حسب احتياجات مشروعك. اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
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 يحدث هدا لمشكل اقتباس رابط هذا التعليق شارك على الشبكات الإجتماعية More sharing options...
السؤال
Drox Yf
السلام عليكم
اريد اضافة Rigidbodyالى هدا الكود
المشكل الدي لدي هو انه عندما احرك joystick قليلا يتحرك اللاعب بسرعة الى خارج الماب
علما انني ابرمج لعبة على اليونتي للهاتف
رابط هذا التعليق
شارك على الشبكات الإجتماعية
6 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.