وحدة تحكم مشغل RTS وMOBA لـ Unity

في ألعاب الفيديو، يشير مصطلح RTS إلى استراتيجية الوقت الفعلي.

الفرق بين RTS وألعاب إطلاق النار التقليدية من منظور الشخص الأول / الثالث هو أنه يتم التحكم في الشخصيات باستخدام مؤشر الماوس بدلاً من أزرار W وA وS وD المعتادة.

يُمنح اللاعب رؤية شاملة لساحة المعركة مع القدرة على إصدار الأوامر للقوات، دون التحكم بهم بشكل مباشر. من أمثلة ألعاب RTS Warcraft وStarcraft وCossacks وما إلى ذلك.

لقطة شاشة للعبة Warcraft 3

من ناحية أخرى، يشير MOBA إلى Multiplayer Online Battle Arena، وهو نوع فرعي أحدث إلى حد ما من ألعاب RTS حيث يتحكم اللاعب في شخصية واحدة فقط بدلاً من العديد.

ومن أمثلة هذه الألعاب League of Legends وDota 2.

في هذا البرنامج التعليمي، سأوضح كيفية إنشاء وحدة تحكم بنمط RTS/MOBA في Unity.

الخطوة 1: لنقم بإنشاء البرنامج النصي (البرامج النصية) الضرورية

هذا البرنامج التعليمي بسيط للغاية، لأنه يتطلب برنامج نصي واحد فقط.

RTSPlayerController.cs

//You are free to use this script in Free or Commercial projects
//sharpcoderblog.com @2018

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]

public class RTSPlayerController : MonoBehaviour
{
    public Camera playerCamera;
    public Vector3 cameraOffset;
    public GameObject targetIndicatorPrefab;
    NavMeshAgent agent;
    GameObject targetObject;

    // Use this for initialization
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        //Instantiate click target prefab
        if (targetIndicatorPrefab)
        {
            targetObject = Instantiate(targetIndicatorPrefab, Vector3.zero, Quaternion.identity) as GameObject;
            targetObject.SetActive(false);
        }
    }

    // Update is called once per frame
    void Update()
    {
#if (UNITY_ANDROID || UNITY_IOS || UNITY_WP8 || UNITY_WP8_1) && !UNITY_EDITOR
            //Handle mobile touch input
            for (var i = 0; i < Input.touchCount; ++i)
            {
                Touch touch = Input.GetTouch(i);

                if (touch.phase == TouchPhase.Began)
                {
                    MoveToTarget(touch.position);
                }
            }
#else
        //Handle mouse input
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            MoveToTarget(Input.mousePosition);
        }
#endif

        //Camera follow
        playerCamera.transform.position = Vector3.Lerp(playerCamera.transform.position, transform.position + cameraOffset, Time.deltaTime * 7.4f);
        playerCamera.transform.LookAt(transform);
    }

    void MoveToTarget(Vector2 posOnScreen)
    {
        //print("Move To: " + new Vector2(posOnScreen.x, Screen.height - posOnScreen.y));

        Ray screenRay = playerCamera.ScreenPointToRay(posOnScreen);

        RaycastHit hit;
        if (Physics.Raycast(screenRay, out hit, 75))
        {
            agent.destination = hit.point;

            //Show marker where we clicked
            if (targetObject)
            {
                targetObject.transform.position = agent.destination;
                targetObject.SetActive(true);
            }
        }
    }
}

الخطوة 2

الآن لنقم بإعداد وحدة تحكم اللاعب ومستوى اللعبة.

  • قم بإنشاء GameObject جديد وقم بتسميته 'RTSPlayer'
  • قم بإرفاق البرنامج النصي RTSPlayerController.cs به (ملاحظة: عند الإرفاق، سيضيف تلقائيًا مكونًا آخر يسمى NavMeshAgent، وستكون هناك حاجة إلى هذا المكون لاحقًا)

  • أضف جسم اللاعب (في حالتي سأستخدم كبسولة بسيطة تحتوي على مكعب، ولكن يمكنك إضافة نموذج لاعب إذا كان لديك أي نموذج). قم بتقليصه حتى الحجم المطلوب.
  • انقل نموذج اللاعب داخل كائن اللعبة 'RTSPlayer' (ملاحظة: قبل تربية الأبناء، تأكد من وضع 'RTSPlayer' في الجزء السفلي من نموذج اللاعب)

  • حدد 'RTSPlayer' وفي NavMeshAgent قم بتعديل نصف القطر والارتفاع حتى يتطابق مع نموذج المشغل

  • التالي هو إنشاء مؤشر الهدف الجاهزة. هذا مجرد كائن GameObject بسيط به رباعية تشير إلى المكان الذي نقرنا عليه على الخريطة.

يمكنك استخدام الملمس أدناه:

مؤشر الهدف الاستراتيجي في الوقت الحقيقي

  • وأخيرًا، حدد 'RTSPlayer' وقم بتعيين كافة المتغيرات الضرورية في البرنامج النصي RTSPlayerController:

كاميرا المشغل - لا تحتاج إلى شرح، يمكن أن تكون أي كاميرا

إزاحة الكاميرا - إلى أي مدى يجب أن تكون الكاميرا من المشغل

الهدف المؤشر الجاهز - المبنى الجاهز الذي أنشأناه للتو

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

  • حدد كافة الكائنات التي تشكل جزءًا من الخريطة وقم بوضع علامة عليها ثابتة:

  • انتقل إلى النافذة -> الذكاء الاصطناعي -> التنقل

  • ضمن علامة التبويب "خبز"، قم بتغيير قيم Agent Radius وAgent Height (يجب أن تتطابق هذه القيم مع القيم من NavMeshAgent)، ثم انقر فوق Bake.

  • بعد الانتهاء من الخبز، ستلاحظ شبكة محددة باللون الأزرق، والتي تمثل المنطقة التي يمكن المشي فيها.

ملاحظة: لمنع اللاعب من المشي فوق التلال، ارجع إلى علامة التبويب "خبز" وقم بتقليل زاوية "أقصى ميل" ثم أعد تشغيل شبكة التنقل.

أفضل بكثير!

أخيرًا، ارجع إلى وضع التشغيل وانقر بزر الماوس الأيسر في مكان ما على الخريطة.

يجب على اللاعب الآن التحرك نحو الهدف مع تجنب العوائق:

Sharp Coder مشغل فديوهات

نصيحة: قم بتعديل السرعة والسرعة الزاوية وقيمة التسريع في NavMeshagent لتناسب احتياجاتك.