Имя персонажа над головой или подписи объетов

Если делаете сетевую или ролевую игру, где нужно чтобы имя игрока/персонажа показывалось у него над головой, то вы попали куда нужно. Впрочем, нижеприведенный скрипт можно использовать и для отображения подписи активных объектов, например, дверей, типа «запертая дверь» и прочее. Кроме того, можно сделать, чтоб надписи показывалась только после нажатия конкретной клавиши, нужно лишь добавить соответствующее условие. Помимо основного текста, реализован эффект тени текста, его можно отключить при необходимости, кстати говоря.

Итак, сам скрипт ObjectNameView:

using UnityEngine;
using System.Collections;
using System.Text.RegularExpressions;

[ExecuteInEditMode]

public class ObjectNameView : MonoBehaviour {
	
	public string text = "<b>Укажите</b> <color=#ffea00>имя</color> объекта";
	public int textSize = 14;
	public Font textFont;
	public Color textColor = Color.white;
	public float textHeight = 1.15f;
	public bool showShadow = true;
	public Color shadowColor = new Color(0, 0, 0, 0.5f);
	public Vector2 shadowOffset = new Vector2(1,1);
	private string textShadow;

	void Awake()
	{
		enabled = false;
		TextShadowReady();
	}

	void TextShadowReady()
	{
		textShadow = Regex.Replace(text, "<color[^>]+>|</color>", string.Empty);
	}

	void OnGUI()
	{
		GUI.depth = 9999;

		GUIStyle style = new GUIStyle();
		style.fontSize = textSize;
		style.richText = true;
		if(textFont) style.font = textFont;
		style.normal.textColor = textColor;
		style.alignment = TextAnchor.MiddleCenter;

		GUIStyle shadow = new GUIStyle();
		shadow.fontSize = textSize;
		shadow.richText = true;
		if(textFont) shadow.font = textFont;
		shadow.normal.textColor = shadowColor;
		shadow.alignment = TextAnchor.MiddleCenter;

		Vector3 worldPosition = new Vector3(transform.position.x, transform.position.y + textHeight, transform.position.z);
		Vector3 screenPosition = Camera.main.WorldToScreenPoint(worldPosition);
		screenPosition.y = Screen.height - screenPosition.y;

		if(showShadow) GUI.Label(new Rect (screenPosition.x + shadowOffset.x, screenPosition.y + shadowOffset.y, 0, 0), textShadow, shadow);
		GUI.Label(new Rect (screenPosition.x, screenPosition.y, 0, 0), text, style);
	}

	void OnBecameVisible() 
	{
		enabled = true;
	}
	
	void OnBecameInvisible() 
	{
		enabled = false;
	}
}

Внимание! Скрипт нужно цеплять на объект у которого есть компонент Mesh Renderer или Sprite Renderer, так как добавлены следующие функции: если объект попадает в поле зрения камеры, то скрипт работает; если не в поле камеры, то отключается. Таким образом решаются две проблемы: во первых, не отображать надпись, когда невидно цель; во вторых, экономия ресурсов.



Возможно использования HTML тегов в тексте:

<b>жирный</b>
<i>наклонный</i>
<size=20>размер</size>
<color=#993399>цвет</color>


Тень текста, создается на основе исходного. Поскольку у тени должен быть свой цвет, с помощью регулярного выражения, вырезаются теги цвета. Всё это дело делается в функции TextShadowReady.

Если в переменной textFont не указан шрифт, то будет задействован стандартный.

Переменная textHeight для регулировки высоты, относительно центра объекта.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика