Menu
CoddyTech

רכיבים קטנים

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

אובייקט משחק הוא רשימה של רכיבים, וכל סקריפט שאתה כותב הוא רכיב נוסף. משחקי Unity נבנים על ידי מתן משימה אחת לכל סקריפט והצבה של כמה סקריפטים על אובייקט. התנועה, הירי ונקודות החיים של שחקן יכולים להיות כולם בתוך PlayerController אחד, אבל כרכיבים נפרדים, Mover,‏ Shooter ו־Health, כל אחד מהם יכול להיות גם על אובייקטים אחרים:

public class Health : MonoBehaviour
{
    public int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
  • שחקן: Mover, Shooter, Health
  • צריח: Shooter, Health
  • ארגז: Health

עם מחלקות C# רגילות, ייתכן שתבנה במקום זאת עץ: Character, אחר כך ShootingCharacter : Character, ואז Player : ShootingCharacter. צריח יורה אבל אף פעם לא הולך, וארגז רק נשבר, לכן כל סוג חדש של אובייקט מחייב שינוי של מבנה העץ. עם רכיבים, סוג חדש של אובייקט הוא שילוב חדש של סקריפטים קיימים, שמרכיבים יחד ב־Inspector, ולכל סקריפט יכולים להיות שם ערכים משלו: Mover איטי על אובייקט אחד, ומהיר על אחר.

רכיבים שעל אותו אובייקט חולקים את ה־Transform שלו, לכן כל אחד מהם צריך לשנות רק את החלק שבאחריותו. Mover שמוסיף ל־x ול־z באמצעות transform.position += משאיר את y ללא שינוי, כך ש־Jumper באותו אובייקט עדיין יכול לשנות את הגובה. Mover שקובע את כל המיקום ל־new Vector3(x, 0.5f, z) יחזיר את y לערכו הקודם בכל פריים ויבטל את הקפיצה.

challenge icon

אתגר

קל

פצלו את Boat.cs כך שכל סקריפט יבצע משימה אחת.

  1. העבירו את התנועה מעלה ומטה אל Bobber: הגדירו את startY בתוך Start(), את התנועה מעלה ומטה בתוך Update(), והשתמשו ב-height וב-speed משלו.
  2. העבירו את ההבהוב אל Blinker, עם טיימר משלו.
  3. מחקו את שתי המשימות ואת השדות שלהן מתוך Boat, כך שהוא ינווט בלבד.

לחצו על "שחק": הברווז עולה ויורד, המצוף מהבהב, והסירה מנווטת. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

using UnityEngine;
using UnityEngine.InputSystem;

// סקריפט אחד, שלוש פעולות: היגוי, נענוע והבהוב.
public class Boat : MonoBehaviour
{
    public float speed = 3f;
    public float bobHeight = 0.1f;
    public float bobSpeed = 2f;
    public Renderer lamp;
    public float blinkInterval = 0.5f;

    private InputAction moveAction;
    private float startY;
    private float blinkTimer;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        startY = transform.position.y;
    }

    void Update()
    {
        // היגוי
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;

        // נענוע
        Vector3 p = transform.position;
        p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
        transform.position = p;

        // הבהוב
        blinkTimer += Time.deltaTime;
        if (blinkTimer >= blinkInterval)
        {
            blinkTimer -= blinkInterval;
            lamp.enabled = !lamp.enabled;
        }
    }
}

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

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