Floats ו-Mathf
חלק מהיחידה יסודות התכנות ב-Unity במסלול ה-Unity של Coddy. שיעור 9 מתוך 67.
Unity משתמשת ב-float לספירת ערכים: מיקומים, מהירויות, זוויות ו-Time.deltaTime הם כולם מסוג float. C# מפרשת את 0.5 כ-double ולא תמיר double ל-float בלי הוראה מפורשת, כי עלול להיגרם אובדן דיוק. כמעט בכל אחד מהסקריפטים הראשונים של מתחילים, שתי שגיאות קומפילציה נובעות מכך:
float half = 0.5;גורם לשגיאהCS0664: Literal of type double cannot be implicitly converted to type 'float'; use an 'F' suffix.float s = Math.Sin(x);גורם לשגיאהCS0266: Cannot implicitly convert type 'double' to 'float', כיSystem.Mathפועלת עם double.
הפתרונות: כתבו ערכי float עם הסיומת f, והשתמשו ב-Mathf, גרסת ה-float של Unity ל-Math (Mathf.Sin, Mathf.Abs, Mathf.Sqrt, Mathf.PI). המצוף המתנדנד הזה נכשל בגלל שתי השגיאות, והקומפילציה מצליחה לאחר התיקון:
// לפני: float y = 1 + Math.Sin(Time.time * 2) * 0.5;
float y = 1 + Mathf.Sin(Time.time * 2) * 0.5f;
transform.position = new Vector3(0, y, 0);מספרים שלמים כמו 1 ו-2 אינם זקוקים לסיומת: int הופך ל-float ללא אובדן דיוק.
אתגר
קלהלב אמור לפעום: הגודל שלו עולה מ־1 עד 1.5 וחוזר, שלוש פעמים בשנייה, באופן זהה בכל ציר. הסקריפט לא מתקמפל. תקן את השגיאות בחישובים עם float של Unity, ושמור על אותה נוסחה.
לחץ על Play כדי לראות את השגיאות ב־Console, תקן אותן ואז לחץ על Check.
נסו בעצמכם
using System;
using UnityEngine;
public class Pulse : MonoBehaviour
{
void Update()
{
float size = 1 + Math.Abs(Math.Sin(Time.time * 3)) * 0.5;
transform.localScale = new Vector3(size, size, size);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות התכנות ב-Unity
1הסקריפט הראשון שלך
שלום, Unityהצב את הקובייהזוז בכל פרייםהסתובב בכל שנייהנווט בעזרת המקשיםסיכום: נהג בקובייה4וקטורים
חיבור וקטוריםכיווניםמרחב מקומי ומרחב עולמימהירות אלכסוניתהמרחק בין עצמיםVector3 הוא מבנה נתוניםסיכום: הטסת רחפן10מחזור החיים של הסקריפט
Awake ו-StartUpdate ו-LateUpdateOnEnable ו-OnDisableסדר מחזור החייםסיכום: מתעד מחזור החיים