Отражение
Функция отражения векторов в Unity (C#):Vector3.Reflect(Vector3 inDirection, Vector3 inNormal) //Отражение
Данная функция возвращает вектор, значение компонентов которого равны отражению вектора inDirection в плоскости с нормалью inNormal.
Пример:
using UnityEngine;
using System.Collections;
public class VectorReflect : MonoBehaviour {
//Объеткт-"отражение"
public Transform reflectObject;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
reflectObject.position = Vector3.Reflect(transform.position, Vector3.forward);
}
}
В данном случае reflectObject будет «отражением» объекта, на котором висит скрипт. «Зеркалом» будет плоскость OXY (т. к. ось Z является нормалью данной плоскости).
Расстояние
Для нахождения расстояния между двумя точками в Unity есть функция:Vector[X].Distance(Vector[X] a, Vector[X] b);
Использовать можно, например, для проверки возможности атаки.
Проекция
Функция проекции в Unity (C#):Vector[X].Project(Vector[X] a, Vector[X] b); //Проекция
Возвращает проекцию вектора a на вектор b.
Для чего может пригодиться?
Пример:
Летит самолёт скинуть груз на остров, мы знаем скорость самолёта, его координаты, знаем координаты острова. Нам нужно рассчитать время, через которое самолёт долетит.
Формула расчёта: время = расстояние/скорость. Скорость мы знаем, расстояние можем найти функцией Vector3.Distance, но... Самолёт выше острова и ему не требуется приземляться, чтобы скинут груз, поэтому рассчитанное время будет больше, чем на самом деле, т. к. будет учитываться высота. Для избежания этой проблемы можно использовать проекцию, в этом случае разницы в высоте не будет, и можно спокойно измерить расстояние, которое самолёт пролетит.
Угол
Функция для получения угла между векторами в Unity (C#):Vector[X].Angle(Vector[X] a, Vector[X] b); //Угол
Можно использовать для проверки, находится ли объект в поле видимости:
using UnityEngine;
using System.Collections;
public class VectorAngle : MonoBehaviour {
//Угол обзора
public float angle = 60;
//Цель
public Transform target;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
//Измеряем и сверяем угол между векторами
if(Vector3.Angle(transform.forward, target.position - transform.position) <= angle)
{
Debug.Log("Visible!");
}
}
}
Конец.