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.
Ö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:
- 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:
İpucu: NavMeshagent'ta Hızı, Açısal Hızı ve Hızlanma değerini ihtiyaçlarınıza uyacak şekilde ayarlayın.