Unity için RTS ve MOBA Player Controller

Video oyunlarında RTS terimi Gerçek zamanlı strateji anlamına gelir.

RTS ile geleneksel Birinci/Üçüncü Şahıs nişancı oyunları arasındaki fark, karakterlerin normal W, A, S ve D düğmeleri yerine fare işaretçisi kullanılarak kontrol edilmesidir.

Oyuncuya, birliklere doğrudan kontrol etmeden emir verme yeteneği ile savaş alanının kartal gözü görünümü verilir. RTS oyunlarına örnek olarak Warcraft, Starcraft, Cossacks vb. verilebilir.

Warcraft 3 oynanış ekran görüntüsü

Öte yandan, MOBA, Çok Oyunculu Çevrimiçi Savaş Arenası anlamına gelir; oyuncunun birçok yerine yalnızca bir karakteri kontrol ettiği RTS oyunlarının biraz daha yeni bir alt türüdür.

Bu tür oyunlara örnek olarak League of Legends ve Dota 2 verilebilir.

Bu eğitimde Unity'te RTS/MOBA tarzı bir denetleyicinin nasıl oluşturulacağını göstereceğim.

Adım 1: Gerekli komut dosyalarını oluşturalım

Bu eğitim oldukça basittir çünkü yalnızca bir komut dosyası gerektirir.

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);
            }
        }
    }
}

Adım 2

Şimdi bir oyuncu kontrolörü ve oyun seviyesi ayarlayalım.

  • Yeni bir GameObject oluşturun ve onu çağırın 'RTSPlayer'
  • RTSPlayerController.cs betiğini buna ekleyin (NOT: Ekledikten sonra otomatik olarak NavMeshAgent adlı başka bir bileşeni ekleyecektir, bu bileşene daha sonra ihtiyaç duyulacaktır)

  • Bir oyuncu gövdesi ekleyin (benim durumumda küp içeren basit bir kapsül kullanacağım, ancak eğer varsa bir oyuncu modeli ekleyebilirsiniz). İstediğiniz boyuta gelinceye kadar küçültün.
  • Oyuncu modelini 'RTSPlayer' GameObject'in içine taşıyın (NOT: Ebeveynlik yapmadan önce, 'RTSPlayer''nın oyuncu modelinin altına yerleştirildiğinden emin olun)

  • 'RTSPlayer''yı seçin ve NavMeshAgent'ta, oyuncu modeliyle eşleşene kadar Yarıçap ve Yükseklik ayarını yapın

  • Sonraki hedef Göstergesi prefab oluşturmaktır. Bu sadece haritada nereye tıkladığımızı gösteren Dörtlü basit bir GameObject'tir.

Aşağıdaki dokuyu kullanabilirsiniz:

gerçek zamanlı strateji hedef göstergesi

  • Ve son olarak 'RTSPlayer''yı seçin ve RTSPlayerController betiğinde gerekli tüm değişkenleri atayın:

Oyuncu Kamerası - açıklayıcıdır, bu herhangi bir kamera olabilir

Kamera Ofseti - kameranın oynatıcıdan ne kadar uzakta olması gerektiği

Hedef Göstergesi Prefabrik - az önce oluşturduğumuz prefabrik

Oyun modundayken haritaya tıklamanın oynatıcıyı hareket ettirmediğini fark edeceksiniz. Çünkü yapacak son bir şeyimiz var, o da Navigasyon Ağı (Navmesh) Pişirmek:

  • Haritanın parçası olan tüm nesneleri seçin ve bunları statik olarak işaretleyin:

  • Pencereye Git -> AI -> Gezinme

  • Fırında sekmesi altında Ajan Yarıçapı ve Ajan Yüksekliği değerlerini değiştirin (bunlar NavMeshAgent'taki değerlerle eşleşmelidir), ardından Fırına tıklayın.

  • Pişirme işlemi bittikten sonra yürünebilir alanı temsil eden mavimsi çerçeveli bir ağ göreceksiniz.

NOT: Oyuncunun tepelerin üzerinden geçmesini önlemek için Pişirme sekmesine geri dönün ve Maksimum Eğim açısını azaltın, ardından navmesh'i yeniden pişirin.

Çok daha iyi!

Son olarak Oynatma moduna geri dönün ve haritada bir yere sol tıklayın.

Oyuncu artık engellerden kaçınarak hedefe doğru hareket etmelidir:

Sharp Coder Video oynatıcı

İpucu: NavMeshagent'ta Hızı, Açısal Hızı ve Hızlanma değerini ihtiyaçlarınıza uyacak şekilde ayarlayın.

Önerilen Makaleler
Unity için Yukarıdan Aşağıya Oyuncu Kontrol Eğiticisi
Unity için 3D Solucan Denetleyici Eğitimi
Unity için Rigidbody Tabanlı Planet Oynatıcı Denetleyicisi
Unity için 2D Karakter Kontrol Cihazı
Unity'de Mobil Dokunmatik Giriş Joystick'i
Unity için Helikopter Kontrolörü
Unity'de 2D Platformer Karakter Denetleyicisine Double Jump Desteği Ekleme