Страница 1 из 1

Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 12:15
eureka3D
Ну вот собственно вопрос.
Полного кода не надо, просто подскажите пожалуста, в каком направлении копать.
Перерыл весь форум.юнити.ком, ничего не нашел. Толи надо на каждый объект вешать скрипт типа:
Код: Выделить всё
function OnMouseOver () {
if (Input.GetButton ("Fire1")){
  Покрасить объект в красный цвет;
}
}

Толи еще как-то. А если у меня 1000 юнитов. Писать и вешать 1000 скриптов для каждого объекта?

Только не отсылайте учить 3ДПлатформерТуториал. пожалуста, нету там такого...

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 12:17
Neodrop
Один скрипт. Который тыркает лучом от камеры через мышку.
Кого тыркнули, того и выделили. Чего проще то?

А скрипт, который висит на каждом и реагирует на OnMouseDown() Это сложно что ли? :-?

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 13:15
eureka3D
Neodrop писал(а):Один скрипт. Который тыркает лучом от камеры через мышку.
Кого тыркнули, того и выделили. Чего проще то?


Если нетрудно, намекните, что это за скрипт :-s . Понимаю, что нуб. Но я только учусь. И может ли этот скрипт окрашивать выбранный объект в, например, синий цвет.

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 15:16
Neodrop
Качайте примеры. Procedural Example вам в помощь.

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 15:56
Mr_Anderson
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class PanelControl : MonoBehaviour
{
    Color OriginMatColor;
    Color HighlightColor = new Color(0, 255, 0);
    bool isClosed = true;

    void Start()
    {
        // запоминаем оригинальные настройки материала объекта
        OriginMatColor = this.renderer.material.color;
    }

    void OnMouseOver()
    {
        this.renderer.material.color = HighlightColor;
    }

    void OnMouseExit()
    {
        this.renderer.material.color = OriginMatColor;
    }

    void OnMouseDown()
    {
        isClosed = !isClosed;
        if (isClosed)
            this.transform.Translate(0, 4.2f, 0, Space.Self);
        else
            this.transform.Translate(0, -4.2f, 0, Space.Self);
    }
}


небольшой примерчик из черновиков. Тока на объекте-меше (к которому нужно повесить этот скрипт) ессно нужно повесить еще и коллайдер ;)

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 16:39
eureka3D
Ок...с этим разобрался. Спасибо за помощь!
Проблем теперь такой. Вот мой скрипт на объекте:
Код: Выделить всё
var material1 : Material;

function OnMouseDown () {
renderer.material.color = Color (100, 0, 0);
}
function OnMouseUp () {
renderer.material = material1;
}

Как бы сделать так, чтобы красный цвет объекта не снимался после отжатия кнопки мыши. А после того как я щелкну мышью на другом объекте...или просто щелкну мышкой еще раз.

P.S. Какой же замудренный в Юнити PickMesh...

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 16:44
Neodrop
Это вообще не Pick
Это локальная реакция на луч. Pick делается совсем иначе.

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 17:07
eureka3D
Боюсь уже спрашивать как? :-s
Просто у меня очень много объектов в проэкте (по скромным потщетам около 10000). И каждый надо Pick'ать, чтобы выдавало его название в отдельном окошке. Блин...как не хочется на Блитз возвращатся... :((

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 17:12
gnoblin
Блиц вообще нормально реагирует на 10.000 объектов в кадре? :))

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 17:13
Neodrop
Пля. Я же дал ссылки на то, как это делать.

C# скрипт :
Код: Выделить всё
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);

        if (Physics.Raycast(ray, out hit, 100))
        {
            MeshFilter filter = hit.collider.GetComponent(typeof(MeshFilter)) as MeshFilter;
            if (filter)
            {
                // Делаем наше чёрное дело. Или опять объяснять КАК? (Все данные можно получить из параметра hit)
            }
        }


Ну сколько можно нашарика то ездить? Немного почитать справку ещё никому не мешало. Немного поразбирать примеры тоже очень полезно для общего развития. :-?

Re: Как выделить объект мышкой?

СообщениеДобавлено: 16 июн 2009, 18:20
eureka3D
gnoblin писал(а):Блиц вообще нормально реагирует на 10.000 объектов в кадре? :))


Нет конечно. Вот поэтому пытаюсь перейти на Юнити. А дядько Неодроп ругаеццо :D

Re: Как выделить объект мышкой?

СообщениеДобавлено: 08 сен 2009, 12:16
Mr_Anderson
Возвращаясь... :) сильно не бейте за вопрос: как выделить мышкой объект-коллайдер, если он находится в более крупном объекте-коллайдере (или находится внутри нескольких таких объектов)?

Re: Как выделить объект мышкой?

СообщениеДобавлено: 08 сен 2009, 12:49
Neodrop
Никак.
Только, если расположить объекты в разных слоях, чтобы при рейкастинге, проигнорировать внешний коллайдер.
Или писать скрипт, который станет продолжать луч внутри объекта, после коллизии с "оболочкой" так сказать.

Re: Как выделить объект мышкой?

СообщениеДобавлено: 08 сен 2009, 12:51
Const_47
Назначить обжект который мы хотим выделить в отдельный слой.

Код: Выделить всё
................   
        private  Ray ray; //Луч
   private  RaycastHit hitElement = new RaycastHit();
        GameObject selectElementGO;
.................
   ray = camera.ScreenPointToRay (Input.mousePosition);
   Physics.Raycast(ray, out hitElement,100,1 << 0);

       selectElementGO  =  hitElement.transform.gameObject;
.................


последний аргумент в Physics.Raycast() --------> 1<< 0, битная маска, говорит о том что колизия с лучем, будет считатся только для нулевого слоя, а если например вот так 1<< 8, то для восьмого, и т д.

Re: Как выделить объект мышкой?

СообщениеДобавлено: 08 сен 2009, 13:09
Mr_Anderson
Похоже, Нео прав насчет делегирования рейкастов в потомки :(((. Const_47, мы пробовали так делать... объект в иерархии принадлежит большому объекту-коллайдеру и выделение его в отдельный слой не помогает :(( Хотелось сделать это проще, но все-таки придется переписывать управление. Спасибо ;)