यूनिटी के लिए RTS और MOBA प्लेयर कंट्रोलर
वीडियो गेम में, आरटीएस शब्द का अर्थ वास्तविक समय की रणनीति है।
RTS और पारंपरिक फर्स्ट/थर्ड पर्सन शूटर गेम के बीच अंतर यह है कि पात्रों को सामान्य W, A, S और D बटन के बजाय माउस पॉइंटर का उपयोग करके नियंत्रित किया जाता है।
खिलाड़ी को सीधे तौर पर सैनिकों को नियंत्रित किए बिना, उन्हें आदेश देने की क्षमता के साथ युद्ध के मैदान का ईगल-आई दृश्य दिया जाता है। RTS गेम्स के उदाहरण Warcraft, Starcraft, Cossacks आदि हैं।
दूसरी ओर, MOBA का मतलब मल्टीप्लेयर ऑनलाइन बैटल एरेना है, यह आरटीएस गेम्स की कुछ नई उपशैली है जहां खिलाड़ी कई के बजाय सिर्फ एक चरित्र को नियंत्रित करता है।
ऐसे खेलों के उदाहरण लीग ऑफ लीजेंड्स और Dota 2 हैं।
इस ट्यूटोरियल में, मैं दिखाऊंगा कि Unity में RTS/MOBA-स्टाइल कंट्रोलर कैसे बनाया जाए।
चरण 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);
}
}
}
}
चरण दो
आइए अब एक प्लेयर कंट्रोलर और गेम लेवल सेट करें।
- एक नया गेमऑब्जेक्ट बनाएं और उसे कॉल करें 'RTSPlayer'
- इसमें RTSPlayerController.cs स्क्रिप्ट संलग्न करें (नोट: संलग्न करने पर, यह स्वचालित रूप से NavMeshAgent नामक एक अन्य घटक जोड़ देगा, इस घटक की बाद में आवश्यकता होगी)
- एक प्लेयर बॉडी जोड़ें (मेरे मामले में मैं cube के साथ एक साधारण कैप्सूल का उपयोग करूंगा, लेकिन यदि आपके पास कोई प्लेयर मॉडल है तो आप उसे जोड़ सकते हैं)। इसे वांछित आकार तक स्केल करें।
- प्लेयर मॉडल को 'RTSPlayer' गेमऑब्जेक्ट के अंदर ले जाएं (नोट: पेरेंटिंग से पहले, सुनिश्चित करें कि 'RTSPlayer' को प्लेयर मॉडल के नीचे रखा गया है)
- 'RTSPlayer' चुनें और NavMeshAgent में त्रिज्या और ऊँचाई को तब तक घुमाएँ जब तक यह प्लेयर मॉडल से मेल न खा जाए
- अगला लक्ष्य संकेतक prefab बनाना है। यह क्वाड के साथ एक साधारण गेमऑब्जेक्ट है जो इंगित करेगा कि हमने मानचित्र पर कहां क्लिक किया है।
आप नीचे दी गई बनावट का उपयोग कर सकते हैं:
- और अंत में, 'RTSPlayer' चुनें और RTSPlayerController स्क्रिप्ट में सभी आवश्यक वेरिएबल असाइन करें:
प्लेयर कैमरा - स्वतः स्पष्ट है, यह कोई भी कैमरा हो सकता है
कैमरा ऑफसेट - कैमरा प्लेयर से कितनी दूरी पर होना चाहिए
लक्ष्य संकेतक प्रीफ़ैब - वह प्रीफ़ैब जो हमने अभी बनाया है
प्ले मोड में रहते हुए, आप देखेंगे कि मानचित्र पर क्लिक करने से खिलाड़ी हिलता नहीं है। ऐसा इसलिए है क्योंकि हमें एक आखिरी काम करना है, जो है एक नेविगेशन मेश (नवमेश) बेक करना:
- उन सभी वस्तुओं का चयन करें जो मानचित्र का हिस्सा हैं और उन्हें स्थिर चिह्नित करें:
- विंडो -> एआई -> नेविगेशन पर जाएं
- बेक टैब के अंतर्गत एजेंट रेडियस और एजेंट हाइट के मान बदलें (उन्हें NavMeshAgent के मानों से मेल खाना चाहिए), फिर बेक पर क्लिक करें।
- बेकिंग समाप्त होने के बाद आप एक नीले रंग की रूपरेखा वाली जाली देखेंगे, जो चलने योग्य क्षेत्र का प्रतिनिधित्व करती है।
नोट: खिलाड़ी को पहाड़ियों पर चलने से रोकने के लिए, बेक टैब पर वापस जाएँ और अधिकतम ढलान कोण को कम करें और फिर नवमेश को दोबारा बेक करें।
काफी बेहतर!
अंत में, प्ले मोड पर वापस जाएं और मानचित्र पर कहीं बायाँ-क्लिक करें।
खिलाड़ी को अब बाधाओं से बचते हुए लक्ष्य की ओर बढ़ना चाहिए:
युक्ति: अपनी आवश्यकताओं के अनुरूप NavMeshagent पर गति, कोणीय गति और त्वरण मान में बदलाव करें।