Блог программиста
Математика Unity (Урок 5). Mathf квадратный корень, модуль, наименьшее и наибольшее значения.
05.07.2013Математика Unity

В этом уроке мы рассмотрим простые, но довольно полезные функции. На этот раз обойдёмся без определений, и перейдём сразу к функциям в Unity3D.

Квадратный корень и его применение

Извлечь квадратный корень из числа в Unity (C#) можно так:
Mathf.Sqrt(float f)		//Квадратный корень

Данная функция возвращает арифметический квадратный корень, то есть неотрицательное значение.

В играх его можно применить, например, для определения расстояния до объекта.

Нам известно расстояние от врага до игрока по оси X и Z (или можем узнать).
По теореме Пифагора мы можем найти квадрат гипотенузы, то есть квадрат расстояния от врага до игрока. После чего извлекаем квадратный корень.
Немного кода:
using UnityEngine;
public class DistanceCalc : MonoBehaviour {
     
    //Цель, расстояние до которой надо найти
    public Transform target;        
     
    // Use this for initialization
    void Start ()
    {
        if(target == null) return;
        //Находим расстояние по осям
        Vector3 v = target.position - transform.position;   
        //Ссчитаем квадрат расстояния по оси X
        float sqrX = v.x * v.x;     
        //Считаем квадрат расстояния по оси Z
        float sqrZ = v.z * v.z;     
        //Вычисляем расстояние до цели, извлекая квадратный корень из суммы квадратов расстояний по осям X и Z
        float distance = Mathf.Sqrt(sqrX + sqrZ);
        Debug.Log(distance);       
    }
}

Модуль или абсолютное значение

Кто как называет, но смысл от этого не меняется.
Абсолютное значение (или модуль) — это значение без учёта знака, то есть абсолютное значение числа 10 и -10 одинаково и равно 10.

Получить абсолютное значение числа в Unity (C#) можно с помощью функции:
Mathf.Abs(float f)		//Абсолютное значение (модуль)

Это полезно, когда знак только мешает расчётам.
Например, когда мы считаем скорость. Если объект движется вперед то всё нормально. А если назад? У него выходит отрицательная скорость. Чтобы избавиться от минуса, но не париться с определением направления и знака, можно брать абсолютное значение.

Максимум и минимум.

Не редко бывает, что надо сравнить два числа и использовать из них максимальное или минимальное.
В Unity (C#) для получения наибольшего или наименьшего числа из двух чисел, есть функция:
Mathf.Min(float a, float b)		//Наименьшее
Mathf.Max(float a, float b)		//Наибольшее


Использовать можно, например, в случае со здоровьем игрока.
Чтобы оно не превышало максимальное:
currentHealth = Mathf.Min(curentHealth, maxHealth);

И чтобы было не ниже нуля:
currentHealth = Mathf.Max(currentHealth, 0);


Но бывают ситуации, когда выбрать надо более, чем из двух чисел.
К примеру у торговца хорошее настроение и он готов продать игроку любой товар по минимальной цене. Или наоборот, игрок насолил торговцу, и тот продаёт ему всё по максимальной цене.
Реализовать это в Unity (C#) можно с помощью тех же функций, просто в качестве параметра передать массив значений:
Mathf.Min(float[] array)		//Наименьшее
Mathf.Max(float[] array)	//Наибольшее

Для приведённых ситуаций это будет выглядеть так:
if(smile)
	price = Mathf.Min(priceList);
else if(evil)
	price = Mathf.Max(priceList);


priceList – это массив цен на все товары у продавца.


На этом и закончим.
P.S. Если что-то не понятно, пишите в комментариях.

21358