Menu
CoddyTech

Числа с плавающей точкой и Mathf

Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 9 из 67.

В Unity используются значения типа float: координаты, скорости, углы и Time.deltaTime — всё это числа с плавающей точкой. 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 — версию Math для float в Unity (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 без потери точности.

challenge icon

Задание

Легко

Сердце должно пульсировать: его размер меняется от 1 до 1.5 и обратно три раза в секунду, одинаково по каждой оси. Скрипт не компилируется. Исправь ошибки в вычислениях с числами с плавающей точкой в 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);
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы скриптинга в Unity