forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Unity (http://forum.boolean.name/forumdisplay.php?f=144)
-   -   Фак по Юнити. (http://forum.boolean.name/showthread.php?t=12966)

Illidan 10.09.2010 23:37

Ответ: Визуальный редактор логики для Unity
 
расскажите пожалуйста об антаресе подробней. желательно отдельной темой. Кто, когда, для чего, как, зачем?

pax 10.09.2010 23:40

Ответ: Визуальный редактор логики для Unity
 
Цитата:

Сообщение от Illidan (Сообщение 161605)
расскажите пожалуйста об антаресе подробней. желательно отдельной темой. Кто, когда, для чего, как, зачем?

документация на русском

Страница скачивания

pax 25.09.2010 23:53

Ответ: Фак по Юнити.
 
там его точно нет ;) Да и кто его будет переозвучивать...

pax 26.09.2010 00:34

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от Andvrok (Сообщение 163214)
Ну не создавать же тему ради одного вопроса о мануале?

А кто говорил о создании тамы :4to: ?

Illidan 24.10.2010 04:38

Ответ: Фак по Юнити.
 
как перевести 3д координаты в двумерные?

pax 24.10.2010 08:42

Ответ: Фак по Юнити.
 
Если я правильно понял, то нужно спроецировать точку на экран? Тогда вот эти функции камеры помогут:
Camera.WorldToScreenPoint
Camera.WorldToViewportPoint
Camera.ScreenToViewportPoint

Stanis1av 03.11.2010 17:22

Ответ: Фак по Юнити.
 
Всем привет)
У меня вопрос!

о GUILayer.HitTest

я для камеры игрока сделал такой скрипт - камера над игроком и не поворачивается и привязал кней управление:
кликаю мышью в пустое место на плане - ставлю объект (маркер),
кликаю на врага - атакую.

проблема в том, что когда кликаю на GUI ставиться и маркер , я попробовал сделать это с помощью GUILayer.HitTest, но ничего не получилось

вот скрипт , помогите решить такую задачу

Код:

using UnityEngine;
using System.Collections;

public class PlayerCamera: MonoBehaviour {

// положение камеры относительно Player
public float XCamera = -20;
public float YCamera = 30;
public float ZCamera = -20;
       
private Transform _thisTransform;
private Transform _playerTransform;
private Transform _MarkerTransform;
private GameObject _Marker;
private GameObject _player;
       
// Use this for initialization
void Start () {
       
// Получаем компонент трансформации объекта, к которому привязан данный компонент
_thisTransform = transform;

// Получаем компонент трансформации игрока  и маркера
_player = GameObject.Find("Player");
_playerTransform = _player.transform;
               
_Marker = GameObject.Find("Marker");
_MarkerTransform = _Marker.transform;
               
}
       
public void OnGUI() {

// тестовая GUI область
GUILayout.BeginArea(new Rect(100, 100, 200, 200), GUI.skin.box);
GUILayout.Button("TEST");
GUILayout.EndArea();
}

       
// Update is called once per frame
void Update () {
               
GUILayer  _GUILayer  = Camera.main.GetComponent<GUILayer>();
               
if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(Input.mousePosition) == null)  {
                       
Ray _ray = camera.ScreenPointToRay (Input.mousePosition);
       
RaycastHit hit;

if (Physics.Raycast (_ray, out hit)) {
                               
// атакуем Enemy       
if (hit.collider.gameObject.tag == "Enemy") {
                                       
if (Vector3.Distance(_playerTransform.position, рit.collider.gameObject.transform.position) < 3.0f) {
                                               
hit.collider.gameObject.GetComponent<Enemy>().HealthInc();
                                               
 }
}
                               
// ставем маркер на поле
if (hit.collider.gameObject.tag == "Plane") {
                                       
_MarkerTransform.position = new Vector3(hit.point.x, 1, hit.point.z);
_Marker.active = true;
  }
 }
               
}
               
_thisTransform.position = new Vector3( _playerTransform.position.x+XCamera, YCamera, _playerTransform.position.z+ZCamera);

 }
}


pax 03.11.2010 19:05

Ответ: Фак по Юнити.
 
Должно решиться просто. Смотрим пост выше и применяем первую функцию. Заменяем:
PHP код:

if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(Input.mousePosition) == null)  { 

на
PHP код:

if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(Camera.main.WorldToScreenPoint (Input.mousePosition)) == null)  { 

UPD:
Хотя только сейчас понял что не прав... наверное из-за того что голова болит... возможно стоит инвертировать ось Y у мыши. Т.е.:
PHP код:

Vector2 mp Input.mousePosition;
mp.Screen.height mp.y;
if (
Input.GetMouseButtonDown(0) && _GUILayer.HitTest(mp) == null)  { 

Сам бы я пошел другим путем, я бы проверил попадает ли mp в Rect области GUI, т.е. (new Rect(100, 100, 200, 200)).Contains(mp);.

baton4ik 03.11.2010 21:44

Ответ: Фак по Юнити.
 
Я знаю координаты объекта. Как мне получить доступ к самому объекту?

pax 03.11.2010 22:31

Ответ: Фак по Юнити.
 
Как-то с другого конца...
Можно найти все трансформы в сцене и сравнить их координаты с имеющимися.
Но проще дать объекту имя или тэг по которому можно будет его найти или ограничить поиск.

baton4ik 03.11.2010 23:50

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от pax (Сообщение 166967)
Как-то с другого конца...
Можно найти все трансформы в сцене и сравнить их координаты с имеющимися.
Но проще дать объекту имя или тэг по которому можно будет его найти или ограничить поиск.

Примерно так я думал, спасибо. Ещё, я не нашёл, как перебирать все трансформы в сцене.

pax 04.11.2010 03:34

Ответ: Фак по Юнити.
 
Вот так можно:
PHP код:

Transform[] transforms = (Transform[]) FindObjectsOfType(typeof (Transform));
        foreach (
Transform sceneTransform in transforms)
        {
            if (
sceneTransform.position == myPos)
            {
                
//объект найден


                
break;
            }
        } 


Stanis1av 04.11.2010 10:14

Ответ: Фак по Юнити.
 
Цитата:

Хотя только сейчас понял что не прав... наверное из-за того что голова болит... возможно стоит инвертировать ось Y у мыши. Т.е.:
PHP код:

Vector2 mp Input.mousePosition;
mp.Screen.height mp.y;
if (
Input.GetMouseButtonDown(0) && _GUILayer.HitTest(mp) == null)  { 

Сам бы я пошел другим путем, я бы проверил попадает ли mp в Rect области GUI, т.е. (new Rect(100, 100, 200, 200)).Contains(mp);.
Y - мыши я переворачивал, забыл написать, ничего не происходило, хотя именно так конечно правильно, но и так GUI не видит :( .

А перебирать все GUI на пересечение по Rect не очень удобно, это у меня в примере тестовый GUI, а ведь их может быть много на экране и еще динамические, хотелось бы победить эту штуку, второй день бъюсь:(

Ну а если с Rect, то как найти все GUI?

pax 04.11.2010 11:27

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от Stanis1av (Сообщение 167015)
Ну а если с Rect, то как найти все GUI?

Достаточно зарегистрировать в каком-то компоненте все области, в которых находятся элементы GUI.

Можно попробовать так:
PHP код:

public class MouseOnGUITester:MonoBehaviour
{
    public static 
readonly Dictionary<string,RectGUIRects = new Dictionary<string,Rect>();
    public static 
bool mouseOnGUI false;

    public 
void Update()
    {
       
Vector2 mp Input.mousePosition
       
mp.Screen.height mp.y
       
mouseOnGUI false;
       foreach (var 
rect in GUIRects)
       {
           if(
rect.Value.Contains(mp))
           {
               
mouseOnGUI true;
               break;
           }
       }
    }

    public static 
void RegisterRect(string rectNameRect rect)
    {
        
GUIRects[rectName] = rect;
    }

    public static 
void UnRegisterRect(string rectName)
    {
        if(
GUIRects.ContainsKey(rectName)  GUIRects.Remove(rectName);
    }
    


Бросить этот компонент на любой объект в сцене и регистрировать по имени все области, в которых GUI есть. Если область исчезает - разрегистрировать ее (например в OnDisable компонента с GUI). Если Область изменила размер или положение, то ее можно зарегистрировать заново.

Пользоваться:
PHP код:

// регистрация
public void Start()
{
   
MouseOnGUITester.RegisterRect("MyMenuRect", new Rect(100100200200));
}

// разрегистрация
public void OnDisable()
{
    
MouseOnGUITester.UnRegisterRect("MyMenuRect");
}


// проверка
public void Update()
{
  if (!
MouseOnGUITester.mouseOnGUI )
  {
     
// действие
  
}


PS: писал сразу сюда, возможно ошибок налепил...

Stanis1av 05.11.2010 10:22

Ответ: Фак по Юнити.
 
идея понятна, но всё же - это как-то "сложно" должно быть какое-то стандартное решение.

Спасибо paxу
за подержку

Ведь эта тема толком нигде не описана

Единственное, что я нашел - это существует какая-то несовместимось GUI в Unity, это - старый стиль графического интерфейса (из классов GUIElement, GUITexture, GUIText, GUILayer) и новый (именуемые " UnityGUI "и из всех других классов GUIAnything, и OnGUI () вызова). Так что если вы используете UnityGUI, HitTest ничего не найдете.

pax если что-то знаете , расскажите плз


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

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