Menu
CoddyTech

Liczby zmiennoprzecinkowe i Mathf

Część sekcji Podstawy skryptów w Unity ścieżki Unity w Coddy. Lekcja 9 z 67.

Unity używa typu float: pozycje, prędkości, kąty i Time.deltaTime to wartości typu float. C# odczytuje 0.5 jako double i nie przekształci double na float bez wyraźnego polecenia, ponieważ mogłoby to spowodować utratę precyzji. W niemal każdym z pierwszych skryptów początkującego pojawiają się z tego powodu dwa błędy kompilacji:

  • float half = 0.5; powoduje błąd CS0664: Literal of type double cannot be implicitly converted to type 'float'; use an 'F' suffix.
  • float s = Math.Sin(x); powoduje błąd CS0266: Cannot implicitly convert type 'double' to 'float', ponieważ System.Math działa na wartościach typu double.

Rozwiązania: zapisuj literały typu float z sufiksem f i używaj Mathf — wersji Math dla typu float w Unity (Mathf.Sin, Mathf.Abs, Mathf.Sqrt, Mathf.PI). Ten skrypt kołyszącej się boi powodował oba błędy, a po zmianie kompiluje się:

// przed: 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);

Liczby całkowite, takie jak 1 i 2, nie wymagają sufiksu: wartość typu int można przekształcić na float bez żadnej utraty.

challenge icon

Wyzwanie

Łatwy

Serce powinno pulsować: jego rozmiar zmienia się od 1 do 1.5 i z powrotem, trzy razy na sekundę, tak samo na każdej osi. Skrypt się nie kompiluje. Napraw błędy związane z operacjami matematycznymi na liczbach float w Unity i zachowaj ten sam wzór.

Naciśnij Play, aby zobaczyć błędy w konsoli, napraw je, a następnie naciśnij Check.

Spróbuj swoich sił

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);
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy skryptów w Unity