Помощь с OnTriggerEnter/Exit

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

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

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

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

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

Сообщение henzosergei 12 сен 2011, 23:16

Всем доброго времени суток. Пользуясь всеобщей поддержкой получилось вот что:
есть FPSplayer, есть енеми, к енеми прикреплено две пустышки(одна зона слышимости(сфера колайдер), другая зона видимости(типа пирамида), обе соответственно тригеры(кста "пирамида" взгляда сделана в майе и чтобы правильно реагировала в настройках меш колайдера выставлен convex)).Ну так вот енемиАИ скрипт таков:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

[RequireComponent (typeof(CharacterController))]
public class EnemyAI: MonoBehaviour {
       
        public Transform target;
        public int moveSpeed;
        public int rotSpeed;
        public float minDis;
        private Transform myTransform;

        //opredelenie celi===========
        private bool _targDaNo;
        public bool _sluh;
        public bool _vzglyad;
    //===========================

       
        void Awake(){
                myTransform = transform;
        }
       
        void Start () {

                target = null;
                _sluh = false;
                _vzglyad = false;
                _targDaNo = false;
               
        }
       

        void Update () {
                if(target){
                        if(_sluh){
                                               
                                        myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation
                                                        (target.position-myTransform.position),
                                                        rotSpeed*Time.deltaTime);
                        }
                        if(_vzglyad){
                               
                               
                                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);
                                                        }
                       
                        }

                       
                }
        }
       
        public void GetTargetSluh(Collider targPoint,bool sluhT,bool targDANOT){
                if(!targDANOT){
                        target = null;
                        _sluh = sluhT;
                       
                }
                else {
                       
                        target = targPoint.transform;
                        _sluh = sluhT;
                }
                               
        }
        public void GetTargetVzglyad(Collider targPoint,bool vzglyadT){
                target = targPoint.transform;
                _vzglyad = vzglyadT;
        }

               
}
 

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

public class EnemySluh : MonoBehaviour {
        public Transform target;
                //opredelenie celi===========
        private bool _targDaNo;
        private bool _sluh;
    //===========================
        // Use this for initialization
        void Start () {
       
               
        }
       
        // Update is called once per frame
        void Update () {
       
        }
       
        void OnTriggerEnter(Collider other){
        if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
                        _targDaNo = true;
                        _sluh = true;
               
                        EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
                        EAI.GetTargetSluh(other,_sluh,_targDaNo);
                       
                }
        }
       
        void OnTriggerExit(Collider other){
        if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
                        _targDaNo = false;
                        _sluh = false;
                       
                        EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
                        EAI.GetTargetSluh(other,_sluh,_targDaNo);
                       
                }
        }
       
                void OnTriggerStay(Collider other){
        if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
                        _targDaNo = true;
                        _sluh = true;
                       
                        EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
                        EAI.GetTargetSluh(other,_sluh,_targDaNo);
                       
                }
        }
}
 

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

public class EnemyVzglyad : MonoBehaviour {
        public Transform target;
                //opredelenie celi===========

        private bool _vzglyad;
    //===========================
       
        void Start () {
       
               
        }
       
        // Update is called once per frame
        void Update () {
       
        }
       
        void OnTriggerEnter(Collider other){
        if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
                       
                        if(!Physics.Linecast(target.position,other.transform.position)){
                                                _vzglyad = true;
                        EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
                        EAI.GetTargetVzglyad(other,_vzglyad);
                        }

                       
                }
        }
       
        void OnTriggerExit(Collider other){
        if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
                        _vzglyad = false;
                        EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
                        EAI.GetTargetVzglyad(other,_vzglyad);
                       
                }
        }
       
                void OnTriggerStay(Collider other){
        if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
                       
                        if(!Physics.Linecast(target.position,other.transform.position)){
                                                _vzglyad = true;
                        EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
                        EAI.GetTargetVzglyad(other,_vzglyad);
                        }

                       
                }
        }
}
 

В итоге все нормально работает, когда меня енеми слышит он поворачивается а если видит то преследует, но есть загвоздка в препятствиях: в скрипте взгляда стоит linecast, но если даже между игроком и енеми есть скажем стандартный box, то он все равно меня видит. Подскажите в чем я ошибся. ЗЫ:ссылаясь на подобные темы форума условие менял таким образом
Синтаксис:
Используется csharp
                        RaycastHit hit;
                        if(!Physics.Linecast(target.position,other.transform.position,hit)){
, но выдает ошибку - use of unassigned local variable "hit". оч нужна помощь
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

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

Сообщение sp00n 13 сен 2011, 12:57

Вы пытаетесь использовать не созданный объект. Попробуйте:
Синтаксис:
Используется csharp
 RaycastHit hit = new RaycastHit();
Ты молод, креативен, талантлив?
Амбициозен, уверен в себе, полон свежих идей?
А делать хоть что-нибудь умеешь?!
sp00n
UNITрон
 
Сообщения: 254
Зарегистрирован: 27 фев 2010, 20:43

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

Сообщение seaman 13 сен 2011, 13:04

Неправильный ответ. Не путайте человека. Почитайте справку по Linecast. Какой модификатор стоит у hitinfo? У вопрошающего его нет - оттого и ошибка.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение sp00n 13 сен 2011, 13:47

seaman писал(а):Неправильный ответ. Не путайте человека. Почитайте справку по Linecast. Какой модификатор стоит у hitinfo? У вопрошающего его нет - оттого и ошибка.
Действительно. Мои извинения - просто прочитал текст ошибки, не глянув справку :(
henzosergei , мой ответ неправилен.
Ты молод, креативен, талантлив?
Амбициозен, уверен в себе, полон свежих идей?
А делать хоть что-нибудь умеешь?!
sp00n
UNITрон
 
Сообщения: 254
Зарегистрирован: 27 фев 2010, 20:43

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

Сообщение henzosergei 13 сен 2011, 14:04

Спасибо всем кто ответил, решение данной проблемы в другой темеhttp://unity3d.ru/distribution/viewtopic.php?f=18&t=5517 все решено :)
henzosergei
UNец
 
Сообщения: 22
Зарегистрирован: 08 сен 2011, 16:29

Пред.

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

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

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