Menu
CoddyTech

נתוני נשק

חלק מהיחידה ארכיטקטורת משחקים ב-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, שרק מגדירה מספרים, פירושה מחלקה נפרדת לכל נכס. מחלקות משנה מיועדות לכלי נשק שפועלים אחרת, כמו קשת שיורה חצים. כלי נשק שרק גורם נזק רב יותר או מונף מהר יותר צריך נכס משלו, בלי צורך בקוד.

challenge icon

אתגר

בינוני

דאג שכל כלי ירייה יקרא את הנתונים שלו מנכס ה־GunData שלו.

  1. ב־Gun, הוסף public GunData data;.
  2. ירה באמצעות data.bulletPrefab, המתן data.fireInterval בין ירייה לירייה והקצה לכל קליע data.damage.
  3. מחק את 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

תרגלו בעצמכם: Unity אונליין