נתוני נשק
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 24 מתוך 64.
חרב ופטיש עושים אותו הדבר: הם מניפים, ממתינים ומניפים שוב. מה שמבדיל ביניהם הם המספרים. חרב גורמת נזק של 4 ומונפת כל 0.5 שניות, פטיש גורם נזק של 10 כל 1.5 שניות. לכן סקריפט Weapon אחד מתאים לשניהם, והמספרים של כל כלי נשק נשמרים בנכס:
[CreateAssetMenu(menuName = "Combat/Weapon Data")]
public class WeaponData : ScriptableObject
{
public string weaponName;
public int damage;
public float swingTime;
public GameObject hitEffect;
}public class Weapon : MonoBehaviour
{
public WeaponData data;
private float nextSwing;
public void Swing(Health target)
{
if (Time.time < nextSwing) return;
nextSwing = Time.time + data.swingTime;
target.TakeDamage(data.damage);
Instantiate(data.hitEffect, target.transform.position, Quaternion.identity);
}
}הפרויקט מכיל נכס של חרב (4, 0.5, פריפאב של ניצוץ) ונכס של פטיש (10, 1.5, פריפאב של אבק). גם האביר וגם העוגרת נושאים את הסקריפט Weapon; השדה data של האביר מכיל את החרב, וזה של העוגרת מכיל את הפטיש. חנית היא נכס נוסף שנוצר מתפריט Create, בלי לשנות אף סקריפט. נכס יכול להפנות לפריפאבים ולנכסים אחרים, כמו hitEffect, אבל לא לאובייקטים בסצנה: הוא נמצא בפרויקט, מחוץ לכל סצנה.
בשיטות האחרות ליצירת כלי נשק שונים, המספרים נמצאים בקוד. הביטוי if (weaponName == "Sword") damage = 4; else if ... הולך ומתארך עם כל כלי נשק, ומחלקת המשנה Sword של Weapon, שרק מגדירה מספרים, פירושה מחלקה נפרדת לכל נכס. מחלקות משנה מיועדות לכלי נשק שפועלים אחרת, כמו קשת שיורה חצים. כלי נשק שרק גורם נזק רב יותר או מונף מהר יותר צריך נכס משלו, בלי צורך בקוד.
אתגר
בינונידאג שכל כלי ירייה יקרא את הנתונים שלו מנכס ה־GunData שלו.
- ב־
Gun, הוסףpublic GunData data;. - ירה באמצעות
data.bulletPrefab, המתןdata.fireIntervalבין ירייה לירייה והקצה לכל קליעdata.damage. - מחק את
gunType, את שני שדות הקליעים, את שלושת העותקים הפרטיים ואתStart().
לחץ על ״שחק״ והחזק את מקש הרווח: גם רובה האנרגיה יורה. לאחר מכן לחץ על ״בדיקה״.
נסו בעצמכם
using UnityEngine;
using UnityEngine.InputSystem;
public class Gun : MonoBehaviour
{
public string gunType = "Pistol";
public GameObject pistolBullet;
public GameObject rifleBullet;
private GameObject bulletPrefab;
private float fireInterval;
private int damage;
private float nextShot;
void Start()
{
if (gunType == "Pistol")
{
bulletPrefab = pistolBullet;
fireInterval = 0.25f;
damage = 1;
}
else if (gunType == "Rifle")
{
bulletPrefab = rifleBullet;
fireInterval = 0.6f;
damage = 4;
}
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && Time.time >= nextShot)
{
nextShot = Time.time + fireInterval;
GameObject bullet = Instantiate(bulletPrefab, transform.position + transform.forward, transform.rotation);
bullet.GetComponent<Bullet>().damage = damage;
}
}
}
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווח5ScriptableObjects
נכסי נתוניםנתוני נשקהגדרות משותפותהצילו את הרוחגלים כנתוניםסיכום: מסד נתונים של פריטיםסיכום: קנייה בחנותתרגלו בעצמכם: Unity אונליין