Вывод массива сообщений над обьектом

Лучший способ помочь другим, поделиться своими находками.

Вывод массива сообщений над обьектом

Сообщение EagleOwle 10 май 2015, 17:23

Вот, при поддержке форумчан написал скриптик, отображающий одно или несколько сообщений над обьектом.
Можно использовать для отображения имени, хитов или любых других строковых переменных.
Может кому пригодится.
Синтаксис:
Используется 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);//Выводим сообщение на экран
            }
        }
       
    }
}
 
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3