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

السؤال

نشر

السلام عليكم, لقد واجهت مشاكل في كتابة اكواد لحركة اللاعب من  منظور الشخص الثالث بلغة سي شارب بعد ان جهزت الكاميرا عن طريق Cinemachine , فعندما احاول ايجاد بعض الاكواد من الانترنت يظهر خطأ في كلمة Input, كيف يمكنني استخدام نظام الادخال الجديد new input system لحل هذه المشكلة؟

Recommended Posts

  • 0
نشر

نظام الإدخال الجديد Input System في Unity هو عبارة عن أداة تستخدم للتحكم في حركة اللاعب في اللعبة، ويتيح هذا النظام لنا قراءة الإدخالات مثل الضغط على الأزرار أو حركة الفأرة بطريقة بسيطة وفعالة.

لتهيئة نظام الإدخال الجديد بشكل صحيح، نقوم ب:

  • بتحميل وتثبيت حزمة الإدخال الجديدة من متجر الأصول في Unity، ثم تثبيت نظام الإدخال الجديد.

بعدها نقوم بإنشاء ملف إعدادات الإدخال وهو عبارة عن ملف ScriptableObjec خاص بإعدادات الإدخال بعدها يمكن إضافة إجراءات الإدخال مثل التحرك والقفز وأي إجراءات أخرى نرغب في إدخالها.

بعدها يجب ربط الإدخال بحركة اللاعب، هذا ممكن من خلال القيام بإنشاء سكريبت لتحريك اللاعب باستخدام إدخالات نظام الإدخال الجديد. عبر استخدام API مثل `PlayerInput` ثم يمكن بعدها تحريك اللاعب وفقا للإدخالات.

نقوم بربط الكاميرا واللاعب، باستخدام Cinemachine لتحديد زاوية وموقع الكاميرا بشكل مناسب وفقا لحركة اللاعب، ثم نختار اللعبة ونتأكد من أن حركة اللاعب تستجيب لإدخالات اللاعب وأن الكاميرا تتحرك بشكل مناسب.

كمثال بسيط فقط ب C# يمكن ذلك من خلال:

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    // تعيين المتغيرات
    public float speed = 5f;
    private Vector2 movementInput;

    // استدعاء الإدخال
    private void OnMove(InputValue value)
    {
        movementInput = value.Get<Vector2>();
    }

    private void FixedUpdate()
    {
        // حساب الحركة الجديدة بناءً على الإدخال
        Vector3 movement = new Vector3(movementInput.x, 0f, movementInput.y) * speed * Time.fixedDeltaTime;
        // تحريك اللاعب
        transform.Translate(movement);
    }
}

ففي هذا المثال، يتم تحريك اللاعب في الفضاء بناء على إدخالات اللاعب باستخدام الدالة OnMove التي تستدعى عندما يتم تغيير الإدخال (مثل تحريك السهم الأيسر). ويتم أيضا استخدام المتغير movementInput لتخزين الإدخالات، ثم يتم تحويلها إلى حركة فعلية وتطبيقها على مكان اللاعب في دالة FixedUpdate.

  • 0
نشر (معدل)
بتاريخ 29 دقائق مضت قال ياسر مسكين:

 

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    // تعيين المتغيرات
    public float speed = 5f;
    private Vector2 movementInput;

    // استدعاء الإدخال
    private void OnMove(InputValue value)
    {
        movementInput = value.Get<Vector2>();
    }

    private void FixedUpdate()
    {
        // حساب الحركة الجديدة بناءً على الإدخال
        Vector3 movement = new Vector3(movementInput.x, 0f, movementInput.y) * speed * Time.fixedDeltaTime;
        // تحريك اللاعب
        transform.Translate(movement);
    }
}

 

احتاج اللاعب ان يتحرك بحيث تكون الكاميرا خلفه وان يغير اتجاهه عن طريق مؤشر الفارة 

تم التعديل في بواسطة Abdullah Mahmoud3
  • 0
نشر

عليك تحديث Unity إلى الإصدار 2019.3 أو أحدث، ففي ذلك الإصدار، تم دمج نظام الإدخال الجديد بشكل افتراضي.

ثم عليك بالتالي:

  1. في Unity، افتح قائمة "Edit" وقم باختيار "Project Settings".
  2. في قائمة "Project Settings"، اختر "Input".
  3. سترى قائمة الأجهزة المدعومة.
  4. تأكد من تفعيل الجهاز الذي تريد استخدامه (مثل لوحة المفاتيح أو ذراع التحكم).
  5. يمكنك إضافة أزرار جديدة وتعيين وظائف لها.

ثم كتابة أكواد حركة اللاعب:

  1. استخدم "Input System Actions" بدلاً من "Input.GetAxis" أو "Input.GetKey".
  2. يمكنك العثور على "Input System Actions" في قائمة "Assets".
  3. انشئ "Input Action Map" جديدًا وقم بتعيين أزرار التحكم.
  4. في نص برمجي، استخدم "Input Action Map" للتحقق من ضغطات الأزرار.

وكمثال:

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    public InputActionMap inputMap;

    private void Update()
    {
        // Check for movement input
        Vector2 movementInput = inputMap.GetAction("Move").ReadValue<Vector2>();

        // Move the player
        transform.Translate(movementInput * Time.deltaTime);
    }
}

 

  • 0
نشر
بتاريخ 31 دقائق مضت قال Abdullah Mahmoud3:

احتاج اللاعب ان يتحرك بحيث تكون الكاميرا خلفه وان يغير اتجاهه عن طريق مؤشر الفارة 

في هذه الحالة، يجب استخدام إدخالات مؤشر الفأرة لتغيير اتجاه اللاعب والكاميرا.


using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5f;
    private Vector2 movementInput;
    private Vector2 mouseInput;
    private Transform mainCameraTransform;

    void Start()
    {
        // الحصول على مكون التحويل للكاميرا الرئيسية
        mainCameraTransform = Camera.main.transform;
    }

    // استدعاء الإدخال لتحريك اللاعب
    private void OnMove(InputValue value)
    {
        movementInput = value.Get<Vector2>();
    }

    // استدعاء الإدخال لتحديث اتجاه الفأرة
    private void OnLook(InputValue value)
    {
        mouseInput = value.Get<Vector2>();
    }

    void FixedUpdate()
    {
        // حساب الحركة الجديدة بناءً على الإدخالات
        Vector3 movement = new Vector3(movementInput.x, 0f, movementInput.y) * speed * Time.fixedDeltaTime;
        // تحريك اللاعب
        transform.Translate(movement);

        // تحديث اتجاه الكاميرا بناءً على حركة المؤشر
        Vector3 rotatePlayer = new Vector3(0f, mouseInput.x, 0f) * Time.fixedDeltaTime * 100f;
        transform.Rotate(rotatePlayer);

        // تحديث اتجاه الكاميرا بناءً على حركة المؤشر الرأسي
        Vector3 rotateCamera = new Vector3(-mouseInput.y, 0f, 0f) * Time.fixedDeltaTime * 100f;
        mainCameraTransform.Rotate(rotateCamera);
    }
}

هنا تمت إضافة دالة جديدة `OnLook` للتعامل مع إدخالات حركة المؤشر بحيث تقوم هذه الدالة بتحديث قيمة `mouseInput` التي تستخدم لتحديث اتجاه اللاعب والكاميرا، هذا الكود يستخدم `Camera.main` للوصول إلى مكون التحويل الخاص بالكاميرا.

  • 0
نشر
بتاريخ 14 دقائق مضت قال ياسر مسكين:

في هذه الحالة، يجب استخدام إدخالات مؤشر الفأرة لتغيير اتجاه اللاعب والكاميرا.


using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5f;
    private Vector2 movementInput;
    private Vector2 mouseInput;
    private Transform mainCameraTransform;

    void Start()
    {
        // الحصول على مكون التحويل للكاميرا الرئيسية
        mainCameraTransform = Camera.main.transform;
    }

    // استدعاء الإدخال لتحريك اللاعب
    private void OnMove(InputValue value)
    {
        movementInput = value.Get<Vector2>();
    }

    // استدعاء الإدخال لتحديث اتجاه الفأرة
    private void OnLook(InputValue value)
    {
        mouseInput = value.Get<Vector2>();
    }

    void FixedUpdate()
    {
        // حساب الحركة الجديدة بناءً على الإدخالات
        Vector3 movement = new Vector3(movementInput.x, 0f, movementInput.y) * speed * Time.fixedDeltaTime;
        // تحريك اللاعب
        transform.Translate(movement);

        // تحديث اتجاه الكاميرا بناءً على حركة المؤشر
        Vector3 rotatePlayer = new Vector3(0f, mouseInput.x, 0f) * Time.fixedDeltaTime * 100f;
        transform.Rotate(rotatePlayer);

        // تحديث اتجاه الكاميرا بناءً على حركة المؤشر الرأسي
        Vector3 rotateCamera = new Vector3(-mouseInput.y, 0f, 0f) * Time.fixedDeltaTime * 100f;
        mainCameraTransform.Rotate(rotateCamera);
    }
}

هنا تمت إضافة دالة جديدة `OnLook` للتعامل مع إدخالات حركة المؤشر بحيث تقوم هذه الدالة بتحديث قيمة `mouseInput` التي تستخدم لتحديث اتجاه اللاعب والكاميرا، هذا الكود يستخدم `Camera.main` للوصول إلى مكون التحويل الخاص بالكاميرا.

ان اللاعب لا يتحرك وقيمة movement تساوي اصفار دائما

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...