예제 #1
0
 void iniPiiTarget()
 {
     if (piiTarget == null)
     {
         piiTarget = GetComponent <PiiTarget>();
     }
 }
예제 #2
0
 void iniPiiTarget()
 {
     if (piiTarget == null)
     {
         piiTarget = gameObject.GetComponent <PiiTarget>();
     }
 }
예제 #3
0
    // Use this for initialization
    void Start()
    {
        rigidbody = GetComponent <Rigidbody>();
        piiTarget = GetComponent <PiiTarget>();

        ini_setings();
        ini_player();
    }
예제 #4
0
    void MoveNoPoint()
    {
        float DistPlayer = Vector3.Distance(gameObject.transform.position, player.transform.position);

        if (rigidbody != null && DistPlayer > 30)
        {
            //Если скорость довольно маленькая
            //уменьшаем радиус
            if (rigidbody.velocity.magnitude < 0.02f)
            {
                radius_face_ray -= Time.deltaTime * speed_face_ray;
            }
            else
            {
                radius_face_ray = 2;
            }

            //Проверка на препятствие впереди
            Ray faceNormal = new Ray(transform.position, transform.forward);

            RaycastHit faceHit;
            bool       face_triger = false;
            if (Physics.SphereCast(faceNormal, radius_face_ray, out faceHit))
            {
                faceTarget = faceHit.collider.gameObject.GetComponent <PiiTarget>();
                if (faceHit.distance < (5 + rigidbody.velocity.magnitude * 0.7f) && faceTarget != null && faceTarget.heath > 0 && faceTarget.MinPresure >= piiTarget.MinPresure)
                {
                    face_triger = true;
                }
            }
            else
            {
                faceTarget = null;
            }

            //скорость
            float max_speed = 3;

            int revers = 1;
            if (face_triger)
            {
                revers = -1;
            }


            float Stop = 1;
            if (DistPlayer < DistanceNoTraceStop)
            {
                Stop = DistPlayer / DistanceNoTraceStop;
            }

            //Прибавляем скорость если она маленькая
            if (rigidbody.velocity.magnitude < max_speed)
            {
                rigidbody.velocity = rigidbody.velocity + gameObject.transform.forward * 50f * Time.deltaTime * revers * Stop;
            }
        }
    }
예제 #5
0
    //Проверка на столкновения
    void TestRigidBody()
    {
        if (true)
        {
            Collider[] collider = null;
            //вытаскиваем колайдеры если их нет
            if (collider == null || collider.Length <= 0)
            {
                //collider = Physics.OverlapCapsule(gameObject.transform.position - gameObject.transform.localScale.y * transform.up/2, gameObject.transform.position + gameObject.transform.localScale.y * transform.up/2, capsuleCollider.radius * 2 * transform.localScale.x);
                collider = Physics.OverlapCapsule(gameObject.transform.position - gameObject.transform.localScale.y * transform.up / 2, gameObject.transform.position + gameObject.transform.localScale.y * transform.up / 2, 0.3f * 2 * transform.localScale.x);
            }

            //Если теперь колайдеры есть то проверяем их
            if (collider != null && collider.Length > 0)
            {
                //Перебираем все колайдеры
                for (int numColl = 0; numColl < collider.Length; numColl++)
                {
                    //Пытаемся получить пи таргет из колайдера
                    PiiTarget colliderPiiTarget = collider[numColl].GetComponent <PiiTarget>();
                    if (colliderPiiTarget != null)
                    {
                        //Проверяем что это не цунами?
                        TsunamiPartWave tsunamiPartWave = colliderPiiTarget.GetComponent <TsunamiPartWave>();
                        if (tsunamiPartWave == null)
                        {
                            //Это не цунами тогда наносим урон без прибавления очков игроку, если цель еще жива
                            if (colliderPiiTarget.heath > 0)
                            {
                                colliderPiiTarget.heath -= DamageTargets * Time.deltaTime;

                                if (colliderPiiTarget.heath <= 0)
                                {
                                    colliderPiiTarget.heath = 0;
                                    colliderPiiTarget.DeathTarget();
                                }
                            }
                        }

                        //Проверяем обьект на ригид боди
                        Rigidbody rigidbody = colliderPiiTarget.GetComponent <Rigidbody>();
                        if (rigidbody != null)
                        {
                            //Тестим на мочу
                            PiiPrefab piiPrefab = colliderPiiTarget.GetComponent <PiiPrefab>();
                            if (piiPrefab == null)
                            {
                                rigidbody.velocity       = rigidbody.velocity * Time.deltaTime * 4 + (transform.parent.up * 3 + transform.parent.forward * -1).normalized * SpeedTarget * Time.deltaTime;
                                rigidbody.freezeRotation = false;
                            }
                        }
                    }
                }
            }
        }
    }
예제 #6
0
 void iniPiiTarget()
 {
     if (piiTarget == null)
     {
         piiTarget = GetComponent <PiiTarget>();
     }
     if (piiTarget != null && !ThisTarget)
     {
         Destroy(piiTarget);
     }
 }
예제 #7
0
    private void OnTriggerEnter(Collider other)
    {
        PiiTarget target = other.GetComponent <PiiTarget>();

        if (target != null)
        {
            target.SetTimeToDelete(20);
        }
        if (target != null && target.heath > 0 && target.MinPresure < Presure)
        {
            target.TrigerPii(Presure * 1.1f, faceController, piiController, score_Text_3D.gameObject);
            player.percent_heath_last_target = target.heath / (target.get_start_heath() / 100);

            //Если в это время активны частицы
            if (Pii_particle != null && Pii_particle.isPlaying)
            {
                particle_play_now--;
                particle_this_play_yn = false;
                Pii_particle.Stop();
            }

            Destroy(gameObject);
        }
        //Если до урона не хватает совсем чучуть
        else if (!TestToDestroyTarget && target != null && target.heath > 0 && target.MinPresure > Presure && (target.MinPresure - target.MinPresure / 3) < Presure)
        {
            //Проверка на урон произведена
            TestToDestroyTarget = true;
            target.TrigerPiiFail(score_Text_3D.gameObject);
        }
        else if (target == null)
        {
            if (Pii_particle != null && Pii_particle.isPlaying != true && particle_play_now < 3)
            {
                ParticleSystem.MainModule mainmod = Pii_particle.main;
                mainmod.startSize  = Presure * 0.05f;
                mainmod.startSpeed = Presure * 0.1f;

                ParticleSystem.ShapeModule shapemod = Pii_particle.shape;
                shapemod.radius = distance_player * 0.05f;

                Pii_particle.Play();
            }
        }

        if (firstTriger)
        {
            TimeDie     = TimeLive + 1.5f;
            firstTriger = false;
            soundObject.set_new_pii(gameObject.GetComponent <PiiPrefab>());
        }
    }
예제 #8
0
    private void hit_piitarget(PiiTarget target, float hit)
    {
        target.TrigerPii(hit, null, null, hit_text);

        /*
         * if (target.heath > 0) {
         *  target.heath = target.heath - hit;
         *  if (target.heath <= 0) {
         *      target.DeathTarget();
         *  }
         * }
         */
    }
예제 #9
0
    private void OnTriggerEnter(Collider other)
    {
        PiiTarget target    = other.GetComponent <PiiTarget>();
        PiiTarget piiTarget = gameObject.GetComponentInParent <PiiTarget>();

        if (target != null && piiTarget != null && piiTarget != target && target.heath > 0 && target.MinPresure < (piiTarget.MinPresure))
        {
            //target.TrigerPii(Presure, faceController, piiController, score_Text_3D.gameObject);
            target.heath -= piiTarget.MinPresure * 500 * Time.deltaTime;
            if (target.heath <= 0)
            {
                target.DeathTarget();
            }
        }
    }
예제 #10
0
    void MovePoint()
    {
        //Узнаем скорость
        if (rigidbody != null && target_track_point != null)
        {
            //Если скорость довольно маленькая
            //уменьшаем радиус
            if (rigidbody.velocity.magnitude < 0.02f)
            {
                radius_face_ray -= Time.deltaTime * speed_face_ray;
            }
            else
            {
                radius_face_ray = 2;
            }

            //Проверка на препятствие впереди
            Ray        face = new Ray(transform.position, transform.forward);
            RaycastHit faceHit;
            bool       face_triger = false;
            if (Physics.SphereCast(face, radius_face_ray, out faceHit))
            {
                faceTarget = faceHit.collider.gameObject.GetComponent <PiiTarget>();
                if (faceHit.distance < (3 + rigidbody.velocity.magnitude * 0.7f) && faceTarget != null && faceTarget.heath > 0)
                {
                    face_triger = true;
                }
            }
            else
            {
                faceTarget = null;
            }

            //скорость
            float max_speed = target_track_point.max_speed / 3;

            int revers = 1;

            //Прибавляем скорость если она маленькая
            if (rigidbody.velocity.magnitude < max_speed && !face_triger)
            {
                rigidbody.velocity = rigidbody.velocity + gameObject.transform.forward * 50f * Time.deltaTime * revers;
            }
        }
    }
예제 #11
0
    void TestSiren_visual()
    {
        //Проверка жизни и выключение если умерла
        PiiTarget piiTarget = gameObject.GetComponent <PiiTarget>();

        if (piiTarget != null && piiTarget.heath <= 0)
        {
            police_active_now = false;
        }

        //Если нужно выключить
        if (!police_active_now && police_active_old)
        {
            police_active_old = false;
            if (siren_blue != null)
            {
                siren_blue.Stop();
            }
            if (siren_red != null)
            {
                siren_red.Stop();
            }
        }

        //Если первый запуск
        if (police_active_now && !police_active_old)
        {
            police_active_old = true;
            //Запускаем первый фонарь сирены
            if (siren_blue != null)
            {
                siren_blue.Play();
            }
            //Ставим таймер запуска второй сирены
            pause_next_siren_play = 0.5f;
        }
        //Уменьшаем врямя и запускаем другую сирену если время вышло
        pause_next_siren_play -= Time.deltaTime;
        if (police_active_now && pause_next_siren_play <= 0 && siren_red != null && !siren_red.isPlaying)
        {
            siren_red.Play();
        }
    }
예제 #12
0
    // Use this for initialization
    void Start()
    {
        iniGameParam();
        iniSeting();

        rigidbody = GetComponent <Rigidbody>();
        if (TrackTo != null)
        {
            gameObject.transform.LookAt(TrackTo.transform);
        }
        piiTarget = gameObject.GetComponent <PiiTarget>();

        //Останавливаем фары
        if (left_face != null)
        {
            left_face.Stop();
        }
        if (right_face != null)
        {
            right_face.Stop();
        }
        if (left_botm != null)
        {
            left_botm.Stop();
        }
        if (right_botm != null)
        {
            right_botm.Stop();
        }
        speed_face_ray = Random.Range(0.8f, 1.5f);

        police = gameObject.GetComponent <police_car>();

        //Агрессия автомобиля
        Agress = Random.Range(20f, 80f);
        //Создаем источник звука под клаксон
        Create_BeepAudioSource();
    }
예제 #13
0
 // Use this for initialization
 void Start()
 {
     source = gameObject.GetComponent <AudioSource>();
     target = gameObject.GetComponent <PiiTarget>();
     get_seting_game();
 }
예제 #14
0
    public void BOOM()
    {
        if (Boom.Length != 0 && Random.Range(0, 100) < Veroatnost_boom)
        {
            //Звук
            if (audioSource != null)
            {
                audioSource.Stop();
                audioSource.maxDistance = 2000;
                audioSource.volume      = 1 * seting.game.volume_all * seting.game.volume_sound;
                audioSource.PlayOneShot(Boom[Random.Range(0, Boom.Length)]);
            }
            //Активируем партикл взрыва
            if (Explore != null)
            {
                ParticleSystem exp = Instantiate(Explore, gameObject.transform);
                exp.Play();
            }
            //Активируем дым
            if (Smoke != null)
            {
                ParticleSystem smo = Instantiate(Smoke, gameObject.transform);
                smo.Play();
            }

            size_boom_now = 0;
            boom_yn       = true;
            for (int num = 0; num < Targets.Length; num++)
            {
                Targets[num] = null;
            }
        }

        //Замена обьекта на разрушенную модель
        if (DestroyPrefabObj != null)
        {
            //Ищем оригинальный меш в самом обьекте
            MeshRenderer meshRenderer = gameObject.GetComponent <MeshRenderer>();
            //Если присутствует отключаем
            if (meshRenderer != null)
            {
                meshRenderer.enabled = false;
                //колайдер
                BoxCollider boxCollider = gameObject.GetComponent <BoxCollider>();
                if (boxCollider != null)
                {
                    boxCollider.enabled = false;
                }
            }

            //создаем разрушенное
            GameObject destroyObj = Instantiate(DestroyPrefabObj, gameObject.transform);
            //Перемещаем
            destroyObj.transform.position   = gameObject.transform.position;
            destroyObj.transform.localScale = new Vector3(1, 1, 1);
            destroyObj.transform.rotation   = new Quaternion();
        }

        GameObject player_obj  = GameObject.FindGameObjectWithTag("Player");
        float      player_dist = Vector3.Distance(player_obj.transform.position, gameObject.transform.position);

        //Открепляем отдельные детали обьекта
        if (OblomkiChastObj != null && OblomkiChastObj.Length > 0 && player_dist < min_dist_oblomki_create)
        {
            //перебираем части
            for (int num_oblomok = 0; num_oblomok < OblomkiChastObj.Length; num_oblomok++)
            {
                //Если часть существует
                if (OblomkiChastObj[num_oblomok] != null && Random.Range(0, 100) < 50)
                {
                    //Открепляем ее от объекта меняя родителя
                    Transform transform_parent = gameObject.GetComponentInParent <Transform>();
                    if (transform_parent != null)
                    {
                        //Поменяли родителя
                        OblomkiChastObj[num_oblomok].transform.parent = transform_parent.parent;
                        //Вытаскиваем ригидбоди
                        Rigidbody oblomok_rigidbody = OblomkiChastObj[num_oblomok].GetComponent <Rigidbody>();
                        //если ригид боди нету создаем
                        if (oblomok_rigidbody == null)
                        {
                            oblomok_rigidbody = OblomkiChastObj[num_oblomok].AddComponent <Rigidbody>();
                        }

                        //если у этого обьекта есть масса то обломок делаем частичной массы главного обьекта
                        Rigidbody gameobj_rigidbody = gameObject.GetComponent <Rigidbody>();
                        if (gameobj_rigidbody != null)
                        {
                            oblomok_rigidbody.mass = gameobj_rigidbody.mass / OblomkiChastObj.Length / 0.10f;
                        }
                        else
                        {
                            oblomok_rigidbody.mass = 1;
                        }

                        //придаем импульс
                        //////////////////

                        /*
                         * //считаем направление
                         * Vector3 vectorImpulse = Vector3.Normalize(OblomkiChastObj[num_oblomok].transform.position - gameObject.transform.position);
                         * //Чем массивнее тем слабее отталкивание
                         * float mass_koof = 0;
                         * if (oblomok_rigidbody.mass != 0)
                         *  mass_koof = 1 / oblomok_rigidbody.mass;
                         * float dist_koof = 0;
                         * float distance = Vector3.Distance(gameObject.transform.position, OblomkiChastObj[num_oblomok].transform.position);
                         * if (distance > 0)
                         *  dist_koof = 1 / distance;
                         * //Расчет силы оталкивания
                         * float inercia_strong = Damage * dist_koof * mass_koof * 0.02f;
                         * //Если сила отталкивания не слабая
                         * if (inercia_strong > 0.2f)
                         *  oblomok_rigidbody.velocity += inercia_strong * vectorImpulse;
                         */

                        //Тест бокс колайдела
                        BoxCollider oblomok_boxCollider = OblomkiChastObj[num_oblomok].GetComponent <BoxCollider>();
                        if (oblomok_boxCollider == null)
                        {
                            OblomkiChastObj[num_oblomok].AddComponent <BoxCollider>();
                        }

                        //Тест пии таргета
                        PiiTarget oblomok_piiTarget = OblomkiChastObj[num_oblomok].GetComponent <PiiTarget>();
                        if (oblomok_piiTarget == null)
                        {
                            oblomok_piiTarget = OblomkiChastObj[num_oblomok].AddComponent <PiiTarget>();
                        }
                        oblomok_piiTarget.heath      = 1;
                        oblomok_piiTarget.MinPresure = 1000;

                        /*
                         * destroy_timer destroy_Timer = OblomkiChastObj[num_oblomok].GetComponent<destroy_timer>();
                         * if (destroy_Timer == null) {
                         *  destroy_Timer = OblomkiChastObj[num_oblomok].AddComponent<destroy_timer>();
                         * }
                         * destroy_Timer.timer_starting = true;
                         */
                    }
                }
            }
        }

        //СОздаем префабы обломков
        if (OblomkiPrefabObj != null && OblomkiPrefabObj.Length > 0 && player_dist < min_dist_oblomki_create)
        {
            //перебираем части
            for (int num_oblomok = 0; num_oblomok < OblomkiPrefabObj.Length; num_oblomok++)
            {
                //Если часть существует
                if (OblomkiPrefabObj[num_oblomok] != null && Random.Range(0, 100) < 90)
                {
                    //Узнаем родителя
                    Transform transform_parent = gameObject.GetComponentInParent <Transform>();

                    //Создаем обьект
                    GameObject OblomokObj = Instantiate(OblomkiPrefabObj[num_oblomok], transform_parent.parent);
                    //Меняем позицию обломка
                    OblomokObj.transform.position = gameObject.transform.position + new Vector3(Random.Range(0, 1), Random.Range(0, 1) + 0.25f, Random.Range(0, 1));

                    /////////////////////////////////////////////////////////////


                    //Вытаскиваем ригидбоди
                    Rigidbody oblomok_rigidbody = OblomokObj.GetComponent <Rigidbody>();
                    //если ригид боди нету создаем
                    if (oblomok_rigidbody == null)
                    {
                        oblomok_rigidbody = OblomokObj.AddComponent <Rigidbody>();
                    }

                    //если у этого обьекта есть масса то обломок делаем частичной массы главного обьекта
                    Rigidbody gameobj_rigidbody = gameObject.GetComponent <Rigidbody>();
                    if (gameobj_rigidbody != null)
                    {
                        oblomok_rigidbody.mass = gameobj_rigidbody.mass / OblomkiPrefabObj.Length / 0.10f;
                    }
                    else
                    {
                        oblomok_rigidbody.mass = 1;
                    }

                    //придаем импульс
                    //////////////////

                    /*
                     * //считаем направление
                     * Vector3 vectorImpulse = Vector3.Normalize(OblomokObj.transform.position - gameObject.transform.position);
                     * //Чем массивнее тем слабее отталкивание
                     * float mass_koof = 0;
                     * if (oblomok_rigidbody.mass != 0)
                     *  mass_koof = 1 / oblomok_rigidbody.mass;
                     * float dist_koof = 0;
                     * float distance = Vector3.Distance(gameObject.transform.position, OblomokObj.transform.position);
                     * if (distance > 0)
                     *  dist_koof = 1 / distance;
                     * //Расчет силы оталкивания
                     * float inercia_strong = Damage * dist_koof * mass_koof * 0.02f;
                     * //Если сила отталкивания не слабая
                     * if (inercia_strong > 0.2f)
                     *  oblomok_rigidbody.velocity += inercia_strong * vectorImpulse;
                     */

                    //Тест бокс колайдела
                    BoxCollider oblomok_boxCollider = OblomokObj.GetComponent <BoxCollider>();
                    if (oblomok_boxCollider == null)
                    {
                        OblomkiPrefabObj[num_oblomok].AddComponent <BoxCollider>();
                    }

                    //Тест пии таргета
                    PiiTarget oblomok_piiTarget = OblomokObj.GetComponent <PiiTarget>();
                    if (oblomok_piiTarget == null)
                    {
                        oblomok_piiTarget = OblomokObj.AddComponent <PiiTarget>();
                    }
                    oblomok_piiTarget.heath      = 1;
                    oblomok_piiTarget.MinPresure = 1000;

                    /*
                     * destroy_timer destroy_Timer = OblomokObj.GetComponent<destroy_timer>();
                     * if (destroy_Timer == null)
                     * {
                     *  destroy_Timer = OblomokObj.AddComponent<destroy_timer>();
                     * }
                     * destroy_Timer.time_to_destroy = 30f; //(min_dist_oblomki_create - player_dist) * 2;
                     * destroy_Timer.timer_starting = true;
                     */
                }
            }
        }
    }
예제 #15
0
    public void explosion_test2()
    {
        //Если взрыв происходит сейчас
        if (boom_yn)
        {
            //Debug.Log("Boom");
            //Если сейчас первый кадр взрыва
            if (size_boom_now == 0)
            {
                //Получаем ригид боди взрывателя если он есть
                Rigidbody rigidbody_main = gameObject.GetComponent <Rigidbody>();
                if (rigidbody_main != null)
                {
                    float mass_koof = 1 / rigidbody_main.mass;
                    rigidbody_main.velocity += new Vector3(0, Damage * 0.05f * mass_koof, 0);
                }

                //Получаем все обьекты как если бы взрыв уже произошел
                Collider[] hitTargets = Physics.OverlapSphere(gameObject.transform.position, size_boom_max);
                //Получаем из них все обьекты типа цель
                for (int num_colider = 0; num_colider < hitTargets.Length; num_colider++)
                {
                    PiiTarget target = hitTargets[num_colider].GetComponent <PiiTarget>();
                    //Если обьект типа цель
                    if (target != null && target.gameObject != gameObject && target_max < Targets.Length)
                    {
                        //save
                        Targets[target_max] = target;
                        target_max++;
                    }
                }
                //Все обьекты сохранены теперь нужно их отсортировать в сторону увеличения дальности
                for (int num_cycle = 0; num_cycle < Targets.Length; num_cycle++)
                {
                    for (int num_target = 0; num_target + 1 < Targets.Length && Targets[num_target + 1] != null; num_target++)
                    {
                        float now  = Vector3.Distance(gameObject.transform.position, Targets[num_target].transform.position);
                        float next = Vector3.Distance(gameObject.transform.position, Targets[num_target + 1].transform.position);
                        //Если настояшая цель больше предыдущей
                        if (now > next)
                        {
                            //Меняем их местами
                            PiiTarget now_targ = Targets[num_target];
                            Targets[num_target]     = Targets[num_target + 1];
                            Targets[num_target + 1] = now_targ;
                        }
                    }
                }

                //Если игроку важно получить урон
                if (PlayerDamage)
                {
                    //Вытаскиваем игрока
                    Player player     = GameObject.FindGameObjectWithTag("Player").GetComponent <Player>();
                    float  distPlayer = Vector3.Distance(player.transform.position, gameObject.transform.position);
                    if (distPlayer < size_boom_max)
                    {
                        float percent = distPlayer / size_boom_max;
                        float hit     = Damage * (1 - percent);

                        if (player.ScoreTime > 0)
                        {
                            //Нужно ли выводить эмоцию урона
                            if (hit > 100)
                            {
                                player.faceController.set_butthurt_voice();
                            }

                            player.ScoreTime -= hit;
                            if (player.ScoreTime < 0)
                            {
                                player.ScoreTime = 0;
                            }

                            //Игрок получил урон теперь надо высветить окно урона
                            //расчет для отображения урона в индикаторе игрока
                            //Текущий поворот камеры игрока
                            Quaternion now_rotate_cam = player.camera.transform.rotation;
                            //Требуемый поворот камеры игрока для того чтобы смотреть прямо в центр
                            Quaternion need_rotate_cam = Quaternion.FromToRotation(player.camera.transform.position, gameObject.transform.position);

                            //Разница по горизонтали
                            float need_rot_y = need_rotate_cam.ToEulerAngles().y - now_rotate_cam.ToEulerAngles().y;
                            //разница по вертикали
                            float need_rot_x = need_rotate_cam.ToEulerAngles().x - now_rotate_cam.ToEulerAngles().x;

                            //Запихать в урон
                            if (need_rot_x < 0)
                            {
                                player.damageWindow.set_all_need(0, 0, need_rot_x * -1f, 0);
                            }
                            else
                            {
                                player.damageWindow.set_all_need(0, 0, 0, need_rot_x * 1f);
                            }

                            if (need_rot_y < 0)
                            {
                                player.damageWindow.set_all_need(need_rot_y * -1f, 0, 0, 0);
                            }
                            else
                            {
                                player.damageWindow.set_all_need(0, need_rot_y * 1f, 0, 0);
                            }
                        }

                        PlayerDamage = false;
                    }
                }
            }
            size_boom_now = size_boom_now + Time.deltaTime * speed_boom;

            //Проверяем цель на взрыв если они есть
            if (target_now < target_max && size_boom_max != 0)
            {
                //Цикл пока не будет последняя цель в радиусе поражения
                bool end_yn = false;
                for (; end_yn == false;)
                {
                    //Проверяем растояние до настоящей цели которая сейчас выделена
                    float size_for_target = 99999999;
                    //Если обьекты есть
                    if (target_now < Targets.Length)
                    {
                        if (gameObject != null && Targets[target_now] != null)
                        {
                            size_for_target = Vector3.Distance(gameObject.transform.position, Targets[target_now].gameObject.transform.position);
                        }
                        //Если взрыв прошел эту цель то взрываем и переключаемся на следуюшую
                        if (size_boom_now > size_for_target)
                        {
                            //Считаем какой урон нужно нанести
                            //процент расширенности
                            float percent = size_boom_now / size_boom_max;
                            float hit     = Damage * (1 - percent);

                            float rand = Random.Range(0.2f, 2f);

                            //меняем цель
                            target_now++;

                            Targets[target_now - 1].TrigerPii(hit, null, null, hit_text);
                            //отталкиваем цель если можем
                            Rigidbody rigidbody = null;
                            if (Targets[target_now - 1] != null)
                            {
                                rigidbody = Targets[target_now - 1].GetComponent <Rigidbody>();
                            }

                            if (rigidbody != null)
                            {
                                //Чем массивнее тем слабее отталкивание
                                float mass_koof = 0;
                                if (rigidbody.mass != 0)
                                {
                                    mass_koof = 1 / rigidbody.mass;
                                }
                                float dist_koof = 0;
                                if (size_for_target != 0)
                                {
                                    dist_koof = 1 / size_for_target;
                                }
                                //считаем вектор отталкивания
                                Vector3 vector_damage = new Vector3(
                                    Targets[target_now - 1].transform.position.x - gameObject.transform.position.x,
                                    Targets[target_now - 1].transform.position.y - gameObject.transform.position.y,
                                    Targets[target_now - 1].transform.position.z - gameObject.transform.position.z);
                                vector_damage = Vector3.Normalize(vector_damage);

                                //Расчет силы оталкивания
                                float inercia_strong = Damage * dist_koof * mass_koof;
                                //Если сила отталкивания не слабая
                                if (inercia_strong > 0.2f)
                                {
                                    rigidbody.velocity += vector_damage * inercia_strong;
                                }
                            }
                            //меняем цель
                            //target_now++;
                            //Наносим урон
                            //hit_piitarget(Targets[target_now-1], hit * rand);
                        }
                        //Иначе завершаем цикл в этом кадре
                        else
                        {
                            end_yn = true;
                        }
                    }
                    else
                    {
                        end_yn = true;
                    }
                }
            }
            //Если цели закончелись взрыв завершен
            else
            {
                boom_yn = false;
            }
        }
    }
예제 #16
0
    public void explosion_test()
    {
        if (boom_yn)
        {
            //Если радиус еще маленький
            if (size_boom_now < size_boom_max)
            {
                //Пытаемся взормать обьекты
                //Вытаскиваем обьекты которые внутри
                Collider[] hitTargets = Physics.OverlapSphere(gameObject.transform.position, size_boom_now);

                //вытаскиваем цели
                for (int num_hit = 0; num_hit < hitTargets.Length; num_hit++)
                {
                    PiiTarget piinow = hitTargets[num_hit].gameObject.GetComponent <PiiTarget>();

                    if (piinow != null)
                    {
                        //Проверяем есть ли эта цель в списке?
                        bool found_yn = false;
                        for (int num_target = 0; num_target < Targets.Length; num_target++)
                        {
                            //Если обьект нашелся в списке
                            //или если эта цель сам этот обьект
                            if (Targets[num_target] == piinow || gameObject == piinow.gameObject)
                            {
                                found_yn   = true;
                                num_target = Targets.Length;
                            }
                            //Если список закончелся
                            else if (Targets[num_target] == null)
                            {
                                num_target = Targets.Length;
                            }
                        }
                        //Если не нашлось
                        if (!found_yn)
                        {
                            //Добавляем в свободное
                            for (int num_target = 0; num_target < Targets.Length; num_target++)
                            {
                                if (Targets[num_target] == null)
                                {
                                    //Считаем какой урон нужно нанести
                                    //процент расширенности
                                    float percent = size_boom_now / size_boom_max;
                                    float hit     = Damage * (1 - percent);

                                    Targets[num_target] = piinow;

                                    float rand = Random.Range(0.2f, 2f);

                                    //Наносим урон
                                    hit_piitarget(piinow, hit * rand);

                                    num_target = 1000;
                                }
                            }
                        }
                    }
                }
                //Проверяем какие из этих целей нету еще в списке и наносим им урон
            }
            //Иначе радиус стал слишком большим отключаем взрыв
            else
            {
                boom_yn = false;
            }

            //Разширяем радиус
            size_boom_now = size_boom_now + Time.deltaTime * speed_boom;
        }
    }
예제 #17
0
 // Use this for initialization
 void Start()
 {
     //Вытаскиваем дым
     smoke  = GetComponentInChildren <ParticleSystem>();
     target = GetComponent <PiiTarget>();
 }
예제 #18
0
 // Use this for initialization
 void Start()
 {
     target = gameObject.GetComponent <PiiTarget>();
 }
예제 #19
0
    void RotateNoPoint()
    {
        //Создаем 3 луча
        Ray faceLeft  = new Ray(transform.position, rayLeft.transform.forward);
        Ray faceRight = new Ray(transform.position, rayRight.transform.forward);

        //Проверяем каждый луч сперва на разрушаемость обьекта и если нет то вытаскиваем дальность
        float faceDistLeft = 999;
        float faceDistRigh = 999;

        float distRot = 4;

        RaycastHit faceHit;

        //тест дальности боковых лучей
        //Левый
        if (Physics.SphereCast(faceLeft, 4, out faceHit))
        {
            faceDistLeft   = faceHit.distance;
            faceTargetLeft = faceHit.collider.gameObject.GetComponent <PiiTarget>();
            //Если прочность больше прочности танка
            if (faceTargetLeft != null && faceTargetLeft.MinPresure < piiTarget.MinPresure)
            {
                faceDistLeft = distRot * 2;
            }
        }
        else
        {
            faceTargetLeft = null;
        }

        //правий
        if (Physics.SphereCast(faceRight, 4, out faceHit))
        {
            faceDistRigh    = faceHit.distance;
            faceTargetRight = faceHit.collider.gameObject.GetComponent <PiiTarget>();
            //Если прочность больше прочности танка
            if (faceTargetRight != null && faceTargetRight.MinPresure < piiTarget.MinPresure)
            {
                faceDistRigh = distRot * 2;
            }
        }
        else
        {
            faceTargetRight = null;
        }

        TimeDistLeft = TimeDistLeft * 0.7f + faceDistLeft * 0.3f;
        TimeDistRigh = TimeDistRigh * 0.7f + faceDistRigh * 0.3f;

        //Дальность получена, теперь вращаем
        //Если хотябы один из лучей меньше 10 то отворачиваемся от него

        Debug.Log("Left " + TimeDistLeft + " | Right " + TimeDistRigh);

        if (TimeDistLeft < distRot || TimeDistRigh < distRot)
        {
            //Отворот лева
            if ((TimeDistLeft < distRot && TimeDistLeft < TimeDistRigh))
            {
                gameObject.transform.Rotate(0, 20 * Time.deltaTime, 0);
            }
            //отворот права
            else if ((TimeDistRigh < distRot && TimeDistRigh < TimeDistLeft))
            {
                gameObject.transform.Rotate(0, -20 * Time.deltaTime, 0);
            }
        }
        //Если препятствий нет то поворачиваемся к игроку под углом
        else
        {
            if (rigidbody != null && player != null)
            {
                //Нужно ли отклонение в градусах
                float distPlayer = Vector3.Distance(gameObject.transform.position, player.transform.position);
                float otclonenie = OtclonenieGradus;
                if (distPlayer < 200)
                {
                    otclonenie *= distPlayer / 100;
                }

                Quaternion rotate_to = Quaternion.LookRotation(player.transform.position - transform.position);
                rotate_to.eulerAngles = new Vector3(rotate_to.eulerAngles.x, rotate_to.eulerAngles.y + otclonenie, rotate_to.eulerAngles.z);
                //rotate_to.SetEulerRotation(0, OtclonenieGradus, 0);
                float old_y = transform.rotation.y;
                transform.rotation = Quaternion.Lerp(transform.rotation, rotate_to, 0.5f * Time.deltaTime);
                rotateNow          = old_y - transform.rotation.y;
            }
        }
    }
예제 #20
0
    void TestSiren_sound()
    {
        if (player != null && SirenSource != null)
        {
            float playerDist   = Vector3.Distance(gameObject.transform.position, player.transform.position);
            float MaxSirenDist = 1500;
            if (playerDist > MaxSirenDist)
            {
                playerDist = MaxSirenDist;
            }

            int cootnoshenie = (int)((playerDist / MaxSirenDist) * 200);

            SirenSource.priority = 50 + cootnoshenie;
        }

        //Если сирена включена но звука нет запускаем
        //Проверка жизни и выключение если умерла
        PiiTarget piiTarget = gameObject.GetComponent <PiiTarget>();

        pause_play_siren -= Time.deltaTime;
        if (pause_play_siren < 0)
        {
            pause_play_siren = 0;
        }

        if (need_sound_yn && police_active_now && piiTarget.heath > 0 && pause_play_siren <= 0)
        {
            if (seting != null)
            {
                SirenSource.volume = 0.5f * seting.game.volume_all * seting.game.volume_sound;
            }

            //Если нужно длинную
            if (!siren_short_need_play && (SirenSource.clip != Siren_long || SirenSource.clip == null || !SirenSource.isPlaying))
            {
                //Уменьшаем таймер задержки запуска
                pause_long_siren -= Time.deltaTime;

                if (pause_long_siren < 0)
                {
                    SirenSource.clip = Siren_long;
                    SirenSource.loop = true;
                    SirenSource.Play();
                }
            }
            else if (siren_short_need_play && (SirenSource.clip != Siren_short || SirenSource.clip == null || !SirenSource.isPlaying))
            {
                SirenSource.clip = Siren_short;
                SirenSource.loop = true;
                SirenSource.Play();

                pause_long_siren = 1f;
            }
        }

        GameplayParametrs gameplayParametrs = GameObject.FindGameObjectWithTag("setings_game").GetComponent <GameplayParametrs>();

        if (gameplayParametrs != null)
        {
            if (gameplayParametrs.GameOver)
            {
                gameoverTime += Time.deltaTime;
            }

            if (gameplayParametrs.pause || gameoverTime > gameoverTimeStop)
            {
                SirenSource.Pause();
            }
            else
            {
                SirenSource.UnPause();
            }
        }

        //Выключить при смерти или если звук не нужен
        if ((piiTarget != null && piiTarget.heath <= 0 && SirenSource.isPlaying) || !need_sound_yn || pause_play_siren > 0)
        {
            SirenSource.Stop();
        }
    }