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.
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:
- 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:
Tip: Sesuaikan nilai Kecepatan, Kecepatan Sudut, dan Akselerasi di NavMeshagent agar sesuai dengan kebutuhan Anda.