В прошлом уроке были рассмотрены синус и косинус. В этом уроке мы продолжаем рассматривать класс 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. Если что-то не понятно, пишите в комментариях ;-)