forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Уроки (http://forum.boolean.name/forumdisplay.php?f=145)
-   -   GUI надпись над 3д объектом (http://forum.boolean.name/showthread.php?t=13332)

Avatarchik 13.09.2010 02:31

GUI надпись над 3д объектом
 
PHP код:

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");
        }




    }


} 


Zer0n 13.09.2010 10:20

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

Avatarchik 13.09.2010 10:31

Ответ: GUI надпись над 3д объектом
 
Да,можно;)

pax 13.09.2010 11:31

Ответ: GUI надпись над 3д объектом
 
Плохо что без описания, но за пример спасибо. Считать что-то в OnGUI не хорошо, т.к. Unity за кадр бывает выполняет эту функцию до пяти раз. Наилучшее место для расчетов - Update или FixedUpdate.


Я взял на себя смелость немного его дописать:
PHP код:

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);
        }
    }


} 


pie 25.06.2012 23:46

Ответ: GUI надпись над 3д объектом
 
странно, но координаты не меняются.

pax 26.06.2012 10:45

Ответ: GUI надпись над 3д объектом
 
Какие координаты?

PS: самый простой способ проверять координаты - выбирать объекты в иерархии в режиме Play и смотреть в инспекторе ;)

pie 26.06.2012 11:00

Ответ: GUI надпись над 3д объектом
 
Все нормально. Сам чуть чуть ошибся. Брал координаты не того объекта.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot