OnMouseEnter/OnMouseDown и т.д

Общие вопросы о Unity3D

OnMouseEnter/OnMouseDown и т.д

Сообщение GFreeman 15 авг 2011, 08:48

Здравствуйте уважаемые Форумчане.
Юнити занимаюсь всего пару месяцев, так что извините если вопросы некорректны, но в процессе работы столкнулся с такой проблемой:
А проблема заключается в использовании таких очень полезных функцию как OnMouseEnter/OnMouseDown и прочее. Поскольку при своей работе они используют колизию мешов то скрипт совсем не срабатывает если в перфабе, к которому он прикреплен присутствует более одной меши (при условии что скрипт мы кидаем на корень-родителя а не на потомков-мешей). Так вот я хотел узнать, есть ли способ заставить сработать эти функции не доходя до маразма, прикреплением скрипта к каждой меши, из которой состоит перфаб?
И еще вопрос не совсем в тему, но вспомнил пока писал: В свое время нашел на форуме пару тем, по поводу полоски жизней в стратегии, но универсального решения так и не нашел, может быть кто-нибудь разобрался с этой проблемой?
GFreeman
UNец
 
Сообщения: 4
Зарегистрирован: 03 июл 2011, 11:08

Re: OnMouseEnter/OnMouseDown и т.д

Сообщение Zaicheg 15 авг 2011, 10:08

Можете перейти с OnMouse на рейкасты.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: OnMouseEnter/OnMouseDown и т.д

Сообщение GFreeman 15 авг 2011, 10:27

А поподробней можно (какой-нибудь пример)?Как допустим проецируется луч из курсора (просто вообще не знаю как это на юнити делается)
GFreeman
UNец
 
Сообщения: 4
Зарегистрирован: 03 июл 2011, 11:08

Re: OnMouseEnter/OnMouseDown и т.д

Сообщение Zaicheg 15 авг 2011, 10:32

Camera.ScreenPointToRay
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: OnMouseEnter/OnMouseDown и т.д

Сообщение Genusatplay 15 авг 2011, 12:09

когда писал подсветку, из за срочности, сделал через опу, зато быстро, вешал на все подобъекты и родителя и задавался тэг "CanSelect", родитель имел имя с постфиксом "main" , префикс у объекта и подобъекта одинаковый и состоит из 2 цифр, есть просто подсветка и есть установка мигания между материалами лерп1 и лерп2
мб пригодится
Синтаксис:
Используется csharp
using UnityEngine;

using System.Collections;



public class OverMouseEventBroadcast : MonoBehaviour {

       

        Material[] overMouseMaterial;  //сохраняем overmousematerial'ы в массив для нормального селекта

        Material[] myMaterial;  // сохраняем дефолтный материал в массив

        Material[] lerpOneM;    // сохраняем lerpMaterialOne в массив, такого же размера сколько и материалов по дефолту

        bool lerpOn = false;

        public Material singleMaterialOverMouse;

        public Material lerpMaterialOne;

        public Material lerpMaterialTwo;

       

        // Use this for initialization

        void Start () {

                lerpOneM = new Material[this.renderer.materials.Length];

                for ( int i=0;i<this.renderer.materials.Length;i++){

                        lerpOneM[i] = lerpMaterialOne;

                }              

               

                myMaterial = new Material[this.renderer.materials.Length];

                for (int i=0;i<this.renderer.materials.Length;i++){

                        myMaterial[i] = this.renderer.materials[i];    

                }              

               

                overMouseMaterial = new Material[this.renderer.materials.Length];

                for (int i=0;i<overMouseMaterial.Length;i++){

                        overMouseMaterial[i] = singleMaterialOverMouse;

                }                                          

        }

       

        // Update is called once per frame

        void Update () {

                if (lerpOn){

                        for (int i=0;i<renderer.materials.Length;i++){

                                float lerpTime = Mathf.PingPong(Time.time, 1.0f);

                                renderer.materials[i].Lerp(lerpMaterialOne,lerpMaterialTwo,lerpTime);

                        }              

                }      

        }

       

        public void StartLerp(string ves){

                if ( name.Substring(0,2) == ves ){

                        renderer.materials = lerpOneM;

                        lerpOn = true;

                        Update();

                }

        }

       

        public void StopLerp(string ves){

                if ( name.Substring(0,2) == ves ){

                        renderer.materials = myMaterial;

                        lerpOn = false;

                        Update();

                }

        }

       

        public void SelectOn(string ves ){

                if ( name.Substring(0,2) == ves && !lerpOn){

                        renderer.materials = overMouseMaterial;

                }

        }

       

        public void SelectOff(string ves){

                if ( name.Substring(0,2) == ves && !lerpOn){

                        renderer.materials = myMaterial;

                }

        }

       

        void OnMouseEnter() {

                if ( name.Substring(name.Length-4,4) == "main"){

                        BroadcastMessage("SelectOn",name.Substring(0,2));

                } else {

                        foreach ( GameObject tagObj in GameObject.FindGameObjectsWithTag("CanSelect") ){

                                if (tagObj.name.Substring(0,2) == name.Substring(0,2) && tagObj.name.Substring(tagObj.name.Length-4,4) == "main"){

                                        tagObj.BroadcastMessage("SelectOn",name.Substring(0,2));

                                        renderer.materials = overMouseMaterial;

                                }

                        }

                }

               

        }

        void OnMouseExit() {

                if ( name.Substring(name.Length-4,4) == "main"){

                        BroadcastMessage("SelectOff",name.Substring(0,2));

                } else {

                        foreach ( GameObject tagObj in GameObject.FindGameObjectsWithTag("CanSelect") ){

                                if (tagObj.name.Substring(0,2) == name.Substring(0,2) && tagObj.name.Substring(tagObj.name.Length-4,4) == "main"){

                                        tagObj.BroadcastMessage("SelectOff",name.Substring(0,2));

                                        renderer.materials = myMaterial;

                                }

                        }

                }

               

        }

}

 
Genusatplay
UNIт
 
Сообщения: 59
Зарегистрирован: 04 июн 2011, 11:59
Откуда: Ростов-на-Дону

Re: OnMouseEnter/OnMouseDown и т.д

Сообщение GFreeman 15 авг 2011, 18:00

Неет, этот вариант вряд ли подойдет. В одной из моих моделей несколько десятков мешей (и это не самая сложная) и кидать скрипт на каждую просто маразм. Вообще я сейчас хочу реализовать что-то вроде всплывающей подсказки на объекте при наведении мыши на него. Скрипт с текстом, загружаемый в GUI я прикрепляю к перфабу, содержащим меш. Работает только если в перфабе есть только одна меш, работает, если подсоединить скрипт, непосредственно к меши, но совсем не работает если подсоединить к перфабу, а мешей в нем больше двух. На других движках делал это через трасировку лучей до объекта, а потом поднимался по дереву до вершины и оттуда уже брал данные. А вот как такое же реализовать на юнити вообще не представляю. Как опредилить какой именно объект пересекает луч?
GFreeman
UNец
 
Сообщения: 4
Зарегистрирован: 03 июл 2011, 11:08

Re: OnMouseEnter/OnMouseDown и т.д

Сообщение Genusatplay 15 авг 2011, 19:17

ну отсюда копать -> Physics.Raycast
hit.collider.gameObject.name
Genusatplay
UNIт
 
Сообщения: 59
Зарегистрирован: 04 июн 2011, 11:59
Откуда: Ростов-на-Дону


Вернуться в Общие вопросы

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

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