اذهب إلى المحتوى

السؤال

نشر
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 قليلا يتحرك اللاعب بسرعة الى خارج الماب 

علما انني ابرمج لعبة على اليونتي للهاتف 

Screenshot 2023-03-25 004240.png

Recommended Posts

  • 0
نشر
بتاريخ 12 ساعة قال Kais Hasan:

من فضلك هل يمكنك إرفاق فيديو يوضح ما الذي يحدث تماماً.

تحياتي.

 

ها هو المشكل الذي يقابلني 

واد لاحظت ايضا فانميشن حركة الشخصية يعمل حتى ولو الشخصية متوقفة

و شكرا مقدما على مساعدتك

  • 0
نشر

 لإضافة Rigidbody إلى اللاعب حاول تجربة الطريقة التالية:

  1. في محرر Unity، اختر اللاعب الذي تريد إضافة Rigidbody إليه.
  2. في الفرع الهيراركي (Hierarchy)، اختر Add Component من الزاوية اليمنى العليا من النافذة.
  3. اختر Physics ثم Rigidbody.
  4. ستظهر الآن مكونات Rigidbody في القائمة الجانبية، ويمكنك تعيين القيم التي تريدها. على سبيل المثال، يمكنك ضبط خاصية Mass لتحديد كمية الكتلة التي يمتلكها اللاعب.

وبعد إضافة Rigidbody، يجب تغيير بعض الأجزاء في الكود لتحديث التحرك بشكل صحيح مع Rigidbody.

  1. أولاً، يمكنك استبدال transform.Translate بـ GetComponent<Rigidbody>().MovePosition لتحريك اللاعب باستخدام Rigidbody.
  2. ثانياً، يمكنك استبدال 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
نشر
بتاريخ 12 ساعة قال Mustafa Suleiman:

 لإضافة Rigidbody إلى اللاعب حاول تجربة الطريقة التالية:

  1. في محرر Unity، اختر اللاعب الذي تريد إضافة Rigidbody إليه.
  2. في الفرع الهيراركي (Hierarchy)، اختر Add Component من الزاوية اليمنى العليا من النافذة.
  3. اختر Physics ثم Rigidbody.
  4. ستظهر الآن مكونات Rigidbody في القائمة الجانبية، ويمكنك تعيين القيم التي تريدها. على سبيل المثال، يمكنك ضبط خاصية Mass لتحديد كمية الكتلة التي يمتلكها اللاعب.

وبعد إضافة Rigidbody، يجب تغيير بعض الأجزاء في الكود لتحديث التحرك بشكل صحيح مع Rigidbody.

  1. أولاً، يمكنك استبدال transform.Translate بـ GetComponent<Rigidbody>().MovePosition لتحريك اللاعب باستخدام Rigidbody.
  2. ثانياً، يمكنك استبدال 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:

 

ها هو المشكل الذي يقابلني 

واد لاحظت ايضا فانميشن حركة الشخصية يعمل حتى ولو الشخصية متوقفة

و شكرا مقدما على مساعدتك

شكرا على المساعدة        -        اريد ان اعرف ما سبب المشكل الذي في الفيديو و الحل ادا امكن

ساشرح لك المشكل قليلا 

عندما اضغط عل الجويستيك فقط ضغطة يقوم اللاعب بحركة غير طبيعية كما موضح في الفيديو ولم اعرف من اين المشكل هل من كود الحركة او الريجيدبودي او كود ازرار التحكم

 

  • 0
نشر
بتاريخ 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
نشر
بتاريخ 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 يحدث هدا لمشكل 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...