Помощь с OnTriggerEnter/Exit

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

Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 17:15

Доброго времени суток. недавно начал изучать unity. Сейчас изучаю Уроки по программированию RPG на c#, по ходу изменяю скрипты под себя.Столкнулся с такой проблеммой:
есть ENEMY, с AI
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;


public class EnemyAI: MonoBehaviour {
       
        public Transform target;
        public int moveSpeed;
        public int rotSpeed;
        public float minDis;
        private Transform myTransform;
       
       
        void Awake(){
                myTransform = transform;
        }
       
        void Start () {

                target = null;
        }
       

        void Update () {
                if(target){
                        float dist = Vector3.Distance(target.position,myTransform.position);
                myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation
                                                        (target.position-myTransform.position),
                                                        rotSpeed*Time.deltaTime);
                        if(dist>minDis){
                myTransform.Translate(0,0,moveSpeed*Time.deltaTime);
                        }
                }
        }
       
        void OnTriggerEnter(Collider other){
                if(other.CompareTag("Player")){
                        target = other.transform;
                }
        }
       
        void OnTriggerExit(Collider other){
                if(other.CompareTag("Player")){
                        target = null;
                }
        }
}

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

public class NPSStatusBar : MonoBehaviour {

        public int maxH;
        public int maxM;
        public int maxE;
        private int _curH;
        private int _curM;
        private int _curE;
        private float _StatBarL;
        private bool _showBars;
        // Use this for initialization
        void Start () {
                //health
                if(maxH<1)maxH=1;
                _curH = maxH;
                //mana
                if(maxM<1)maxM=1;
                _curM = maxM;
                //edurance
                if(maxE<1)maxE=1;
                _curE = maxE;
                //////////////////
                _StatBarL = Screen.width/6;
                _showBars = false;     
       
        }
       
        // Update is called once per frame
        void Update () {
               
       
        }
        void OnGUI(){
                if(_curH<=0)
                {
                        HideBars();
                }
                else
                {
                        if(_showBars){
                GUI.Box(new Rect(Screen.width/2-_StatBarL/2,10,_StatBarL,20),"health"+_curH+"/"+maxH);
                GUI.Box(new Rect(Screen.width/2-_StatBarL/2,40,_StatBarL,20),"mana"+_curM+"/"+maxM);
                GUI.Box(new Rect(Screen.width/2-_StatBarL/2,70,_StatBarL,20),"edurance"+_curE+"/"+maxE);
                }
                }
               
        }
        public void Change_curH(int chH){
                _curH -= chH;
                if(_curH<0)_curH = 0;
                if(_curH>maxH)_curH = maxH;
               
        }
       
                public void Change_curM(int chM){
                _curM -= chM;
                if(_curM<0)_curM = 0;
                if(_curM>maxM)_curM = maxM;
               
        }
       
                public void Change_curE(int chE){
                _curE -= chE;
                if(_curE<0)_curE = 0;
                if(_curE>maxE)_curE = maxE;
               
        }
        public void ShowBars(){
                _showBars = true;
        }
        public void HideBars(){
                _showBars = false;
        }
       
       
}

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

public class TargetingPlayer : MonoBehaviour {

        //public Transform myTransform;
        public Transform targetE;
       
        void Start(){
        //myTransform = transform;
                targetE = null;
        }
       
        void OnTriggerEnter(Collider other1){
                if(other1.CompareTag("Enemy")){
                        targetE = other1.transform;
                        NPSStatusBar NPSSB = (NPSStatusBar)targetE.gameObject.GetComponent("NPSStatusBar");
                        NPSSB.ShowBars();
                }
        }
       
        void OnTriggerExit(Collider other1){
                if(other1.CompareTag("Enemy")){
                        NPSStatusBar NPSSB = (NPSStatusBar)targetE.gameObject.GetComponent("NPSStatusBar");
                        NPSSB.HideBars();
                        targetE = null;
                }
        }

}

У enemy есть spere collider (is Trigger), когда игрок входит в тригер енеми поворачивается и преследует его до тех пор пока игрок не покинет тригер.(отлично работает)
У игрока в свою очередь есть капсул колайдер(тоже тригер), "смотрящий вперед". И вот, когда в этот тригер попадает енеми должны отобразиться статус бары енеми. Смоти не смотри на енеми ничего не отображается, а вот если я вхожу в тригер енеми, то все статус бары отображаются, выхожу - скрываются, а должно только при взгляде. Тригер "взгляда" цеплял и на FPS player и на камеру, ни каких результатов. Помогите разобраться, что не так я делаю. P.S. читал темку про взгляд с помощью view frustum, но мне надо разобраться именно с тригерами.
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение artk 08 сен 2011, 17:39

Я бы сделал на событие при наведении мышки на объект. Или рейкастом. Так точнее, практичнее и быстрее.
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 18:35

Спасибо за совет так и попробую сделать при выборе врага.
Но меня интересуют именно тригеры. вот еще что замети: добавляю еще енеми, ставлю им таги плейер, и кидаю им скрипт движения вперед, по идее они должны агрится друг на друга, но ничего не происходит, и вот еще что, когда они проходят через меня, то если я не двинусь с места, находясь в их тригерах, то они меня невидят :( в чем же загвоздка, где реакция :-?
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение seaman 08 сен 2011, 18:52

Для последнего, думаю, нужно использовать:
Collider.OnTriggerStay
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 20:27

onTriggerStay не помог( ну да ладно эт на руку то что он меня не видит, тригер по идее зона слышимости(услышал, чето сделал, я не двигаюсь он не слышит :) ) остался вопрос взаимодействия "чаров" между собой.
из енеми сделал NPC(с соответствующим тегом), на нем только скрипт переммешения вперед и все. дописал AI
Синтаксис:
Используется csharp
        void OnTriggerEnter(Collider other){
                if((other.CompareTag("Player"))||other.CompareTag("NPC")){
                        target = other.transform;
                }
        }
       
        void OnTriggerExit(Collider other){
                if((other.CompareTag("Player"))||other.CompareTag("NPC")){
                        target = null;
                }
        }

енеми на меня агрится, а на проходящего нпс не реагирует. как так?(
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 21:23

разобрался :D, кароче чтоб нпс енеми и другая шушара реагировала друг на друга над и characterController добавить(component->physics->characterController или в AI(или еще куда) добавить [RequireComponent (typeof(CharacterController))])
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение artk 08 сен 2011, 21:29

У меня тоже были проблемы с триггерами. Не срабатывает коллизии у коллайдера, когда триггер движется, особенно когда он вращается. Можно сделать триггер большой сферой, с ингнором коллизии со всем лишнем, включая самого себя. А потом определять в каком направлении находиться цель.
П.С. Еще, если вещать к CharacterController коллайдер, то это может глючить. И у вас NPC не игнорит сам себя. Он будет всегда нацелен на себя, а если игрок близко, то, по if, он нацелиться на плейера.
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 21:43

Спасибо что подметили, а не подскажете как заставить нпс игнорить себя?
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 21:48

кстати, если скажем на енеми повесить еще тригер(хз за чем, болишим радиусом чтоб унюхал :D ) как в коде указать какой тригер пересечен?
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 08 сен 2011, 22:05

Ну вроде нпс не агрится сам на себя, но на всякий случай добавил вот что
Синтаксис:
Используется csharp
        void OnTriggerEnter(Collider other){
        if((((other.CompareTag("Player"))||(other.CompareTag("NPC"))))&&(other.transform!=myTransform.transform)){
                        target = other.transform;
                }
        }
       
        void OnTriggerExit(Collider other){
                if((((other.CompareTag("Player"))||(other.CompareTag("NPC"))))&&(other.transform!=myTransform.transform)){
                        target = null;
                }
        }
                void OnTriggerStay(Collider other){
        if((((other.CompareTag("Player"))||(other.CompareTag("NPC"))))&&(other.transform!=myTransform.transform)){
                        target = other.transform;
                }
        }

и кстати прикрутил оnTriggerStay, получилось вот что: нпс бежит за мной, я подбегаю к енеми, тот агрится на меня, в его тригер входит нпс енеми бежит на него, я выхожу из тригера нпс но остаюсь в тригере енеми, нпс куда-то убегает(скрипт:бежать вперед), выходит из зоны действия енеми и енеми агрится на меня, я выбегаю из тригера енеми и он останавливается, и вроде все довольны(глюков нет :) )
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 09 сен 2011, 01:00

Если где-то ошибся в коде или можно сделать лучше, пожалуйста поправьте
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение henzosergei 09 сен 2011, 15:09

и вот еще не решенный вопрос. как в коде различать несколько тригеров повешенных на модель? (снизу пример)
henzosergei писал(а):кстати, если скажем на енеми повесить еще тригер(хз за чем, болишим радиусом чтоб унюхал :D ) как в коде указать какой тригер пересечен?

помогите кто знает, буду очень признателен :)
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Re: Помощь с OnTriggerEnter/Exit

Сообщение seaman 09 сен 2011, 15:14

А Вы вообще пробовали два коллайдера на один объект повесить? Явно нет. Иначе не было бы такого вопроса.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Помощь с OnTriggerEnter/Exit

Сообщение Zaicheg 09 сен 2011, 16:06

seaman писал(а):А Вы вообще пробовали два коллайдера на один объект повесить? Явно нет. Иначе не было бы такого вопроса.

Если это намёк на то, что два коллайдера на один ГО повесить нельзя, то замечу, что можно. Только они должны быть разными (напр, BoxCollider и SphereCollider).

кстати, если скажем на енеми повесить еще тригер(хз за чем, болишим радиусом чтоб унюхал :D ) как в коде указать какой тригер пересечен?

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

Re: Помощь с OnTriggerEnter/Exit

Сообщение seaman 09 сен 2011, 16:31

Намек был на то, что нужно добавить дочерний GO и на него повесить допколлайдер с соответствующим скриптом обработки коллайдера. Тогда проблема различения коллайдеров отпадет сама собой.

ЗЫ: а вопрошающий хочет два SphereCollider-а с разными радиусами.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

След.

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

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

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