Подсвечивание объекта на определенном расстоянии мышкой

Программирование на Юнити.

Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 09 дек 2016, 19:11

Привет всем , хотелось бы узнать , как можно реализовать подсвечивание объекта таким образом , чтобы при наведении на него указателем мыши через рейкаст объект менял свой материал , а когда указатель мыши уводишь с объекта , он принимал свой стандартный материал .
Пробовал вешать на объект OnMouseExit() , чтобы когда отводишь мышь от него , он принимал стандартный материал , и пользовался рейкастом , чтобы когда луч длинною в метр пускающийся через середину экрана (прицел как в шутере) достигал объекта , тот менял ему материал на нужный мне. В итоге OnMouseExit() работает не корректно , не всегда материал становится стандартным. Подскажите, какие есть идеи пожалуйста.
И да , если использовать OnMouseEnter, то получится , что можно навести на объект указатель мыши на любом расстоянии и тот поменяет материал , но мне нужно определенное расстояние , например 1f;
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение samana 09 дек 2016, 22:56

zxandruxazx56 писал(а):И да , если использовать OnMouseEnter, то получится , что можно навести на объект указатель мыши на любом расстоянии и тот поменяет материал , но мне нужно определенное расстояние , например 1f;

В том же onMouseEnter сначала проверьте расстояние до объекта, а потом меняйте ему материал, если это расстояние больше метра.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 10 дек 2016, 11:33

Вообщем сделал все так, как мне подсказали, но не работает и расстояние в дебаг логе одно и тоже показывает .
Изображение
Изображение
И материал не меняется
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение samana 10 дек 2016, 13:32

Что-то запутался я немного.
Вы говорили
zxandruxazx56 писал(а):чтобы когда луч длинною в метр пускающийся через середину экрана (прицел как в шутере) достигал объекта

тогда выходит что вам нужно изменение материала, только когда объект "касается" середины экрана, а мышь тут не причём.
Или вам не важно нацелены ли прицелом (центром экрана) на объект или нет, а просто если находимся к объекту меньше чем на метр, то этот объект должен реагировать на мышь и менять материал?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение djon801 10 дек 2016, 16:08

Во первых. Лучь надо пускать уже с определенным расстоянием
создать переменную для объекта
потом рейкаст захватывает объект по тегу к примеру,я же думаю что стены не должны менять материал.
Если тег наш то укладываем его в переменную
потом с этой переменной манипулируешь
В проверке пихаешь объекту ,материал или что там надо тебе.тперь когда лучь теряет объект его надо
Теперь когда лучь потерял объект надо вернуть объекту его прежнее состояние и обнулить переменную
Может что то и упускаю.Были там какието сложности у меня с проверками.Буквально пол года назат делал что то подобное.
Мне надо было подсвечивать объекты на которые смотришь и взаимодействовать с ними.
гдето даже вся писанина эта лежит.Если сильно надо в шагай в скайп djon8011 Женя
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 10 дек 2016, 17:34

djon801 писал(а):Во первых. Лучь надо пускать уже с определенным расстоянием
создать переменную для объекта
потом рейкаст захватывает объект по тегу к примеру,я же думаю что стены не должны менять материал.
Если тег наш то укладываем его в переменную
потом с этой переменной манипулируешь
В проверке пихаешь объекту ,материал или что там надо тебе.тперь когда лучь теряет объект его надо
Теперь когда лучь потерял объект надо вернуть объекту его прежнее состояние и обнулить переменную
Может что то и упускаю.Были там какието сложности у меня с проверками.Буквально пол года назат делал что то подобное.
Мне надо было подсвечивать объекты на которые смотришь и взаимодействовать с ними.
гдето даже вся писанина эта лежит.Если сильно надо в шагай в скайп djon8011 Женя



Я все это делал , но вот как проверить покидает ли луч объект не догадался , забросил в итоге. Если подскажите буду очень признателен)
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 10 дек 2016, 17:40

samana писал(а):Что-то запутался я немного.
Вы говорили
zxandruxazx56 писал(а):чтобы когда луч длинною в метр пускающийся через середину экрана (прицел как в шутере) достигал объекта

тогда выходит что вам нужно изменение материала, только когда объект "касается" середины экрана, а мышь тут не причём.
Или вам не важно нацелены ли прицелом (центром экрана) на объект или нет, а просто если находимся к объекту меньше чем на метр, то этот объект должен реагировать на мышь и менять материал?


Мне надо чтобы когда я указателем мыши , который у меня находится строго в середине экрана , нацеливался прямо на объект , тот в свою очередь менял материал , и чтобы все это работало тогда, когда игрок находится в менее метра от объекта
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение Anonymyx 10 дек 2016, 18:54

Проверить ссылку на объект. Если в переменной находится нужный объект -меняем материал. Если нет - меняем обратно.
OnMouse события были бы попроще. Не знаю почему вам они не подходят.
ЗЫ. Непривычно как-то, сори если что. Могу тупить.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 10 дек 2016, 19:05

Anonymyx писал(а):Проверить ссылку на объект. Если в переменной находится нужный объект -меняем материал. Если нет - меняем обратно.
OnMouse события были бы попроще. Не знаю почему вам они не подходят.
ЗЫ. Непривычно как-то, сори если что. Могу тупить.


Мне любое средство подойдет , лишь бы работало
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение samana 10 дек 2016, 20:29

Тогда сделайте так, как вам предложили.
Так как луч надо пускать из центра экрана, значит надо пускать его из камеры. Этот скрипт пускает луч из камеры MainCamera, но вы можете изменить и на другую, если надо. Укажите в инспекторе этого скрипта слойМаску, который назначен всем вашим объектам, которые надо подсветить.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CameraScript : MonoBehaviour
{
    public LayerMask overObjectMask;

    CheckItem _currentObject;

    void Update()
    {
        RaycastHit hitInfo;
        Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
        //если луч наткнулся на объект, принадлежащий указанному слою
        if (Physics.Raycast(ray, out hitInfo, 1, overObjectMask))
        {
            //если какой-то объект уже был подсвечен и тот объект не является текущим (в который попал луч сейчас),
            //то меняем у того объекта материал на дефолтный
            if (_currentObject != null && _currentObject.gameObject != hitInfo.collider.gameObject)
            {
                _currentObject.setStandartMaterial();
            }

            //запоминаем текущий объект в который попал луч и подсвечиваем его материалом
            _currentObject = hitInfo.collider.GetComponent<CheckItem>();
            _currentObject.setNewMaterial();
        }
        //если луч не наткнулся но объект из указанного слоя, то меняем у последнего подсвеченного объекта материал на дефолтный.
        else
        {
            if (_currentObject != null) _currentObject.setStandartMaterial();
        }
    }
}


А этот скрипт повесить на те объекты, которые должны подсвечиваться.

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CheckItem : MonoBehaviour
{
    public Material newMat;

    Renderer _renderer;
    private Material _standartMat;

    void Start()
    {
        _renderer = GetComponent<Renderer>();
        _standartMat = _renderer.material;
    }

    public void setStandartMaterial()
    {
        _renderer.material = _standartMat;
    }

    public void setNewMaterial()
    {
        _renderer.material = newMat;
    }
}


Не забудьте для каждого объекта со скриптом выше назначить слойМаску.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 11 дек 2016, 10:47

samana писал(а):Тогда сделайте так, как вам предложили.
Так как луч надо пускать из центра экрана, значит надо пускать его из камеры. Этот скрипт пускает луч из камеры MainCamera, но вы можете изменить и на другую, если надо. Укажите в инспекторе этого скрипта слойМаску, который назначен всем вашим объектам, которые надо подсветить.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CameraScript : MonoBehaviour
{
    public LayerMask overObjectMask;

    CheckItem _currentObject;

    void Update()
    {
        RaycastHit hitInfo;
        Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
        //если луч наткнулся на объект, принадлежащий указанному слою
        if (Physics.Raycast(ray, out hitInfo, 1, overObjectMask))
        {
            //если какой-то объект уже был подсвечен и тот объект не является текущим (в который попал луч сейчас),
            //то меняем у того объекта материал на дефолтный
            if (_currentObject != null && _currentObject.gameObject != hitInfo.collider.gameObject)
            {
                _currentObject.setStandartMaterial();
            }

            //запоминаем текущий объект в который попал луч и подсвечиваем его материалом
            _currentObject = hitInfo.collider.GetComponent<CheckItem>();
            _currentObject.setNewMaterial();
        }
        //если луч не наткнулся но объект из указанного слоя, то меняем у последнего подсвеченного объекта материал на дефолтный.
        else
        {
            if (_currentObject != null) _currentObject.setStandartMaterial();
        }
    }
}


А этот скрипт повесить на те объекты, которые должны подсвечиваться.

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CheckItem : MonoBehaviour
{
    public Material newMat;

    Renderer _renderer;
    private Material _standartMat;

    void Start()
    {
        _renderer = GetComponent<Renderer>();
        _standartMat = _renderer.material;
    }

    public void setStandartMaterial()
    {
        _renderer.material = _standartMat;
    }

    public void setNewMaterial()
    {
        _renderer.material = newMat;
    }
}


Не забудьте для каждого объекта со скриптом выше назначить слойМаску.




Все сделал как вы сказали
Изображение
Изображение
Но все равно не работает , блин , как же победить это дело ((
Изображение
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10

Re: Подсвечивание объекта на определенном расстоянии мышкой

Сообщение zxandruxazx56 11 дек 2016, 11:00

А все , сорян ребята , все работает , просто на сцене было 2 камеры , от одной из которых надо было избавиться.
Респект всем кто помогал!!! :ymparty:
zxandruxazx56
UNец
 
Сообщения: 23
Зарегистрирован: 30 май 2016, 08:10


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11