בקר נגן RTS ו-MOBA עבור Unity
במשחקי וידאו, המונח RTS מייצג אסטרטגיה בזמן אמת.
ההבדל בין RTS למשחקי יריות רגילים בגוף ראשון/שלישי הוא שהדמויות נשלטות באמצעות מצביע העכבר ולא בכפתורי W, A, S ו-D הרגילים.
השחקן מקבל מבט מעין נשר של שדה הקרב עם יכולת לתת פקודות לחיילים, מבלי לשלוט בהם ישירות. דוגמאות למשחקי RTS הם Warcraft, Starcraft, Cosacks וכו'.
מצד שני, MOBA מייצג Multiplayer Online Battle Arena, זה תת-ז'אנר קצת יותר חדש של משחקי RTS שבו השחקן שולט רק בדמות אחת במקום רבות.
דוגמאות למשחקים כאלה הם League of Legends ודוטה 2.
במדריך זה, אני אראה כיצד ליצור בקר בסגנון RTS/MOBA ב-Unity.
שלב 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);
}
}
}
}
שלב 2
עכשיו בואו נגדיר בקר שחקן ורמת משחק.
- צור GameObject חדש וקרא לו 'RTSPlayer'
- צרף אליו את הסקריפט RTSPlayerController.cs (הערה: לאחר החיבור, הוא יוסיף אוטומטית רכיב נוסף בשם NavMeshAgent, רכיב זה יהיה צורך מאוחר יותר)
- הוסף גוף שחקן (במקרה שלי אני אשתמש בקפסולה פשוטה עם קוביה, אבל אתה יכול להוסיף דגם נגן אם יש לך כזה). הגדל אותו עד לגודל הרצוי.
- הזז את דגם הנגן בתוך 'RTSPlayer' GameObject (הערה: לפני ההורות, ודא ש-'RTSPlayer' ממוקם בתחתית דגם הנגן)
- בחר 'RTSPlayer' וב-NavMeshAgent כוונן את הרדיוס והגובה עד שיתאימו לדגם הנגן
- הבא הוא ליצור אינדיקטור יעד prefab. זהו רק GameObject פשוט עם Quad שיציין היכן לחצנו על המפה.
אתה יכול להשתמש במרקם שלהלן:
- ולבסוף, בחר 'RTSPlayer' והקצה את כל המשתנים הדרושים בסקריפט RTSPlayerController:
Player Camera - מובן מאליו, זו יכולה להיות כל מצלמה
היסט מצלמה - כמה רחוק המצלמה צריכה להיות מהנגן
Target Indicator Prefab - הקדם שיצרנו זה עתה
במצב הפעלה, תבחין שלחיצה על המפה לא גורמת לשחקן לזוז. זה בגלל שיש לנו דבר אחרון לעשות, זה לאפות רשת ניווט (Navmesh):
- בחר את כל האובייקטים שהם חלק מהמפה וסמן אותם סטטיים:
- עבור אל חלון -> AI -> ניווט
- בכרטיסייה אפייה שנה את הערכים של רדיוס סוכן וגובה סוכן (אלה צריכים להתאים לערכים מ-NavMeshAgent), ולאחר מכן לחץ על אפייה.
- לאחר סיום האפייה תבחין ברשת מתארת בכחלחל, המייצגת את האזור הניתן להליכה.
הערה: כדי למנוע מהשחקן ללכת על הגבעות, חזור ללשונית האפייה והקטין את זווית השיפוע המקסימלי ואז אפה מחדש את ה-navmesh.
הרבה יותר טוב!
לבסוף, חזור למצב הפעלה ולחץ שמאל במקום כלשהו במפה.
השחקן צריך כעת לנוע לעבר המטרה תוך הימנעות מהמכשולים:
טיפ: כוונון מהירות, מהירות זוויתית ותאוצה ב-NavMeshagent כדי להתאים לצרכים שלך.