Нужна помощь со скриптом турели.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Нужна помощь со скриптом турели.

Сообщение vessen 23 апр 2013, 19:16

Замучился уже с этим скриптом. Не хочет турель плавно поворачиваться при выборе новой цели. При ведении захваченной цели- все нормально, плавно вращается. Где ошибка ума не приложу...

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

public class Turrets : MonoBehaviour {
        public GameObject Guns;//Объект орудий
        public GameObject PointGun1,PointGun2,PointGun3,PointGun4;//Точки выстрела вешаются на концы орудий
        public GameObject Platforma;//Платформа на которой орудия находятся
        public GameObject Target;//Цель
        public GameObject BulletPref;//Префаб пули
        public float MaxAngle;//Угол возвышения орудий
        public string Tag1,Tag2;//Тэги целей
        public float AgroRadius;//Радиус обнаружения целей
        public float DistanceFire;//Дальность стрельбы                
        public float MaxRot;// Max сила ротации
        public float shootSpeed = 1;
    public float lastShotTime,LastTimeDisor;
        public float TimeDisor;//Время ведения цели до переключения на новую цель в нулевом секторе огня
        public float TimeNewTar;//Время до переключения на новую цель
        float Ugol,TimeNewTar1;
        Quaternion rotateTo1,rotateTo2;
        float yRot;
        string TargetTag;//тег таргета
        private Quaternion ZeroRot; //  кватернион нулевой позиций поворота
        // Use this for initialization
        void Start () {
        lastShotTime=0;
               
        }
        void LockTarget (){//Поиск и захват цели,цель выбирается Всяко ))
                //int Len;//число целей на сцене
                float Distanc;//Дистанция до цели
                GameObject <img src="./images/smilies/unmarked.gif" alt="[]" title="Запланировано" /> gos;//Массив для целей
                gos = GameObject.FindGameObjectsWithTag(TargetTag);//Пишем в массив цели
                //if (gos==null) return;//Если пусто-выходим
            if (gos.Length==0) return;
                if ((TargetTag == "Player") && (gos!=null)) {Target = gos[0];return;}//Если цель игрок то запись в таргет игрока и выход
                //Len =(int)(Random.Range(0,gos.Length-1));//Рандомная выборка цели
                //Target = gos [Len];
                //Debug.Log(gos.Length);
               
                Distanc = Vector3.Distance(transform.position,gos[0].transform.position);//Записываем дистанцию до 1-го ГО    
                Target = gos[0];//Запись в таргет 1-го ГО
       
        //Выбираем ближнюю цель             
                foreach (GameObject go in gos){
                if (Distanc>Vector3.Distance(transform.position,go.transform.position)){
                                Distanc=Vector3.Distance(transform.position,go.transform.position);
                                Target = go;
                        }
                       
                }      
               
           if (Vector3.Distance(transform.position,Target.transform.position)>AgroRadius) Target=null;//Если цель далеко вырубаем ее
       
       
        }
       
        void Attack (){
       
               
                float Distance = Vector3.Distance(transform.position,Target.transform.position);//Дистанция до цели
                Uprejdenie upr = this.gameObject.GetComponent <Uprejdenie> ();//Получаем доступ к скрипту упреждения
                upr.Target = Target;//Передаем цель
                //upr.pos - получение позиции для стрельбы
        Vector3 posit =upr.pos;
       
               
                if ((Random.value>0.5f)&&(Target.tag=="Player")) posit += new Vector3(0,0,-5);//Даем шанс игроку )))
             

                rotateTo1 = Quaternion.LookRotation(posit - Platforma.transform.position);//Слежение орудий за целью
                rotateTo2 = Quaternion.LookRotation(posit - Guns.transform.position);
               
                Platforma.transform.rotation = Quaternion.Slerp(Platforma.transform.rotation,rotateTo1,Time.deltaTime*MaxRot);
               
         
           Platforma.transform.localRotation = Quaternion.Euler(0.0f,Platforma.transform.localRotation.eulerAngles.y,0.0f);//Врвщение только по y
               
                Guns.transform.rotation = Quaternion.Slerp(Guns.transform.rotation,rotateTo2,Time.deltaTime*MaxRot);   
           
        Guns.transform.localRotation = Quaternion.Euler(Guns.transform.localRotation.eulerAngles.x,0.0f,0.0f);//Вращение только по X и Y
                               
       
                {
        float Ang = AngleAroundAxis(Guns.transform.forward,posit,Vector3.forward); //Угол между целью и орудиями
             
                                if ((Ang>-20)&&(Ang<20)&&(Time.time>(lastShotTime + shootSpeed))&&((Distance)<DistanceFire)&&(Ugol<0)){
                               
                if (PointGun1)  Instantiate(BulletPref ,PointGun1.transform.position,PointGun1.transform.rotation);
          if (PointGun2)   Instantiate(BulletPref ,PointGun2.transform.position,PointGun2.transform.rotation);
                 lastShotTime = Time.time;
                 LastTimeDisor = 0;     //Обнуляем таймер слежения
                        }
                //
        }
               
        if (LastTimeDisor>=TimeDisor) Target = null;//Если превысили время слежения в мертвом секторе переключаемся на другую
        }
       
       
        // Update is called once per frame
        void Update () {
       
                if (Target) Attack ();//Если цель есть-атакуем ее
               
                else {
                //      rotateTo = Quaternion.LookRotation(new Vector3(0,0,0)-transform.position);
                 TimeNewTar1+=Time.deltaTime;
                       
                  if (TimeNewTar1>=TimeNewTar) {       
                        TimeNewTar1=0; 
                        if (Random.value>=.5f) TargetTag=Tag1;//Если цели нет выбираем рандомно ее тег ( 50 на 50)
                               
                           else  TargetTag=Tag2;
               
                        LockTarget ();
        }
                }
               
        }

               
       
        // The angle between dirA and dirB around axis
float  AngleAroundAxis (Vector3 dirA ,Vector3 dirB,Vector3 axis) {
            // Project A and B onto the plane orthogonal target axis
            dirA = dirA - Vector3.Project (dirA, axis);
            dirB = dirB - Vector3.Project (dirB, axis);
           
            // Find (positive) angle between A and B
           float angle  = Vector3.Angle (dirA, dirB);
           
            // Return angle multiplied with 1 or -1
            return angle * (Vector3.Dot (axis, Vector3.Cross (dirA, dirB)) < 0 ? -1 : 1);
        }

       
void LateUpdate ()
        {
                Ugol = AngleAroundAxis(Platforma.transform.forward,Guns.transform.forward,Platforma.transform.right);//Вычисляем угол возвышения
               
        if (Ugol>0) {
                        LastTimeDisor+=Time.deltaTime;//Цель не в секторе обстрела увеличиваем таймер слежения
                        Ugol = 0;
                Guns.transform.localRotation = Quaternion.Euler(0.0f,0.0f,0.0f);//Вращение только по X и Y
               
                }      
        if (Ugol<MaxAngle) {
                        LastTimeDisor+=Time.deltaTime;
                        Ugol = MaxAngle;
                Guns.transform.localRotation = Quaternion.Euler(MaxAngle,0.0f,0.0f);//Вращение только по X и Y
                }      
        }                      
       

}


 
vessen
UNIт
 
Сообщения: 57
Зарегистрирован: 20 мар 2013, 22:24

Re: Нужна помощь со скриптом турели.

Сообщение Egoor 23 апр 2013, 22:42

Лучше сделать условие типа
Синтаксис:
Используется javascript
If(rotation.y < target.rotation.y)
rotation.y+=0.1;
 

...и вращать вручную. Можно улучшить, дописав определение кратчайшей стороны для поворота и т.д.
Everybody Lies
Аватара пользователя
Egoor
UNец
 
Сообщения: 47
Зарегистрирован: 10 июн 2012, 11:11

Re: Нужна помощь со скриптом турели.

Сообщение vessen 24 апр 2013, 18:18

А будет ли плавность при таком способе?
vessen
UNIт
 
Сообщения: 57
Зарегистрирован: 20 мар 2013, 22:24

Re: Нужна помощь со скриптом турели.

Сообщение vessen 24 апр 2013, 18:58

Все заработало ! Обычная невнимательность )))
vessen
UNIт
 
Сообщения: 57
Зарегистрирован: 20 мар 2013, 22:24


Вернуться в Почемучка

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

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