Menu
CoddyTech

נתוני נשק

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 20 מתוך 50.

חרב ופטיש עושים את אותו הדבר: הם מתנדנדים, ממתינים ומתנדנדים שוב. מה שמבדיל ביניהם הם המספרים. חרב גורמת 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);
    }
}

הפרויקט מכיל נכס Sword (4, 0.5, פריפאב של ניצוץ) ונכס Hammer (10, 1.5, פריפאב של אבק). גם האביר וגם העוגר נושאים את הסקריפט Weapon; השדה data של האביר מכיל את Sword, ושל העוגר את Hammer. חנית היא נכס נוסף שנוצר מתפריט Create, בלי לשנות שום סקריפט. נכס יכול להפנות לפריפאבים ולנכסים אחרים, כפי שעושה hitEffect, אבל לא לאובייקטים בסצנה: הוא נמצא בפרויקט, מחוץ לכל סצנה.

בשיטות האחרות ליצירת כלי נשק שונים, המספרים נמצאים בקוד. if (weaponName == "Sword") damage = 4; else if ... הולך ומתארך עם כל נשק, ומחלקת משנה Sword של Weapon שרק קובעת מספרים היא מחלקה נפרדת לכל נכס. מחלקות משנה מיועדות לכלי נשק שמתנהגים אחרת, כמו קשת שיורה חצים. נשק שרק פוגע חזק יותר או מתנדנד מהר יותר צריך נכס משלו ולא צריך קוד.

challenge icon

אתגר

בינוני

במטווח יש ארבעה רובים: שני אקדחים, רובה אחד ובלסטר חדש. לחיצה ממושכת על Space יורה בכולם. הסקריפט Gun בוחר את הקליע, את מרווח הירי ואת הנזק באמצעות if/else לפי gunType, והבלסטר לא נכלל בו, ולכן הוא לא יורה (בדוק את ה-Console).

גרום לכל רובה לקרוא את הערכים שלו מנכס במקום זאת. הקובץ GunData.cs מוכן, ובפרויקט יש נכסי Pistol, Rifle ו-Blaster שנוצרו ממנו, ולכל אחד מהם prefab קליע משלו.

  • הוסף ל-Gun שדה ציבורי בשם data מסוג GunData; ב-Inspector משייכים לכל רובה את הנכס שלו.
  • ירה את data.bulletPrefab, המתן data.fireInterval בין ירייה לירייה, ותן לכל קליע את data.damage.
  • הסר את gunType, את שני שדות הקליעים, את העותקים הפרטיים ואת ה-if/else.

לחץ על Play והחזק את Space, ואז לחץ על Check.

נסו בעצמכם

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;
        }
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity