|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
09.03.2011, 10:33
|
#1
|
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
|
Оператор ЭВМ
Регистрация: 16.06.2010
Сообщений: 44
Написано 17 полезных сообщений (для 34 пользователей)
|
Ответ: Выделение объектов. RayCast
Желательно сохранить SharedMaterial, чтобы потом его можно было вернуть объекту, чтобы не терять возможности батчинга
|
(Offline)
|
|
09.03.2011, 11:58
|
#3
|
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
|
Unity/C# кодер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.03.2011, 17:11
|
#5
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Выделение объектов. RayCast
Сообщение от pax
...
|
Не знал про такую фичу, премного благодарен
|
(Offline)
|
|
25.08.2011, 16:36
|
#6
|
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
|
Бывалый
Регистрация: 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_Object= GameObject.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(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; //выделяем цветом объект, по колайдеру которого мы попали } } if(Input.GetKey(KeyCode.W)) { _my_Object.renderer.material = _first_Mat; // По нажатию на W возвращаем начальный материал } } }
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
25.08.2011, 19:38
|
#8
|
AnyKey`щик
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Выделение объектов. RayCast
Спасибо большое !
Попробовал... По клавише W выделение не сбрасывается ((.
Простите мне мою неопытность - Нужно ли указывать мне самостоятельно какой материал(его название) у объекта ?
|
(Offline)
|
|
25.08.2011, 20:00
|
#9
|
Бывалый
Регистрация: 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(ray, out hit, 10000)) //возвращает 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
|
AnyKey`щик
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Выделение объектов. RayCast
Что то опять не так :-( Сообщение Upps вылетает, но материал(цвет) не сбрасывается .
А вообще чувствую затягивает эта тема... )) Увы мозги у меня не заточены под программирование
|
(Offline)
|
|
25.08.2011, 21:09
|
#11
|
Бывалый
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений (для 880 пользователей)
|
Ответ: Выделение объектов. RayCast
Рабочая сцена с этим скриптом в аттаче.
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
25.08.2011, 21:18
|
#12
|
AnyKey`щик
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Выделение объектов. RayCast
Да работает. Но если добавить в сцену скажем сферу. Выделить сначала куб, а потом сферу, то выделение снимается только со сферы. куб остается выделенным.
Ну впрочем ладно... Я чувствую без более глубокого вникания в тему я не смогу понять как это работает,а соответственно тупо буду надоедать с мелкими вопросами.
|
(Offline)
|
|
25.08.2011, 21:33
|
#13
|
Бывалый
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений (для 880 пользователей)
|
Ответ: Выделение объектов. RayCast
В данном случае пишем все выделенные обьекты в список,затем список перебираем и снимаем выделение.
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
25.08.2011, 22:11
|
#14
|
AnyKey`щик
Регистрация: 25.08.2011
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Выделение объектов. RayCast
Спасибо !
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:53.
|