Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 13.09.2010, 02:31   #1
Avatarchik
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.0)
        {
            
Rect position = new Rect(screenPosition.xScreen.height screenPosition.y100f20f);
            
GUI.Label(position"Avatarchik");
        }




    }



(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо Avatarchik за это полезное сообщение:
den (13.09.2010), Fatalix3d (13.09.2010), Illidan (13.09.2010), pax (13.09.2010), Zer0n (13.09.2010)
Старый 13.09.2010, 10:20   #2
Zer0n
ПроЭктировщик
 
Аватар для Zer0n
 
Регистрация: 20.06.2010
Адрес: Верняя Пышма - центр UMMC
Сообщений: 146
Написано 33 полезных сообщений
(для 40 пользователей)
Ответ: GUI надпись над 3д объектом

Насколько я понимаю, такую же технологию можно юзать для 2D спрайтов a.k.a Doom??
__________________


(Offline)
 
Ответить с цитированием
Старый 13.09.2010, 10:31   #3
Avatarchik
AnyKey`щик
 
Регистрация: 16.11.2009
Сообщений: 2
Написано одно полезное сообщение
(для 5 участников)
Ответ: GUI надпись над 3д объектом

Да,можно
(Offline)
 
Ответить с цитированием
Старый 13.09.2010, 11:31   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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.0)
        {
            
// если используем рейкастинг
            
if(useRayCast)
            {
                
RaycastHit hit;

                
// направление луча
                
Vector3 direction transform.position Camera.main.transform.position;

                
// сам луч
                
Ray ray = new Ray(Camera.main.transform.positiondirection);
  
                
// посылаем луч
                
if (Physics.Raycast(rayout hit))
                {
                    
// если дистанция до цели удовлетворяет условиям, то отображаем имя
                    
if(hit.distance >= (direction.magnitude-objectSize))
                    {
                        
Vector3 screenPosition Camera.main.WorldToScreenPoint(transform.position);
                        
_position = new Vector2(screenPosition.60fScreen.height screenPosition.10f);
                        
_showName true;     
                    }
                }
            }
            else
            {
                
// случай без рейкастинга
                
Vector3 screenPosition Camera.main.WorldToScreenPoint(transform.position);
                
_position = new Vector2(screenPosition.60fScreen.height screenPosition.10f);
                
_showName true;                
            }

        }
    }


    public 
void OnGUI()
    {
        
// если следует отобразить имя
        
if (_showName)
        {
            
// считаем позицию
            
Rect rect = new Rect(_position.x_position.y120f20f);

            
// создаем стиль с выравниванием по центру
            
GUIStyle label = new GUIStyle(GUI.skin.label);
            
label.alignment TextAnchor.MiddleCenter;
          
            
// выводим имя объекта с созданным стилем, чтобы имя было выведено по центру
            
GUI.Label(rectobjectNamelabel);
        }
    }



__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Andvrok (02.06.2013), den (13.09.2010), Fatalix3d (13.09.2010), Illidan (13.09.2010)
Старый 25.06.2012, 23:46   #5
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: GUI надпись над 3д объектом

странно, но координаты не меняются.
(Offline)
 
Ответить с цитированием
Старый 26.06.2012, 10:45   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: GUI надпись над 3д объектом

Какие координаты?

PS: самый простой способ проверять координаты - выбирать объекты в иерархии в режиме Play и смотреть в инспекторе
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 26.06.2012, 11:00   #7
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: GUI надпись над 3д объектом

Все нормально. Сам чуть чуть ошибся. Брал координаты не того объекта.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 09:28.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com