רכיבים קטנים
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 1 מתוך 50.
אובייקט משחק הוא רשימה של רכיבים, וכל סקריפט שאתה כותב הוא רכיב נוסף. משחקי 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 לערכו הקודם בכל פריים ויבטל את הקפיצה.
אתגר
קלBoat.cs עושה שלושה דברים בבת אחת: החצים (הפעולה Move) מנווטים את הסירה, הסירה מתנדנדת על הגלים, והמנורה שלה מהבהבת. גם הברווז זקוק להתנדנדות, והמצוף זקוק להתנדנדות ולהבהוב, ולכן הסצנה כבר מעניקה להם את הרכיבים Bobber ו-Blinker, ולסירה יש את שלושתם. פצלו את Boat.cs ביניהם:
- Bobber: כל אובייקט מתנדנד סביב הגובה שבו הוא מתחיל,
heightיחידות למעלה ולמטה, במהירותspeedמשלו (ה-Inspector מגדיר את שניהם). Bobber משנה רק את ערך ה-y של המיקום, כך שהסירה עדיין יכולה לנווט. - Blinker: הוא מדליק ומכבה את
lamp(רכיב Renderer) בכלintervalשניות. - Boat שומרת רק על הניווט: מחקו את ההתנדנדות ואת ההבהוב, יחד עם השדות שלהם.
לחצו על Play ונווטו את הסירה בסביבה, ואז לחצו על Check.
נסו בעצמכם
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי