 |
13.09.2010, 02:31
|
#1
|
AnyKey`щик
Регистрация: 16.11.2009
Сообщений: 2
Написано одно полезное сообщение (для 5 участников)
|
GUI надпись над 3д объектом
using UnityEngine;
public class GUIname : MonoBehaviour {
void OnGUI() {
Vector3 screenPosition = Camera.main.WorldToScreenPoint(gameObject.transform.position);
Vector3 cameraRelative = Camera.main.transform.InverseTransformPoint(transform.position); if (cameraRelative.z > 0) { Rect position = new Rect(screenPosition.x, Screen.height - screenPosition.y, 100f, 20f); GUI.Label(position, "Avatarchik"); }
}
}
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Avatarchik за это полезное сообщение:
|
|
13.09.2010, 10:20
|
#2
|
ПроЭктировщик
Регистрация: 20.06.2010
Адрес: Верняя Пышма - центр UMMC
Сообщений: 146
Написано 33 полезных сообщений (для 40 пользователей)
|
Ответ: GUI надпись над 3д объектом
Насколько я понимаю, такую же технологию можно юзать для 2D спрайтов a.k.a Doom?? 
|
(Offline)
|
|
13.09.2010, 10:31
|
#3
|
AnyKey`щик
Регистрация: 16.11.2009
Сообщений: 2
Написано одно полезное сообщение (для 5 участников)
|
Ответ: GUI надпись над 3д объектом
Да,можно 
|
(Offline)
|
|
13.09.2010, 11:31
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: GUI надпись над 3д объектом
Плохо что без описания, но за пример спасибо. Считать что-то в OnGUI не хорошо, т.к. Unity за кадр бывает выполняет эту функцию до пяти раз. Наилучшее место для расчетов - Update или FixedUpdate.
Я взял на себя смелость немного его дописать:

using UnityEngine;
public class GUIname : MonoBehaviour { // имя объекта для вывода 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); } }
}
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
25.06.2012, 23:46
|
#5
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: GUI надпись над 3д объектом
странно, но координаты не меняются.
|
(Offline)
|
|
26.06.2012, 10:45
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: GUI надпись над 3д объектом
Какие координаты?
PS: самый простой способ проверять координаты - выбирать объекты в иерархии в режиме Play и смотреть в инспекторе 
|
(Offline)
|
|
26.06.2012, 11:00
|
#7
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: GUI надпись над 3д объектом
Все нормально. Сам чуть чуть ошибся. Брал координаты не того объекта.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:11.
|