Unconfigured Ad Widget

تقليص

إعـــــــلان

تقليص

رثاء

‏خالص العزاء والمواساه في وفاة العضو القدير الأخ ياسر ياسين رحمه الله

https://www.maxforums.net/node/3676654
شاهد أكثر
شاهد أقل

نقاش بسيط في اليونتي

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • نقاش بسيط في اليونتي

    السلام عليكم
    حبيت يكون هذا النقاش بخصوص برمجة سيارة في اليونتي ،نظراً لضروفي الحالية ،ماقدرت ادخل اليوتيوب او ابحث فية ،حبيت اناقش الموضوع معكم و الكل يعطينا فكرة طريقة برمجة السيارة و تحديد اماكن عجلات السيارة هل هو برمجياً ام تعديل عادي ،يعني لو فرضنا ان كل عجلة عبارة عن كائن و اريد وضع كل عجلة في مكانها و استخدم الفيزياء لتحريك العجلات و في نفس الوقت يتحرك جسم السيارة ،انا ما تابعت فيديو من قبل لهذا الكلام لكن حبيت استفسر منكم ،و اي شخص عندة معلومة ياريت يكتبها في تعليق و شكراً.
    مدونتي Home OF Games تهتم بتطوير الألعاب
    قناتي
    YouTube

    لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
    .

  • #2
    اخي عماد عندي معلومات وتجارب عن هذا الموضوع سأشاركك فيها بإذن الله في الايام القادمة، ولكنني عمل على موضوع وسأنتهي منه قريباً.
    عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

    تعليق


    • #3
      بالنسبة للسيارات لم أجرب صراحة لكن الأكيد انه برمجيا
      فمتلا العجلات الأمامية تتحرك يمين شمال أما عجلات الوراء تبقى تابتة هنا تتدخل البرمجة
      لكن تبقى المشكلة المطروحة هي هل ستبقى العجلات ملتصقة مع جسم السيارة لو وقع تصادم عنيف
      سبق ومرت علي مشكلة انفصال جسم عن جسم أخر بسبب قوة التصادم رغم ربطهما ببعضهما
      لكنني لم أتعمق في المشكلة المهم أنا متأكد أنه أخونا محمد سيجيبك يمكنك الاعتماد عليه .

      قال الله سبحانه وتعالى: (إنَّ اللهَ وملائكَتَهُ يُصَلُّونَ على النَّبي يا أَيُّها الذِّين آمَنوا صَلُّوا عَلَيهِ وَسَلِّمُوا تَسْلِيما ً)


      تعليق


      • #4
        توجد هنالك امثله مرفقه مع اليونتي فيه مشروع سياره يمكنك ان تتعرفه عن المرضوع اكثر من خلاله
        لا اله الا الله واشهد ان محمد رسول الله
        اللهم اني اسألك باسمك الاعظم اللذي اذا دعيت به اجبت ان تنصر المسلمين وجندك على الظالمين
        وتفتك باعدائك اعداء الدين

        تعليق


        • #5
          شكراً لكل شخص اعطانا معلومة ،و ان شاء الله اخي محمد منتظر منك اي معلومة و من اي شخص ،شكراً
          مدونتي Home OF Games تهتم بتطوير الألعاب
          قناتي
          YouTube

          لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
          .

          تعليق


          • #6
            دعنا نناقش الموضوع بالاعتماد على المثال المرفق مع اليونيتي 5 الذي تجد فيه سيارة، كي لا نضطر الى انشاء سيارات وسكريبتات، وللعلم السيارة الموجودة مع اليونيتي لا تحاكي اي سيارة حقيقية وهي اقرب الى الكرتونية (وهو ما صرح عنه فريق اليونيتي في مدونتهم) وهذه فكرة مهمة كي لا تظن بأن السيارة فاشلة او ما شابه. ايضاً لن اناقش الموضوع في رد واحد بل سأوزعه على عدة ردود.

            طيب دعني اعطيك لمحة عن حركة السيارة. ان السيارة تتحرك في البداية عن طريق محرك، هذا المحرك ينتج عزم حركي Torque يتعلق بسرعة دوران المحرك والتي توصف ب RPM اي دورة في الدقيقة. الآن هذا العزم يتوجه نحو العجلات ويديرها ولكن الانتقال لا يكون بشكل مباشر بل عن طريق ناقل الحركة ومن هنا تضيع بعض القوة بحسب الناقل (في الغالب هناك ستة نواقل للسيارة ذات التحكم اليدوي)، بالاضافة الى ان هذا العزم يتناسب مع دواسة البنزين، فالعزم الكلي لا يعطى الا بدواسة بنزين كاملة. بعد وصول العزم الى العجلات فإنها تدور ونتيجة الاحتكاك ورد الفعل مع الارض تتحرك السيارة.

            هذا من جهة، من جهة اخرى يوجد نظام مهم في السيارة وهو نظام التعليق Suspension، والذي يتكون من قسمين: نابض Spring وماص للصدم Damper، ولكل عجلة هذين المكونين، ووظيفة نظام التعليق هو جعل الرحلة في السيارة سلسة قدر الامكان، حيث يقوم النابض بتحريك العجلة بحسب الطريق فلا تنتقل وعورة الطريق الى السائق، ويقوم ماص الصدم بإمتصاص الطاقة التي اختزنها النابض نتيجة تقلصه كي لا يستمر في الاهتزاز.

            الآن، اساس محاكاة السيارات في اليونيتي يعتمد على استخدام المكون Wheel Collider، هذا المكون مختلف عن بقية الكولايدرات بأنه خاص فقط لمحاكاة عجلات السيارة، وهو يمتلك خصائص مثل قطر العجلة، وزنها ونظام التعليق الخاص بها (والمكون من نابض Spring وماص للصدمات Damper لكل عجلة)، وهذا المكون وظيفته الرئيسية فقط هو التصادم مع البيئة المحيطة، اما تحريك العجلة نفسها يجب ان يعتمد على محرك خارجي (في الغالب سكريبت) يقوم بإعطاء عزم حركي لهذا الكولايدر فيدور وتتحرك العجلة، ويوفر المكون برمجياً خصائص مثل
            motorTorque اي عزم الخركة الذي يقوم بتدوير العجلة، brakeTorque اي عزم الحركة الخاص بالفرملة وهو الطريقة الامثل لفرملة السيارة، وخاصية rpm اي عدد الدورات في الدقيقة الواحدة بالاضافة الى خصائص عديدة.

            طيب دعنا في البداية ننظر الى شكل السيارة المرفقة مع اليونيتي. في البداية يفضل دوماً فصل الكولايدرات عن ال Meshes، وجعل جميع المكونات ابناء لكائن واحد رئيسي، ويمكنك ملاحظة الكائن Car والثلاث ابناء Colliders والذي يحتوي على جميع الكولايدرات الخاصة بمجسم السيارة، WheelHubs والذي يحتوي على الكولايدرات الخاصة بالعجلات فقط والكائن SkyCar والذي يحتوي على جميع ال Meshes.
            الآن بالنظر الى الكائن WheelHubs فإننا نجد انه يحتوي على اربع كائنات، كائن لكل عجلة والكائن ببساطة يحتوي على مكون WheelCollider فقط وسنمر على اعداداته لاحقاً.

            الآن التحكم الاساسي في السيارة يجري عن طريق السكريبت CarController الموجود على الكائن Car، وستجد بأنه في اي سيارة في اليونيتي يوضع سكريبت التحكم الرئيسي على الكائن الاب، كما ان ال Rigidbody الرئيسي يوضع عليه ايضاً، ويجدر الانتباه الى الكتلة Mass فالكتلة الافتراضية 1 كيلو غرام لن تنفع، واغلب السيارات تتراوح كتلتها بين 1000 و2000 كيلوغرام، والحافلات تتجاوز ال 10000 كيلو غرام بسهولة.

            دعنا نتفحص سكريبت CarController، في البداية لدينا اثنان enum لتعريف نوع السيارة (دفع رباعي، دفع امامي، دفع خلفي) وآخر لتعريف نوع السرعة (ميل في الساعة MPH او كيلومتر في الساعة KPH) حيث ان سرعة اليونيتي هي متر في الثانية:
            كود:
            internal enum CarDriveType
                {
                    FrontWheelDrive,
                    RearWheelDrive,
                    FourWheelDrive
                }
            
                internal enum SpeedType
                {
                    MPH,
                    KPH
                }
            ثم نجد بعذ ذلك قائمة طويلة من المتغيرات، واذكر منها نوع السيارة، مصفوفة الكولايدرات الخاصة بالعجلات،مصفوفة ال Meshes الخاصة بالعجلات،مصفوفة تأثيرات العجلات حيث لكل عجلة تأثير خاص بها، متغير لتحديد مركز الثقل الخاص بالسيارة Center of Mass، اقصى زاوية دوران للعجلة (في السيارات تكون هذه الزاوية 25 درجة او اكثر) حيث ان Steering هو مصطلح تدوير السيارات، العزم الحركي Torque المطبق على جميع العجلات وهو بواحدة نيوتن بالمتر، ثم يوجد العزم العكسي وعزم الفرامل، نوع السرعة واقصى سرعة، بالاضافة الى متغيرات اخرى كثيرة سنمر عليها لاحقاً، من المفيد ان تلاحظ ايضاً ان المتغيرات ال private موسمة بالوسم ......izedField والذي يجعلها قابلة للعرض في الانسبكتر (مع وظائف اخرى):
            كود:
            //......izeField fields will be shown in the inspector
                    [......izeField] private CarDriveType m_CarDriveType = CarDriveType.FourWheelDrive;
                    [......izeField] private WheelCollider[] m_WheelColliders = new WheelCollider[4];
                    [......izeField] private GameObject[] m_WheelMeshes = new GameObject[4];
                    [......izeField] private WheelEffects[] m_WheelEffects = new WheelEffects[4];
                    [......izeField] private Vector3 m_CentreOfMassOffset;
                    [......izeField] private float m_MaximumSteerAngle;
                    [Range(0, 1)] [......izeField] private float m_SteerHelper; // 0 is raw physics , 1 the car will grip in the direction it is facing
                    [Range(0, 1)] [......izeField] private float m_TractionControl; // 0 is no traction control, 1 is full interference
                    [......izeField] private float m_FullTorqueOverAllWheels;
                    [......izeField] private float m_ReverseTorque;
                    [......izeField] private float m_MaxHandbrakeTorque;
                    [......izeField] private float m_Downforce = 100f;
                    [......izeField] private SpeedType m_SpeedType;
                    [......izeField] private float m_Topspeed = 200;
            		//...... of car gears
                    [......izeField] private static int NoOfGears = 5;
                    [......izeField] private float m_RevRangeBoundary = 1f;
                    [......izeField] private float m_SlipLimit;
                    [......izeField] private float m_BrakeTorque;
            
                    private Quaternion[] m_WheelMeshLocalRotations;
                    private Vector3 m_Prevpos, m_Pos;
                    private float m_SteerAngle;
                    private int m_GearNum;
                    private float m_GearFactor;
                    private float m_OldRotation;
                    private float m_CurrentTorque;
                    private Rigidbody m_Rigidbody;
                    private const float k_ReversingThreshold = 0.01f;
            
                    public bool Skidding { get; private set; }
                    public float BrakeInput { get; private set; }
                    public float CurrentSteerAngle{ get { return m_SteerAngle; }}
                    public float CurrentSpeed{ get { return m_Rigidbody.velocity.magnitude*2.23693629f; }}
                    public float MaxSpeed{get { return m_Topspeed; }}
                    public float Revs { get; private set; }
                    public float AccelInput { get; private set; }
            في الدالة Start لدينا بعض التعريفات الاساسية، مثل تخزين دوران كل عجلة في مصفوفة Quaternion، تعديل مركز الثقل الخاص بالسيارة من خلال المتغير الخاص بذلك، الوصول الى ال Rigidbody بالاضافة الى تحديد العزم الكلي بالاعتماد على درجة تحكم اللاعب بدفع السيارة:
            كود:
            private void Start()
                    {
                        m_WheelMeshLocalRotations = new Quaternion[4];
                        for (int i = 0; i < 4; i++)
                        {
                            m_WheelMeshLocalRotations[i] = m_WheelMeshes[i].transform.localRotation;
                        }
            			//Change the center of mass 
                        m_WheelColliders[0].attachedRigidbody.centerOfMass = m_CentreOfMassOffset;
            
                        m_MaxHandbrakeTorque = float.MaxValue;
            
                        m_Rigidbody = GetComponent<Rigidbody>();
                        m_CurrentTorque = m_FullTorqueOverAllWheels - (m_TractionControl*m_FullTorqueOverAllWheels);
                    }
            الدالة GearChanging تعمل بمثابة ناقل الحركة الاتوماتيكي، فهي تغير الوضع الحالي بحسب السرعة، ومبدأ عملها بسيط، بفرض لدينا 5 اوضاع للحركة، كل وضع يمكن تمثيله بنسبة مثل 1/5, 2/5, 5/5 وما سنقوم به هو تقسيم السرعة على هذه الاقسام الخمسة ومن ثم نحسب نسبة سرعتنا الحالية الى السرعة الكلية ومن ثم نعرف اي وضع يجب ان نختار فإذا كانت النسبة 0.3 مثلاً فإنها يجب ان تكون في الوضع الاول لأن نسبته 1/5 اي 0.2 والناقل التالي نسبته 2/5 اي 0.4:
            كود:
            private void GearChanging()
                    {
                        float f = Mathf.Abs(CurrentSpeed/MaxSpeed);
                        float upgearlimit = (1/(float) NoOfGears)*(m_GearNum + 1);
                        float downgearlimit = (1/(float) NoOfGears)*m_GearNum;
            
                        if (m_GearNum > 0 && f < downgearlimit)
                        {
                            m_GearNum--;
                        }
            
                        if (f > upgearlimit && (m_GearNum < (NoOfGears - 1)))
                        {
                            m_GearNum++;
                        }
                    }
            الدوال الثلاثة التالية هي دوال مساعدة الهدف منها حساب عدد دورات المحرك من اجل امور خاصة بالصوت والعرض وليست متعلقة بحركة السيارة، ولن نناقشها الآن:
            كود:
                    // simple function to add a curved bias towards 1 for a value in the 0-1 range
                    private static float CurveFactor(float factor)
                    {
                        return 1 - (1 - factor)*(1 - factor);
                    }
            
            
                    // unclamped version of Lerp, to allow value to exceed the from-to range
                    private static float ULerp(float from, float to, float value)
                    {
                        return (1.0f - value)*from + value*to;
                    }
            
            
                    private void CalculateGearFactor()
                    {
                        float f = (1/(float) NoOfGears);
                        // gear factor is a normalised representation of the current speed within the current gear's range of speeds.
                        // We smooth towards the 'target' gear factor, so that revs don't instantly snap up or down when changing gear.
                        var targetGearFactor = Mathf.InverseLerp(f*m_GearNum, f*(m_GearNum + 1), Mathf.Abs(CurrentSpeed/MaxSpeed));
                        m_GearFactor = Mathf.Lerp(m_GearFactor, targetGearFactor, Time.deltaTime*5f);
                    }
            
            
                    private void CalculateRevs()
                    {
                        // calculate engine revs (for display / sound)
                        // (this is done in retrospect - revs are not used in force/power calculations)
                        CalculateGearFactor();
                        var gearNumFactor = m_GearNum/(float) NoOfGears;
                        var revsRangeMin = ULerp(0f, m_RevRangeBoundary, CurveFactor(gearNumFactor));
                        var revsRangeMax = ULerp(m_RevRangeBoundary, 1f, gearNumFactor);
                        Revs = ULerp(revsRangeMin, revsRangeMax, m_GearFactor);
                    }
            Move هي الدالة الرئيسية الخاصة بتحريك السيارة:
            كود:
            public void Move(float steering, float accel, float footbrake, float handbrake)
                    {
            			
                        for (int i = 0; i < 4; i++)
                        {
                            Quaternion quat;
                            Vector3 position;
                            m_WheelColliders[i].GetWorldPose(out position, out quat);
                            m_WheelMeshes[i].transform.position = position;
                            m_WheelMeshes[i].transform.rotation = quat;
                        }
            
                        //clamp input values
                        steering = Mathf.Clamp(steering, -1, 1);
                        AccelInput = accel = Mathf.Clamp(accel, 0, 1);
                        BrakeInput = footbrake = -1*Mathf.Clamp(footbrake, -1, 0);
                        handbrake = Mathf.Clamp(handbrake, 0, 1);
            
                        //Set the steer on the front wheels.
                        //Assuming that wheels 0 and 1 are the front wheels.
                        m_SteerAngle = steering*m_MaximumSteerAngle;
                        m_WheelColliders[0].steerAngle = m_SteerAngle;
                        m_WheelColliders[1].steerAngle = m_SteerAngle;
            
                        SteerHelper();
                        ApplyDrive(accel, footbrake);
                        CapSpeed();
            
                        //Set the handbrake.
                        //Assuming that wheels 2 and 3 are the rear wheels.
                        if (handbrake > 0f)
                        {
                            var hbTorque = handbrake*m_MaxHandbrakeTorque;
                            m_WheelColliders[2].brakeTorque = hbTorque;
                            m_WheelColliders[3].brakeTorque = hbTorque;
                        }
            
            
                        CalculateRevs();
                        GearChanging();
            
                        AddDownForce();
                        CheckForWheelSpin();
                        TractionControl();
                    }
            لاحظ اولاً ان الدالة تأخذ اربعة بارامترات، ويتم استدعائها من سكريبت خارجي اسمه CarUserControl ويمكنك مراجعته بسيط جداً.
            السطور الاول اي داخل حلقة foreach تقوم بالدوران على كامل عجلات السيارة وتجعل دورانها وموقعها هو من موقع ال WheelCollider الموافق لها ولاحظ بأننا نحصل على هذه المعلومات من الدالة التي تعيد لنا احداثيات ال WheelCollider بالنسبة للعالم، وجرب حذف هذه الحلقة من السكريبت وستجد بأن العجلات ستصبح ثابتة ولن تتحرك او بشكل ادق ال Meshes الخاصة بالعجلات لن تتحرك.

            الاربع سطور التالية تقوم بعمل Clamp لكل قيم المدخلات (Clamp اي تجعلهم في مدة محدد، قيمة عليا وقيمة دنيا).

            الخطوة التالية هي تدوير ال WheelCollider الخاص بالعجلتين الاماميتين، لاحظ انن نقوم بذلك عن طريق الوصول الى الخاصية steerAngle الخاصة بال WheelCollider ولاحظ بأننا نضرب زاوية الدوران القصوى بالادخال الذي ادخله اللاعب، فإذا ضغط اللاعب ضغطة خفيفة فإن العجلة ستدور بحسب نسبة هذه الضغطة.

            الدالة التالية التي يتم استدعائها داخل Move هي SteerHelper، الهدف من هذا الدالة مساعدة اللاعب على تدوير السيارة، حيث اننا قمنا بتعريف متغير باسم m_SteerHelper يحدد لنا مقدار مساعدة اللاعب في الدوران، فإذا كانت قيمته صفر فهذا يعني بأن السيارة سخضع للفيزياء بشكل كامل وعند المنعطفات ستتجه السيارة بحسب الطاقة المختزنة فيها بجهة مخالفة لجهتها الامامية، اما اذا كانت قيمته واحد فهذا يعني بأن السيارة ستتجه دوماً بالاتجاه الامامي الخاص بها وهو امر غير فيزيائي، وجرب التلاعب بهذا المتغير ولاحظ النتائج. لن اتعملق في هذه الدالة حالياً:
            كود:
            private void SteerHelper()
                    {
                        for (int i = 0; i < 4; i++)
                        {
                            WheelHit wheelhit;
                            m_WheelColliders[i].GetGroundHit(out wheelhit);
                            if (wheelhit.normal == Vector3.zero)
                                return; // wheels arent on the ground so dont realign the rigidbody velocity
                        }
            
                        // this "if" is needed to avoid gimbal lock problems that will make the car suddenly shift direction
                        if (Mathf.Abs(m_OldRotation - transform.eulerAngles.y) < 10f)
                        {
                            var turnadjust = (transform.eulerAngles.y - m_OldRotation) * m_SteerHelper;
                            Quaternion velRotation = Quaternion.AngleAxis(turnadjust, Vector3.up);
                            m_Rigidbody.velocity = velRotation * m_Rigidbody.velocity;
                        }
                        m_OldRotation = transform.eulerAngles.y;
                    }
            لاحقاً يتم استدعاء الدالة ApplyDrive وهي المسؤولة عن دفع العجلات، وهي تأخذ بارامترين، ادخال التسارع او ادخال الفرملة:
            كود:
                    private void ApplyDrive(float accel, float footbrake)
                    {
            
                        float thrustTorque;
                        switch (m_CarDriveType)
                        {
                            case CarDriveType.FourWheelDrive:
                                thrustTorque = accel * (m_CurrentTorque / 4f);
                                for (int i = 0; i < 4; i++)
                                {
                                    m_WheelColliders[i].motorTorque = thrustTorque;
                                }
                                break;
            
                            case CarDriveType.FrontWheelDrive:
                                thrustTorque = accel * (m_CurrentTorque / 2f);
                                m_WheelColliders[0].motorTorque = m_WheelColliders[1].motorTorque = thrustTorque;
                                break;
            
                            case CarDriveType.RearWheelDrive:
                                thrustTorque = accel * (m_CurrentTorque / 2f);
                                m_WheelColliders[2].motorTorque = m_WheelColliders[3].motorTorque = thrustTorque;
                                break;
            
                        }
            
                        for (int i = 0; i < 4; i++)
                        {
                            if (CurrentSpeed > 5 && Vector3.Angle(transform.forward, m_Rigidbody.velocity) < 50f)
                            {
                                m_WheelColliders[i].brakeTorque = m_BrakeTorque*footbrake;
                            }
                            else if (footbrake > 0)
                            {
                                m_WheelColliders[i].brakeTorque = 0f;
                                m_WheelColliders[i].motorTorque = -m_ReverseTorque*footbrake;
                            }
                        }
                    }
            عمل الدالة بسيط جداً، فهي اولاً تعرف متغير لتحديد العزم الحركي الذي سيتم توزيعه على العجلات، حيث اننا لن نعطي العجلات العزم الكلي الذي عرفناه في البداية بل قسم فقط. تتحقق بعد ذلك الدالة من نوع السيارة (دفع امامي او اخلفي او كلاهما) ومن ثم تقوم بتوزيع العزم على العجلات بحسب الوضع (اما ان تقسمه الى اثنان او ال اربع اقسام) ولاحظ باننا نستخدم الخاصية motorTorque التي تعطي العزم لل WheelCollider واليونيتي يتكفل بالباقي فهو يدور العجلة ويدفع السيارة بحسب الاحتكاك الخ.

            بالعودة الى الدالة Move، استدعينا الدالة CapSpeed، الهدف منها هو منع السرعة من تجاوز السرعة القصوى، ويتم ذلك عن طريق تحويل متجه السرعة velocity الى قيمة، وطبعاً السرعة في اليونيتي هي بواحدة المتر في الثانية لذا فإننا نحولها الى الوحدة المناسبة بحسب اختيار المستخدم، ومن ثم نتحقق من السرعة وفي حال تجاوزت الحد المسموح، فإننا نجعل سرعة ال rigidbody هي السرعة القصوى ولكن لا تنسى اننا نعيد التحويل من الوحدة المختارة الى وحدة متر في الثانية. علماً ان 2.23693629 هو ثابت التحويل من المتر بالثانية الى ميل بالساعة، و3.6 هو ثابت التحويل من متر بالثانية الى كيلومتر بالساعة.

            السطور الخمسة السابقة خاصة بالفرملة، وكما تلاحظ فإنه من اجل الفملة يجب استخدام الخاصية brakeTorque ولا يجب اضافة عزم معكوس عن طريق الخاصية motorTorque.

            بعد ذلك نستدعي الدالتين اللتان شرحناهما سابقاً، CalculateRevs و GearChanging.

            الآن نستدعي الدالة AddDownForceطن والهدف منها بسيط وهو تثبيت السيارة عن طريق اضافة قوة تدفعها الى الاسفل وهذه القوة متناسبة مع سرعة السيارة لذلك نضربها بها.

            بعد ذلك نستدعي الدالة CheckForWheelSpin، المصطلح Spining يعني بأن العجلة تدور ولكن دون ان تتحكر بمعنى آخر احتكاك قوي، او تفحيط بالعامية، ونتيجة لذلك فإننا نضيف صوت التفحيط والمؤثرات الخاصة به. وللقيام بذلك فإننا اولاً نستخدم الدالة GetGroundHit والتي نخرج منها كائن من نوع WheelHit يحتوي على معلومات تصادم العجلة مع الارض، ومن هذه المعلومات الانزلاق الامامي forwardSlip وsidewaysSlip الانزلاق الجانبي، ونحن نقوم بتحديد حد لهذه القيم في حال تجاوزته فإننا نعتبر الانزلاق تفحيط.

            الدالة الاخيرة هدفها هو مساعدة اللاعب على التحكم بالسيارة من خلال تعديل دوران العجلات في حال كانت تدور بقيم مرتفعة جداً.

            طبعاً هذا ليس شرح نهائي الموضوع متشعب بشكل كبير وسنناقشه في الردود القادمة، كما انني لم افصل في كل دالة بل شرحت الشكل العام وفي حال واجهت اي استفسار فيمكن طرحه هنا.
            عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

            تعليق


            • #7
              اليونيتي يساعدك في برمجة السيارات

              فيه wheel collider له خصائص تحرك السيارة

              تعليق


              • #8
                شكراً اخي محمد على الشرح الاكثر من رائع ،صراحة انا شفت المشروع تبع السيارة لكن على شكل فيديو يتحدث عن ميكانيكية الحركة و غيرها ، كنت اضن ان برمجة حركة السيارة سهل لكن عرفن الان ان الموضوع محتاج احترافية اكبر في البرمجية، مكون Wheel Collider شفتة اكثر من مرة لكن ماتعمقت فية و لكن من شرحك اضن انة كان لازم استخدمة في لعبتي السابقة لاعطاء حركة افضل للمدفع، الموضوع مثل ماقلت انت مشعب جداً، سؤالك لك اخي محمد ،انت درست المشروع يعني عملت دراسة حولة، ايضاً البرمجة اشوف انك فهمتها بشكل كبير، يعني ماشاءالله عندك مقدرة في فهم الملفات الكبيرة، انا مادرست السي شارب من قبل بخلافك، يعني احب انك تعطينا نصائح اكثر من الشرح ،يعني نصائح بخصوص تعلم البرمجة ،هلرادخل معهد و اتعلم لغة السي شارب، و للعلم انا عندي خبرة متوسطة في بناء المواقع ،ايضاً عندي خبرة كبير في التصميم في السكتش اب، اعرف ان هذا مالة علاقة باليونتي لكن اشوف اني اضعت وقت كبير في هذة البرامج حان وقت اليونتي باذن الله، كنت افكر ادرس لغة السي شارب في اي جامعة عندنا علشان اوسع معرفتي ،من وجهه نظرك تشوف انة خيار جميل ؟ او اني استمر على اليونتي افضل ؟عمري 18 بنفس عمرك لكن دخلت عالم البرمجة متاخر و ارى ان تقديمي لاول لعبة اعطانا حافز اني اكمل دراستي في اليونتي و اوسع معرفتي، ارى ان النصيحة افضل من الشرح، مع العالم ان شرحك رهيب جداً بارك الله فيك و اتمنى تطلعنا على المعلومات اكثر ،لاني اركز على شرحك اكثر من البرمجة مع العلم اني بعيد عن اليونتي حالياً لكن راح ارجعلة قريب ان شاء الله ، اتمنى انك تستمر و اتمنى اي معلومة من اي شخص و شكراً للجميع 😊☺.
                مدونتي Home OF Games تهتم بتطوير الألعاب
                قناتي
                YouTube

                لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
                .

                تعليق


                • #9
                  في حال كنت تمتلك اليونيتي 5 فاقترح عليك فتح مشروع الامثلة المرفق معه والتلاعب في كود وفي تصميم السيارة.

                  عندي بعض الملاحظات: في البداية هناك اختلاف كبير بين اليونيتي 4 واليونيتي 5 في ال Wheel Collider، فبحسب اليونيتي مكتبة ال PhysX 3.3 مختلفة تماماً عن النسخة السابقة المستعملة في اليونيتي 4 من ناحية برمجة فيزياء السيارات، وهذا شيء لاحظه الكثيرون من خلال ان القيم التي كانت تستخدم مع اليونيتي 4 لم تعد تعمل كلها مع اليونيتي 5، والكثير من المشاريع لم يعد بالامكان نقلها الى اليونيتي 5 بشكل مباشر، حتى مشروع Edy's Vehicle تم اعادة تصميمه من الصفر مع اليونيتي 5 وتم استخدام طريقة جديدة كلياً في برمجة السيارات مختلفة ع الموجودة في امثلة اليونيتي. المهم اليوم يجب ان تنتبه الى الفيديو ان كان يعمل مع اليونيتي 4 او مع اليونيتي 5.

                  بالنسبة لاستخدام ال Wheel Collider في مشروعك فيجب ان تستخدم النسخة ثنائية الابعاد منه Wheel Joint 2D وهي نسخة ابسط ولكنها تعطي نتائج جميلة ثنائية الابعاد.

                  بالنسبة لدراستي للمشروع فأنا لم ادرس المشروع بشكل كبير، بل اطلعت عليه لفترة بسيطة وفكرت في التوسع فيه وربما عمل ورشة عنه، ولكنني اجلت الفكرة لاسباب اهم، وبالنسبة للملفات الكبيرة، فيجب ان لا تنسى ان الملفات الكبيرة مصممة من قطع صغيرة وبهمك للقطع السغيرة ستتمكن من تجميع القطعة الكبيرة الكاملة، ولكن تجميعها يحتاج الى وقت واتصال بالانترنت لمراجعة المعلومات، بالاضافة الى فهم ما يتم برمجته، وانصحك بعمل جولة حول تصميم السيارات، المحرك، نقل الحركة، نظام التعليق، الوزن وتوزعه وبعض الفيزيائيات المرتبطة بهذا المضوع وبدون شك ستصبح عملية تصميم السيارة افضل بكثير، فحركة السيارة في العالم الحقيقي تتعلق بكل تلك العوام.

                  بالنسبة لسؤالك عن النصائح، فأنا لست بموقع الناصح، انا لست محترف لليونيتي بل اعرف معلومات عن اقسام منه واتشارك هذه المعلومات، كما انني من عمرك يعني لا اسبقك في الخبرة وليس لي تجربة في عالم الالعاب حتى اشاركها، ولكن بحسب اطلاعي رأيت عدد من المطورين ينصح بدراسة اي فرع جامعي (متعلق بالحاسوب او غير متعلق بالحاسوب) بالاضافة الى تصميم الالعاب بشكل جانبي، حتى الوصول الى مرحلة قوية في تصميم الالعاب تمكنك من ترك مجالك الدراسي والعمل بمجال الالعاب، لأنه لا يوجد فرع جامعي يعلمك تصميم الالعاب، وحتى الفروع المتلعقة بالحاسوب جل ما تدرسه هي معلومات لا يمكنك تطبيقها بشكل مباشر على عكس الدورات التي قد تجدها في احد المعاهد الذي قد يعلمك اساسيات اي لغة برمجية في شهرين، ولكن الدافع الرئيسي للدراسة في الجامعة بنظرهم هو ان تصميم الالعاب والدخول في هذا المجال يحتاج الى خبرة كبيرة، وهذا الخبرة تحتاج الى وقت، ولكنك اثناء هذا الوقت تحتاج الى مال لمصاريفك اليومية، فببساطة تعمل بالفرع الذي درسته وفي وقت فراغك تعمل على برمجة الالعاب. في النهاية هذا رأي من ذوي الخبرة.

                  عل كل حال اذا احببت التكلم اكثر عن موضوع السيارات فالنقاش مفتوح وسيفيد الكثيرين بإذن الله، وسنحاول معاً البحث على اجابة اي سؤال .
                  عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

                  تعليق


                  • #10
                    اشكرك اخي محمد على الرد الرائع ،اعرف ان دراسة تطوير الالعاب طويلة جداً و ربما تحتاج خبرة كبيرة سابقة في مجالات مشابهه، بحثت عن جامعاترلتدريس تطوير الالعاب و اكثرها تكلفتها تتراوح بين 20 ال 30 الف دولار ،مبلغ كبير جداً، انا اكثر اوقاتي في اليونتي ابحث عن اجابات او مقالات توضح لي اكثر المفاهيم في المحرك، احياناً ايضع وقتي على اشياء ثم اجد انني اهملت اشياء اخرى، مشاريعي على يونتي 4 اعدت بنائها من الصفر في يونتي5 ،صحيح لتحظت التغيرات الكبيرة في المحرك من ناحية المكونات و طريقة عملها الى المتغيرات و الدوال و التغيرت التي اختلف استخادمها عن النسخة السابقة ،يومتي 5 ساعانا كثر و اختصر علي الوقت و خاصة و جود ال ui سهل علي الكثير، لكن دائماً عند انتهائي من شي احب انتقل الى الشي الآخر اعتماداً على خبرتي السابقة، مشروع السيارة في اليونتي ماحملتة من قبل لكن ان شاء الله راح احملة، اتمنى انك تكمل شرحك الرائع و كل كلمة تقولها هي مهمة لي جداً و استفيد من الكلام اكثر ،شكراً على كل شي تقدمة اخ محمد 😚
                    مدونتي Home OF Games تهتم بتطوير الألعاب
                    قناتي
                    YouTube

                    لو كان Internet Explorer شجاعاً لطلب منك ان يكون متصفحك الشخصي, فعليك ان تكون شجاعاً كفاية لتقوم بكل خطوة صعبة
                    .

                    تعليق

                    يعمل...
                    X