forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Выделение объектов. RayCast (http://forum.boolean.name/showthread.php?t=14383)

Jarnul 09.03.2011 10:33

Выделение объектов. RayCast
 
Задача: выделить объект по щелчку на нем мышкой.
Решение: На все объекты, которые можем выделять. прикрепить, скрипт с кодом:
Код:

public class DebugScript : MonoBehaviour {
    void Update ()
    {
        if (Input.GetMouseButtonUp(0) )
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (collider.Raycast(ray, out hit, 10))
            {
                hit.collider.gameObject.renderer.material.color = Color.green;
            }
        }
    }
}

Вопросы:
1. Правильно ли реализовано?
2. Как можно реализовать по другому (м.б. Более изящнее)
3. Как можно реализовать выделение объектов, используя один скрипт, прикрепленный к самой камере?

Neodrop 09.03.2011 10:40

Ответ: Выделение объектов. RayCast
 
Желательно сохранить SharedMaterial, чтобы потом его можно было вернуть объекту, чтобы не терять возможности батчинга

Jarnul 09.03.2011 11:58

Выделение объектов. RayCast Вариант 2
 
Код:

public class DebugScript : MonoBehaviour {
 private bool _debug = true;
 void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);            //получим координаты мышки
            RaycastHit hit;                                                        //Объявим структуру, из которой будем брать данные
            if (Physics.Raycast(ray, out hit, 100))                                //возвращает true если сталкивается с чем либо
            {
                if (_debug) Debug.DrawLine(ray.origin, hit.point);                  //покажем линией на выделяемый объект.
                if(hit.collider.gameObject.tag == "MyTag")                          // Разрешаем помечать объекты только с этим тегом
                    hit.collider.gameObject.renderer.material.color = Color.green;  //выделяем цветом объект, по колайдеру которого мы попали   
            }
        }
    }
}

В этом варианте достаточно создать один пустой объект на сцене и повесить на него скрипт.

pax 09.03.2011 15:28

Ответ: Выделение объектов. RayCast
 
По любому это надо сделать не с помощью рейкаста, а использовать http://unity3d.com/support/documenta...MouseDown.html
т.е.:
PHP код:

public class DebugScript MonoBehaviour {
 
void OnMouseDown () 
    {
        if (
renderer!= null)
          
renderer.material.color Color.green;  //выделяем цветом объект, по колайдеру которого мы попали    
    
}


твой скрипт как раз на камеру можно вешать

Andvrok 09.03.2011 17:11

Ответ: Выделение объектов. RayCast
 
Цитата:

Сообщение от pax (Сообщение 182067)
...

Не знал про такую фичу, премного благодарен

lopatka 25.08.2011 16:36

Ответ: Выделение объектов. RayCast
 
Скажите пожалуйста, а как на этой основе можно снимать выделение и возвращать исходный материал ?

Код:

public class DebugScript : MonoBehaviour {
 private bool _debug = true;
 void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);            //получим координаты мышки
            RaycastHit hit;                                                        //Объявим структуру, из которой будем брать данные
            if (Physics.Raycast(ray, out hit, 100))                                //возвращает true если сталкивается с чем либо
            {
                if (_debug) Debug.DrawLine(ray.origin, hit.point);                  //покажем линией на выделяемый объект.
                if(hit.collider.gameObject.tag == "MyTag")                          // Разрешаем помечать объекты только с этим тегом
                    hit.collider.gameObject.renderer.material.color = Color.green;  //выделяем цветом объект, по колайдеру которого мы попали   
            }
        }
    }
}


Lestar 25.08.2011 17:44

Ответ: Выделение объектов. RayCast
 
PHP код:

public class DebugScript MonoBehaviour
     
{
         private 
bool _debug true;
         private 
Material _first_Mat;
         private 
GameObject _my_Object;

         
void Start()
         {
             
_my_ObjectGameObject.FindWithTag("MyTag");   //Находим свой обьект по тегу
             
_first_Mat _my_Object.renderer.material;   //Запоминаем какой на нем изначально материал
         
}

         
void Update()
         {
             if (
Input.GetMouseButtonUp(0))
             {
                 
Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);            //получим координаты мышки
                 
RaycastHit hit;                                                         //Объявим структуру, из которой будем брать данные
                 
if (Physics.Raycast(rayout hit100))                                 //возвращает true если сталкивается с чем либо
                 
{
                     if (
_debugDebug.DrawLine(ray.originhit.point);                  //покажем линией на выделяемый объект.
                     
if (hit.collider.gameObject.tag == "MyTag")                         // Разрешаем помечать объекты только с этим тегом
                         
hit.collider.gameObject.renderer.material.color Color.green;  //выделяем цветом объект, по колайдеру которого мы попали    
                 
}
             }
             if(
Input.GetKey(KeyCode.W))
             {
                 
_my_Object.renderer.material _first_Mat;                                // По нажатию на W возвращаем начальный материал
             
}
         }
     } 


lopatka 25.08.2011 19:38

Ответ: Выделение объектов. RayCast
 
Спасибо большое !
Попробовал... По клавише W выделение не сбрасывается ((.
Простите мне мою неопытность - Нужно ли указывать мне самостоятельно какой материал(его название) у объекта ?

Lestar 25.08.2011 20:00

Ответ: Выделение объектов. RayCast
 
Протормозил.
PHP код:

using UnityEngine;
using System.Collections;

public class 
TestScript MonoBehaviour {


    private 
bool _debug true;
    private 
Color _first_Mat;
    private 
GameObject _my_Object;

    
void Start()
    {
        
_my_Object GameObject.FindWithTag("MyTag");   //Находим свой обьект по тегу
        
_first_Mat _my_Object.renderer.material.color;   //Запоминаем какой на нем изначально цвет
    
}

    
void Update()
    {
        if (
Input.GetMouseButtonUp(0))
        {
            
Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);            //получим координаты мышки
            
RaycastHit hit;                                                         //Объявим структуру, из которой будем брать данные
            
if (Physics.Raycast(rayout hit10000))                                 //возвращает true если сталкивается с чем либо
            
{
                
                if (
hit.collider.gameObject.tag == "MyTag")                         // Разрешаем помечать объекты только с этим тегом
                    
hit.collider.gameObject.renderer.material.color Color.green;  //выделяем цветом объект, по колайдеру которого мы попали    
            
}
        }
        if (
Input.GetKey(KeyCode.W))
        {
            
Debug.Log("Upps");
            
_my_Object.renderer.material.color _first_Mat;                                // По нажатию на W возвращаем начальный цвет
        
}
    } 


Мы же поле Color меняли,а не материал.

lopatka 25.08.2011 20:25

Ответ: Выделение объектов. RayCast
 
Что то опять не так :-( Сообщение Upps вылетает, но материал(цвет) не сбрасывается .

А вообще чувствую затягивает эта тема... )) Увы мозги у меня не заточены под программирование

Lestar 25.08.2011 21:09

Ответ: Выделение объектов. RayCast
 
Вложений: 1
Рабочая сцена с этим скриптом в аттаче.

lopatka 25.08.2011 21:18

Ответ: Выделение объектов. RayCast
 
Да работает. Но если добавить в сцену скажем сферу. Выделить сначала куб, а потом сферу, то выделение снимается только со сферы. куб остается выделенным.
Ну впрочем ладно... Я чувствую без более глубокого вникания в тему я не смогу понять как это работает,а соответственно тупо буду надоедать с мелкими вопросами.

Lestar 25.08.2011 21:33

Ответ: Выделение объектов. RayCast
 
В данном случае пишем все выделенные обьекты в список,затем список перебираем и снимаем выделение.

lopatka 25.08.2011 22:11

Ответ: Выделение объектов. RayCast
 
Спасибо !


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

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