רכיבים קטנים
חלק מהיחידה ארכיטקטורת משחקים ב-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 לערכו הקודם בכל פריים ויבטל את הקפיצה.
אתגר
קלפצלו את Boat.cs כך שכל סקריפט יבצע משימה אחת.
- העבירו את התנועה מעלה ומטה אל
Bobber: הגדירו אתstartYבתוךStart(), את התנועה מעלה ומטה בתוךUpdate(), והשתמשו ב-heightוב-speedמשלו. - העבירו את ההבהוב אל
Blinker, עם טיימר משלו. - מחקו את שתי המשימות ואת השדות שלהן מתוך
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין