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

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

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

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 09.03.2011, 10:33   #1
Jarnul
AnyKey`щик
 
Регистрация: 09.03.2011
Сообщений: 2
Написано 0 полезных сообщений
(для 0 пользователей)
Сообщение Выделение объектов. 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. Как можно реализовать выделение объектов, используя один скрипт, прикрепленный к самой камере?
(Offline)
 
Ответить с цитированием
Старый 09.03.2011, 10:40   #2
Neodrop
Оператор ЭВМ
 
Регистрация: 16.06.2010
Сообщений: 44
Написано 17 полезных сообщений
(для 34 пользователей)
Ответ: Выделение объектов. RayCast

Желательно сохранить SharedMaterial, чтобы потом его можно было вернуть объекту, чтобы не терять возможности батчинга
(Offline)
 
Ответить с цитированием
Старый 09.03.2011, 11:58   #3
Jarnul
AnyKey`щик
 
Регистрация: 09.03.2011
Сообщений: 2
Написано 0 полезных сообщений
(для 0 пользователей)
Радость Выделение объектов. 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;  //выделяем цветом объект, по колайдеру которого мы попали    
            }
        }
    }
}
В этом варианте достаточно создать один пустой объект на сцене и повесить на него скрипт.
(Offline)
 
Ответить с цитированием
Старый 09.03.2011, 15:28   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Выделение объектов. RayCast

По любому это надо сделать не с помощью рейкаста, а использовать http://unity3d.com/support/documenta...MouseDown.html
т.е.:
public class DebugScript MonoBehaviour {
 
void OnMouseDown () 
    {
        if (
renderer!= null)
          
renderer.material.color Color.green;  //выделяем цветом объект, по колайдеру которого мы попали    
    
}

твой скрипт как раз на камеру можно вешать
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Andvrok (09.03.2011)
Старый 09.03.2011, 17:11   #5
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Выделение объектов. RayCast

Сообщение от pax Посмотреть сообщение
...
Не знал про такую фичу, премного благодарен
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 16:36   #6
lopatka
AnyKey`щик
 
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Выделение объектов. 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;  //выделяем цветом объект, по колайдеру которого мы попали    
            }
        }
    }
}
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 17:44   #7
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Выделение объектов. RayCast

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 возвращаем начальный материал
             
}
         }
     } 
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 19:38   #8
lopatka
AnyKey`щик
 
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Выделение объектов. RayCast

Спасибо большое !
Попробовал... По клавише W выделение не сбрасывается ((.
Простите мне мою неопытность - Нужно ли указывать мне самостоятельно какой материал(его название) у объекта ?
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 20:00   #9
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Выделение объектов. RayCast

Протормозил.
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 меняли,а не материал.
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 20:25   #10
lopatka
AnyKey`щик
 
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Выделение объектов. RayCast

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

А вообще чувствую затягивает эта тема... )) Увы мозги у меня не заточены под программирование
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 21:09   #11
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Выделение объектов. RayCast

Рабочая сцена с этим скриптом в аттаче.
Вложения
Тип файла: rar testColor.rar (157.9 Кб, 715 просмотров)
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 21:18   #12
lopatka
AnyKey`щик
 
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Выделение объектов. RayCast

Да работает. Но если добавить в сцену скажем сферу. Выделить сначала куб, а потом сферу, то выделение снимается только со сферы. куб остается выделенным.
Ну впрочем ладно... Я чувствую без более глубокого вникания в тему я не смогу понять как это работает,а соответственно тупо буду надоедать с мелкими вопросами.
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 21:33   #13
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Выделение объектов. RayCast

В данном случае пишем все выделенные обьекты в список,затем список перебираем и снимаем выделение.
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Старый 25.08.2011, 22:11   #14
lopatka
AnyKey`щик
 
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Выделение объектов. RayCast

Спасибо !
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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