Блог программиста
Математика Unity (Урок 2). Mathf тангенс и котангенс.
02.07.2013Математика Unity

В прошлом уроке были рассмотрены синус и косинус. В этом уроке мы продолжаем рассматривать класс Mathf, в частности тангенс (tg) и котангенс (ctg). Для тех, кто забыл что это, напоминаю:

Тангенс — отношение синуса к косинусу. Котангенс — отношение косинуса к синусу.
В Unity (C#) тангенс вычисляется функцией (угол указывать необходимо в радианах):
Mathf.Tan(float Angle)			//Тангенс (угол в радианах)
Для вычисления котангенса нет отдельной функции, но его можно легко рассчитать по формуле:
ctg = 1/tg
В коде это выглядит так:
float ctg = 1/Mathf.Tan(float Angle)		//Котангенс

От теории к практике.

Допустим такую ситуацию:
Как обычно имеется охраняемая территория. Охранники расположены по периметру.
Имеется некое устройство слежения, которое сообщает охране, если на территорию проберётся чужой.

Предположим, что в эту охраняемую зону пробрался таки недоброжелатель. Система слежения его засекла и отправила всю охрану его ловить.
Но зачем посылать всех? Пока одни добегут, другие уже его схватят — пустая трата времени и сил.
Поэтому разделим территорию на четыре части.

И если игрок в зоне А, то посылаем группу 1. Если в зоне Б, то посылаем группу 2. Зона В — группа 3, и зона Г — группа 4.
Но как системе узнать в какой зоне находиться враг?
Для этого можно воспользоваться знаками тангенса или котангенса:
В зонах А и В они отрицательны, а в зонах Б и Г — положительны.

А чтобы не путать зоны А с В и Б с Г, воспользуемся знаками косинуса:
А, Б — положительный.
В, Г — отрицательный.

Перенесём наши знания в код:
using UnityEngine;
public class TrackingUnit : MonoBehaviour {
     
    //Переменная для хранения врага
    public Transform enemy;
     
    //Если кто-то проник в зону
    void OnTriggerEnter(Collider col)
    {
	//Если это охранник, выходим
        if(col.tag == "Security") return;
	//Запоминаем врага
        enemy = col.transform;              
	//Поворачиваем устройство слежение на врага
        transform.LookAt(enemy);            
	//Запоминаем угол поворота устройства по оси Y в радианах
        float angle = transform.rotation.eulerAngles.y * Mathf.Deg2Rad;
	//Если кoсинус угла положительный, то проверяем зоны А и Б
        if(Mathf.Cos(angle) > 0)
        {
	    //Если тангенс угла отрицательный, значит враг в зоне А, посылаем туда группу 1
	    //Иначе зона Б и группа 2
            if(Mathf.Tan(angle) < 0)
            {
                Debug.Log("Враг в зоне А, группа 1 на захват.");
            }
            else
            {
                Debug.Log("Враг в зоне Б, группа 2 на захват.");
            }
        }
	//Если кoсинус угла не положительный, проверяем зоны В и Г
        else                                
        {
	    //Если тангенс угла отрицательный, значит враг в зоне В, посылаем туда группу 3
	    //Иначе зона Г и группа 4
            if(Mathf.Tan(angle) < 0)     
            {
                Debug.Log("Враг в зоне В, группа 3 на захват.");
            }
            else
            {
                Debug.Log("Враг в зоне Г, группа 4 на захват.");
            }
        }
    }
}
Вместо тангенса можно использовать и котангенс, но смысла нет, так как получить котангенс дольше, чем тангенс. Думаю на этом и закончим :-) P.S. Если что-то не понятно, пишите в комментариях ;-)

13757