Разбираю скрипт, устанавливающий надпись над обьектом.
Код
using UnityEngine;
using System.Collections;
public class ques_givers : MonoBehaviour {
//===---Variables---===
private bool avail_quest;
//===---END VARIABLES---===
// имя объекта д
public string objectName;
// использовать ли рейкастинг для отображения имени только если объект не закрыт другим объектом
// будет работать если на объекте есть коллайдер
public bool useRayCast;
// размер объекта (используется в условии по рейкастингу)
public float objectSize = 2;
// вспомогательные переменные
private bool _showName;
private Vector2 _position;
public void Awake()
{
// если имя не указано, то отображаем имя объекта сцены
if (string.IsNullOrEmpty(objectName))
{
objectName = name;
}
}
public void Update()
{
_showName = false;
// позиция относительно камеры
Vector3 cameraRelative = Camera.main.transform.InverseTransformPoint(transform.position);
// если z>0, то точка находится перед камерой
if (cameraRelative.z > 0)
{
// если используем рейкастинг
if(useRayCast)
{
RaycastHit hit;
// направление луча
Vector3 direction = transform.position - Camera.main.transform.position;
// сам луч
Ray ray = new Ray(Camera.main.transform.position, direction);
// посылаем луч
if (Physics.Raycast(ray, out hit))
{
// если дистанция до цели удовлетворяет условиям, то отображаем имя
if(hit.distance >= (direction.magnitude-objectSize))
{
Vector3 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
_position = new Vector2(screenPosition.x - 60f, Screen.height - screenPosition.y - 10f);
_showName = true;
}
}
}
else
{
// случай без рейкастинга
Vector3 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
_position = new Vector2(screenPosition.x - 60f, Screen.height - screenPosition.y - 10f);
_showName = true;
}
}
}
public void OnGUI()
{
// если следует отобразить имя
if (_showName)
{
// считаем позицию
Rect rect = new Rect(_position.x, _position.y, 120f, 20f);
// создаем стиль с выравниванием по центру
GUIStyle label = new GUIStyle(GUI.skin.label);
label.alignment = TextAnchor.MiddleCenter;
// выводим имя объекта с созданным стилем, чтобы имя было выведено по центру
GUI.Label(rect, objectName, label);
}
}
}
Прошу разжевать мне данный скрипт, т.к. комментарии, описанные в данном скрипте не совсем доходят мне. 1-й вопрос интересующий:
Код
Vector3 cameraRelative = Camera.main.transform.InverseTransformPoint(transform.position);
Не понятно мне, в доках вычитал, ф-я inversetransformpoint() преобразует мировое положение обьекта в локальное. — нефига не понимаю зачем оно там и вообще...
2-й вопрос.
Направление луча.
Vector3 direction = transform.position - Camera.main.transform.position;
Что мы получим, отняв позицию игрока от позиции камеры?
Прошу помощи и благодарен заранее откликнувшимся, т.к. нечерта не понимаю.