Pengontrol Pemain RTS dan MOBA untuk Unity

Dalam video game, istilah RTS adalah singkatan dari Real-time strategy.

Perbedaan antara RTS dan game First / Third Person shooter konvensional adalah bahwa karakter dikontrol menggunakan penunjuk tetikus, bukan menggunakan tombol W, A, S, dan D seperti biasa.

Pemain diberikan pandangan sekilas ke medan perang dengan kemampuan memberi perintah kepada pasukan, tanpa mengendalikan mereka secara langsung. Contoh game RTS adalah Warcraft, Starcraft, Cossack, dll.

Tangkapan layar gameplay Warcraft 3

Di sisi lain, MOBA adalah singkatan dari Multiplayer Online Battle Arena, ini adalah subgenre game RTS yang lebih baru di mana pemain hanya mengontrol satu karakter, bukan banyak karakter.

Contoh game tersebut adalah League of Legends dan Dota 2.

Dalam tutorial ini, saya akan menunjukkan cara membuat pengontrol bergaya RTS/MOBA di Unity.

Langkah 1: Mari buat skrip yang diperlukan

Tutorial ini cukup sederhana karena hanya memerlukan satu script saja.

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

Langkah 2

Sekarang mari kita siapkan pengontrol pemain dan level permainan.

  • Buat GameObject baru dan beri nama 'RTSPlayer'
  • Lampirkan skrip RTSPlayerController.cs ke dalamnya (CATATAN: Setelah melampirkan, secara otomatis akan menambahkan komponen lain yang disebut NavMeshAgent, komponen ini akan diperlukan nanti)

  • Tambahkan badan pemain (dalam kasus saya, saya akan menggunakan kapsul sederhana dengan kubus, tetapi Anda dapat menambahkan model pemain jika ada). Turunkan skalanya hingga ukuran yang diinginkan.
  • Pindahkan model pemutar ke dalam GameObject 'RTSPlayer' (CATATAN: Sebelum melakukan parenting, pastikan 'RTSPlayer' diletakkan di bagian bawah model pemutar)

  • Pilih 'RTSPlayer' dan di NavMeshAgent sesuaikan Radius dan Tinggi hingga cocok dengan model pemutar

  • Selanjutnya adalah membuat Indikator Target prefab. Ini hanyalah GameObject sederhana dengan Quad yang akan menunjukkan di mana kita mengklik peta.

Anda dapat menggunakan tekstur di bawah ini:

indikator target strategi real-time

  • Dan terakhir, pilih 'RTSPlayer' dan tetapkan semua variabel yang diperlukan dalam skrip RTSPlayerController:

Kamera Pemain - cukup jelas, ini bisa berupa kamera apa saja

Offset Kamera - seberapa jauh jarak kamera dari pemutar

Indikator Target Prefab - prefab yang baru saja kita buat

Saat berada dalam mode Putar, Anda akan melihat bahwa mengeklik peta tidak membuat pemain bergerak. Itu karena kita punya satu hal terakhir yang harus dilakukan, yaitu Memanggang Navigation Mesh (Navmesh):

  • Pilih semua objek yang merupakan bagian dari peta dan tandai sebagai objek statis:

  • Buka Jendela -> AI -> Navigasi

  • Di bawah tab Bake, ubah nilai Agent Radius dan Agent Height (nilai tersebut harus sesuai dengan nilai dari NavMeshAgent), lalu klik Bake.

  • Setelah Memanggang selesai, Anda akan melihat jaring bergaris kebiruan, yang mewakili area yang dapat dilalui dengan berjalan kaki.

CATATAN: Untuk mencegah pemain berjalan melewati perbukitan, kembali ke tab Bake dan turunkan sudut Max Slope lalu panggang kembali navmesh.

Jauh lebih baik!

Terakhir, kembali ke mode Putar dan klik kiri di suatu tempat pada peta.

Pemain sekarang harus bergerak menuju target sambil menghindari rintangan:

Sharp Coder Pemutar video

Tip: Sesuaikan nilai Kecepatan, Kecepatan Sudut, dan Akselerasi di NavMeshagent agar sesuai dengan kebutuhan Anda.

Artikel yang Disarankan
Tutorial Lompat Dinding 3D dan 2D Pemain untuk Unity
Tutorial Pengontrol Pemain Top-Down untuk Unity
Pengontrol Pemain Planetary berbasis benda kaku untuk Unity
Pengontrol Karakter Cara Menambahkan Kemampuan untuk Mendorong Benda Kaku di Unity
Sistem Dialog untuk Persatuan
Tutorial Senter untuk Unity
Menciptakan Pergerakan Pemain dalam Kesatuan