Блог программиста
Математика Unity (Урок 8). Mathf знак и ограничители (диапазоны).
09.07.2013Математика Unity

Бывают ситуации, когда важен знак числа, а само число не играет никакой роли или вообще мешает.
Для таких случаев в Unity есть специальная функция:

Mathf.Sign(float f)		//Знак числа

Данная функция возвращает 1, если число не отрицательное (больше или равно нуля). И -1, если отрицательное (меньше нуля).

Применение

Получение знака может пригодиться например, когда нам надо вращать объект с определённой скоростью при нажатии клавиш.
Для этого можно использовать такой код:
using UnityEngine;

public class RotSign : MonoBehaviour {

	// Update is called once per frame
	void Update ()
	{
		//Если нажата клавиша "влево" или "вправо" (чтобы исключить ноль)
		if(Input.GetButton("Horizontal"))
		{
			//Поворот со скоростью 90/-90 градусов в секунду
			transform.Rotate(Vector3.up * Mathf.Sign(Input.GetAxis("Horizontal")) * 90 * Time.deltaTime);
		}
	}
}

Объект будет поворачивать на 90 градусов в секунду, если нажата клавиша «вправо», и на -90, если клавиша «влево».

Если же опустить получение знака, то скорость поворота будет меньше 90 градусов в секунду. При нажатии кнопки «ось» увеличивается/уменьшается до 1/-1 не резко, а плавно, поэтому значение будет не ровным и скорость вращения не постоянной.

Ограничители (диапазоны)

В Unity есть функция ограничения значения, то есть заключение его в определённый диапазон:
Mathf.Clamp(flaot f, float min, float max)		//Ограничение
Mathf.Clamp01(float f)				//Ограничение от 0 до 1

Первая функция возвращает min, если f меньше min. Если f больше max, то возвращает max. Иначе возвращает f.
Данную функцию удобно использовать, например, со здоровьем:

Как видим, код короче, чем с функциями Min и Max.
Другой пример, ограничение перемещения камеры, чтобы она не выходила за пределы "мира" в стратегии:
// Update is called once per frame
void Update ()
{
	//Позиция по оси X в диапазоне от -500 до 500
	float _x = Mathf.Clamp(transform.position.x + Input.GetAxis("Horizontal") * 10 * Time.deltaTime, -500, 500);
	//Позиция по оси Z в диапазоне от -500 до 500
	float _z = Mathf.Clamp(transform.position.z + Input.GetAxis("Vertical") * 10 * Time.deltaTime, -500, 500);
	//Установка новой позиции
	transform.position = new Vector3(_x, transform.position.y, _z);
}

Вторая функция делает тоже самое, что и первая, но её min и max соответственно 0 и 1.
Эту функцию можно использовать, например, для ограничения процентов:
percent = Mathf.Clamp01(num) * 100;


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

26782