Блог программиста
Математика Unity (Урок 11). Mathf циклы и инверсная интерполяция.
28.08.2013Математика Unity

Цикл 1

В Unity, в классе Mathf одним из циклов является Repeat.
Синтаксис (C#):
Mathf.Repeat(float val, float length);

Результат работы данной функции находиться между 0 и length. По сути данная функция возвращает остаток от деления значение val на length. Поэтому при постоянном увеличении/уменьшении значения val происходит зацикленность.

Как применить?
Применить данную функцию можно для моделирования любого процесса в одном цикле которого нет повторяющихся значений. Например, вращение Земли вокруг своей оси.
Но мы вращать пока ничего не будем, а создадим «декоративный конвейер»:

Шар будет передвигаться из точки А в точку Б, после достижения точки Б процесс начнётся заново. Будет эффект работы конвейера, но сфера будет одна.
Скрипт для сферы:
using UnityEngine;

public class RepeatPos : MonoBehaviour {

    // Update is called once per frame
    void Update ()
    {
        //5 — это расстояние от пункта А до пункта Б
        transform.position = new Vector3(Mathf.Repeat(Time.time, 5), transform.position.y, transform.position.z);
    }
}

Цикл 2

Очередной цикл в Unity (C#):
Mathf.PingPong(float val, float length)

Данная функция как и предыдущая возвращает значение в диапазоне от 0 до length.
Подходит для маятника или дворника на автомобиле.
Код (C#):
using UnityEngine;

public class PingPongAngle : MonoBehaviour {

    // Update is called once per frame
    void Update ()
    {
        //Домножил на 50 для скорости
        transform.eulerAngles = new Vector3(0, 0, Mathf.PingPong(Time.time*50, 120));
    }
}

Думаю всем понятно как это работает и подробных объяснений не требуется =)

Инверсная интерполяция

Синтаксис (C#):
Mathf.InverseLerp (float from, float to, float val)

Вычисляет параметр функции Lerp на основе двух других параметров и результата функции.
Возвращает значение в диапазоне от 0 до 1.
Применить можно для отображения жизней игрока в процентах:
using UnityEngine;

public class HealthPlayer : MonoBehaviour {
	
    public float maxHealth = 200;
    public float currentHealth = 70;


    // Update is called once per frame
    void OnGUI ()
    {
        GUI.Label(new Rect(10, 10, 100, 50), Mathf.InverseLerp(0, maxHealth, currentHealth)*100 + "%");
    }
}

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

13761