Можно использовать для отображения имени, хитов или любых других строковых переменных.
Может кому пригодится.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class ShowMessage: MonoBehaviour
{
public GameObject camera; //Ссылка на камеру
public float showMaxDistance = 100f; //Максимальная дистанция, на которой отображаются сообщения
public string[] message;//Массив сообщений
private Vector3 screenPosition;//Позиция сообщения на экране
Rect rect;//Квадрат, в зоне которого выводятся сообщения
public bool show;//Разрешение или запрет на вывод сообщений
private float distance; //Текущая дистанция, на которой выводится сообщение
private Camera cameraComponent;//Ссылка на компонент Camera
private Plane[] planes;
Collider collider;//Ссылка на колайдер обьекта, на ком висит этот скрипт
RaycastHit hitCollision;
Ray rayCollision;
public void Start()
{
collider = GetComponent<CharacterController>();//Получаем ссылку на колайдер
camera = GameObject.Find("Camera(Clone)");//Получаем ссылку на камеру
cameraComponent = camera.GetComponent<Camera>();//Получаем ссылку на компонент Camera
show = false;//Запрещаем отображать сообщения
}
public void Update()
{
Vector3 tmp_v3 = transform.position + new Vector3(0f, 2.5f, 0f);//Запоминаем позицию обьекта, на котором висит этот скрипт
screenPosition = cameraComponent.WorldToScreenPoint(tmp_v3);//Переводим мировые координаты обьекта в экранные
planes = GeometryUtility.CalculateFrustumPlanes(cameraComponent);
if (GeometryUtility.TestPlanesAABB(planes, collider.bounds))//Проверяем вошел обьект в зону обзора камеры или нет
{
show = true;//Разрешаем отображение сообщения
if (showMaxDistance <= 0)//Если дистанция не указана в инспекторе(т.е. равна нуль)
{ //Используем дистанцию от обьекта до камеры(т.е. не ограничено)
distance = Vector3.Distance(transform.position + new Vector3(0f, 1.5f, 0f), camera.transform.position);
}
else
{ //Используем максимальную дистанцию, указанную в инспекторе
distance = showMaxDistance;
}
//Пускаем луч от обьекта в сторону камеры
rayCollision = new Ray(transform.position + new Vector3(0f, 1.5f, 0f), (camera.transform.position) - (transform.position + new Vector3(0f, 1.5f, 0f)));
if (Vector3.Distance(transform.position + new Vector3(0f, 1.5f, 0f), camera.transform.position) > distance)
{ //Если дистанция до камеры больше distance
show = false;//Запрещаем отображение сообщения
}
if (Physics.Raycast(rayCollision, out hitCollision, distance))
{ //Если луч столкнулся с любым обьектом (т.е. между камерой и обьектом есть "посторонний" колайдер)
show = false;//Запрещаем отображение сообщения
}
}
else
{
show = false;//Если не вошел в зону обзора камеры, то запрещаем отображение сообщений
}
}
public void OnGUI()
{
if (show == true )//Если выводит сообщение разрешено
{
GUI.color = Color.red;//Цвет сообщений
GUIStyle label = new GUIStyle(GUI.skin.label);//сохраняем в переменную стиль сообщения
label.alignment = TextAnchor.MiddleCenter;//центрируем наше сообщение
float nextY = 0f;//Обьявляем переменную, которая будет хранить смещение позиции каждого сообщения по Y
for (int i = 0; i < message.Length; i++)//Перебираем массив сообщений
{
nextY += 15f;//Смещаем каждое следеющее сообщение на 15 по Y
rect = new Rect(screenPosition.x - 50f, (Screen.height - screenPosition.y) - nextY, 100f, 20f);//Определяем координаты нашего квадрата, в зоне которого будет выводится сообщение
GUI.Label(rect, message[i], label);//Выводим сообщение на экран
}
}
}
}
using System.Collections;
public class ShowMessage: MonoBehaviour
{
public GameObject camera; //Ссылка на камеру
public float showMaxDistance = 100f; //Максимальная дистанция, на которой отображаются сообщения
public string[] message;//Массив сообщений
private Vector3 screenPosition;//Позиция сообщения на экране
Rect rect;//Квадрат, в зоне которого выводятся сообщения
public bool show;//Разрешение или запрет на вывод сообщений
private float distance; //Текущая дистанция, на которой выводится сообщение
private Camera cameraComponent;//Ссылка на компонент Camera
private Plane[] planes;
Collider collider;//Ссылка на колайдер обьекта, на ком висит этот скрипт
RaycastHit hitCollision;
Ray rayCollision;
public void Start()
{
collider = GetComponent<CharacterController>();//Получаем ссылку на колайдер
camera = GameObject.Find("Camera(Clone)");//Получаем ссылку на камеру
cameraComponent = camera.GetComponent<Camera>();//Получаем ссылку на компонент Camera
show = false;//Запрещаем отображать сообщения
}
public void Update()
{
Vector3 tmp_v3 = transform.position + new Vector3(0f, 2.5f, 0f);//Запоминаем позицию обьекта, на котором висит этот скрипт
screenPosition = cameraComponent.WorldToScreenPoint(tmp_v3);//Переводим мировые координаты обьекта в экранные
planes = GeometryUtility.CalculateFrustumPlanes(cameraComponent);
if (GeometryUtility.TestPlanesAABB(planes, collider.bounds))//Проверяем вошел обьект в зону обзора камеры или нет
{
show = true;//Разрешаем отображение сообщения
if (showMaxDistance <= 0)//Если дистанция не указана в инспекторе(т.е. равна нуль)
{ //Используем дистанцию от обьекта до камеры(т.е. не ограничено)
distance = Vector3.Distance(transform.position + new Vector3(0f, 1.5f, 0f), camera.transform.position);
}
else
{ //Используем максимальную дистанцию, указанную в инспекторе
distance = showMaxDistance;
}
//Пускаем луч от обьекта в сторону камеры
rayCollision = new Ray(transform.position + new Vector3(0f, 1.5f, 0f), (camera.transform.position) - (transform.position + new Vector3(0f, 1.5f, 0f)));
if (Vector3.Distance(transform.position + new Vector3(0f, 1.5f, 0f), camera.transform.position) > distance)
{ //Если дистанция до камеры больше distance
show = false;//Запрещаем отображение сообщения
}
if (Physics.Raycast(rayCollision, out hitCollision, distance))
{ //Если луч столкнулся с любым обьектом (т.е. между камерой и обьектом есть "посторонний" колайдер)
show = false;//Запрещаем отображение сообщения
}
}
else
{
show = false;//Если не вошел в зону обзора камеры, то запрещаем отображение сообщений
}
}
public void OnGUI()
{
if (show == true )//Если выводит сообщение разрешено
{
GUI.color = Color.red;//Цвет сообщений
GUIStyle label = new GUIStyle(GUI.skin.label);//сохраняем в переменную стиль сообщения
label.alignment = TextAnchor.MiddleCenter;//центрируем наше сообщение
float nextY = 0f;//Обьявляем переменную, которая будет хранить смещение позиции каждого сообщения по Y
for (int i = 0; i < message.Length; i++)//Перебираем массив сообщений
{
nextY += 15f;//Смещаем каждое следеющее сообщение на 15 по Y
rect = new Rect(screenPosition.x - 50f, (Screen.height - screenPosition.y) - nextY, 100f, 20f);//Определяем координаты нашего квадрата, в зоне которого будет выводится сообщение
GUI.Label(rect, message[i], label);//Выводим сообщение на экран
}
}
}
}