Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 101

Непонятно поведение пушек в игре

06.12.2016, 15:44. Показов 721. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Воощем кто знает помогите пожалуйста. Есть у меня башни, кот. стреляют по мобам, у каждой башни есть максимальная дистанция, но беда вот в том, что она для первой поставленной пушке становится общей.
То есть смотрите у нас две пушки, кот. расположены довольно далеко друг от друга. Идет моб и проходит мимо первой пушки, та в свою очередь долбит в него пока ей позволяет радиус. Моб прошел и доходит до второй пушки и тут случается непонятная "фигня": вторая пушка начинает стрелять в моба кот. попал в её радиус действия, но и первая кот. за км от нее стоит начинает тоже долбить по нему. То есть как только моб попал в радиу действия второй пушки, первая(кот. уже отстрелялась долбит по нему). ТАкое ощущение, что локальную переменную "distance" они используют как статическую что-ли. Буду благодарен, если объясните в чем соль, ибо я уже неделю бьюсь над этим( в юнити - совсем нуб).

Код башни.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
public class TowerAI : MonoBehaviour {
 
    public GameObject[] targets; //массив всех целей
    public GameObject curTarget;
    public float towerPrice = 100.0f;
    public float attackMaximumDistance = 50.0f; //дистанция атаки
    public float attackMinimumDistance = 5.0f;
    public float attackDamage = 10.0f; //урон
    public float reloadTimer = 0.5f; //задержка между выстрелами, изменяемое значение
    public float reloadCooldown = 2.5f; //задержка между выстрелами, константа
    public float rotationSpeed = 1.5f; //множитель скорости вращения башни
    public int FiringOrder = 1; //очередность стрельбы для стволов (у нас же их 2)
    public Transform turretHead;
 
    public RaycastHit Hit;
 
 
    // Use this for initialization
    void Start () {
        turretHead = transform.FindChild("Head");
    }
    
    // Update is called once per frame
    void Update () {
        curTarget = SortTargets();
        if (curTarget != null && !curTarget.GetComponent<PigMove>().IsDead) //если переменная текущей цели не пустая
        {
            float distance = Vector3.Distance(turretHead.position, curTarget.transform.position); //меряем дистанцию до нее
            if (attackMinimumDistance < distance && distance < attackMaximumDistance) //если дистанция больше мертвой зоны и меньше дистанции поражения пушки
            {
                turretHead.rotation = Quaternion.Slerp(turretHead.rotation, Quaternion.LookRotation(curTarget.transform.position - turretHead.position), rotationSpeed * Time.deltaTime); //вращаем башню в сторону цели
                if (reloadTimer > 0) reloadTimer -= Time.deltaTime; //если таймер перезарядки больше нуля - отнимаем его
                if (reloadTimer < 0) reloadTimer = 0; //если он стал меньше нуля - устанавливаем его в ноль
                if (reloadTimer == 0) //став нулем
                {
                    //получаем цель
                    PigMove target = curTarget.GetComponent<PigMove>();
                    //создаем огненный шар(т.к. башня стихии огня).
                    var bullet = Instantiate(Resources.Load("FireBall") as GameObject);
                    bullet.transform.position = turretHead.transform.position;
                    //bullet.GetComponent<BulletBehavior>().Speed = 50;
                    Debug.Log("Выстрел!");
 
                    Debug.Log("Переменная distance = " + distance.ToString());
                    reloadTimer = reloadCooldown; //возвращаем переменной задержки её первоначальное значение из константы
                    
                }
            }
            
        }
  
    }
 
    /// <summary>
    /// Очень примитивный метод сортировки целей
    /// </summary>
    /// <returns></returns>
    public GameObject SortTargets()
    {
        float closestMobDistance = 0; //инициализация переменной для проверки дистанции до моба
        GameObject nearestmob = null; //инициализация переменной ближайшего моба
        GameObject[] sortingMobs = GameObject.FindGameObjectsWithTag("Monster"); //находим всех мобов с тегом Monster и создаём массив для сортировки
        
    
        foreach (var everyTarget in sortingMobs) //для каждого моба в массиве
        {
            //если дистанция до моба меньше, чем closestMobDistance или равна нулю
            if ((Vector3.Distance(everyTarget.transform.position, this.transform.position) < closestMobDistance) || closestMobDistance == 0)
            {
                closestMobDistance = Vector3.Distance(everyTarget.transform.position, turretHead.position); //Меряем дистанцию от моба до пушки, записываем её в переменную
                nearestmob = everyTarget;//устанавливаем его как ближайшего
            }
        }
        return nearestmob; //возвращаем ближайшего моба
    }
}
Код снаряда
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using UnityEngine;
using System;
using System.Collections;
 
public class BulletBehavior : MonoBehaviour {
    /// <summary>
    /// Скорость полета пули
    /// </summary>
    public float Speed = 5000;
    /// <summary>
    /// Моб, в которого стреляем
    /// </summary>
 
 
    public int Damage=100;
 
    GameObject _target;
    Rigidbody _rigidBody;
    // Use this for initialization
    void Start () {
 
 
 
        _target = FindObjectOfType<TowerAI>().curTarget;
        if (_target != null)                    //ДОБАВИЛ ТУТ ПРОВЕРКУ, ЧТОБ ЭКСЕПШЕНАМИ НЕ ПЛЕВАЛАСЬ
            Destroy(gameObject, 3.0f);
        else
        {
            Destroy(gameObject);
            return;
        }
 
 
        ///Тут и далее - попытка сделать физику полета снаряда
        _rigidBody = GetComponent<Rigidbody>();
        var heading = _target.transform.position - this.transform.position; //вектор расстояния между мобом и снарядом
        var distance = heading.magnitude; //само расстояние
        var direction = heading/distance; //единичный вектор направления
        _rigidBody.AddForce(direction * Speed, ForceMode.VelocityChange);
        //transform.rotation = Quaternion.RotateTowards();
 
    }
    
 
 
    //ВЕРСИЯ БЕЗ ФИЗИКИ. РАССКОМЕНТИРУЙ, ЧТОБЫ ВЕРНУТЬ, КАК БЫЛО
    /*
    // Update is called once per frame
    void Update () {
        //Если есть враг
        if (trigger && _target!=null)
        {
            //пуляем во врага
            transform.position = Vector3.MoveTowards(transform.position, _target.transform.position, Time.deltaTime * Speed);
            //Как только попадание засчитано, наносим дамаг и уничтожаем саму пулю
            if (Vector3.Distance(transform.position, _target.transform.position) < 0.5f)
            {
                _target.HP -= damage;
                Destroy(this.gameObject);
                Debug.Log(_target.HP);
            }
        }
        else
            Destroy(this.gameObject);
    } */
 
    void Update()
    {
 
    }
 
    /// <summary>
    /// Когда наша пуля во что-то попадает
    /// </summary>
    /// <param name="collision">Все сведения о попадании</param>
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log(collision.collider);
        PigMove mob = collision.gameObject.GetComponent<PigMove>(); //Ищем у того, куда попали, компонент моба
        Debug.Log(mob);
 
        if (mob != null) //если не нашли, уничтожаем пулю
        {
            mob.HP -= Damage;
            Debug.Log(mob.HP);
        }
        Destroy(gameObject);
    }
 
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2016, 15:44
Ответы с готовыми решениями:

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

Проблемы со ссылками. Непонятно поведение программы
Всё на рисунке для удобства. Выполняется сортировка и каким то чудным образом сортируется исходный массив, хотя в методе явно идёт...

Разное поведение шаблона (админ/юзер) - непонятно, почему
Правлю шаблон элемента каталога. Под админом правки видны, под неавторизованным юзером - нет. Правка простейшая - добавление статичного...

2
 Аватар для wmysterio
295 / 244 / 128
Регистрация: 24.12.2014
Сообщений: 708
06.12.2016, 16:28
Вероятно у Вас с сортировкой проблемы. Возможно мой старый код поможет лучше выполнить эту сортировку:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;
using System.Collections.Generic;
 
    class Turret : MonoBehaviour {
 
        public List<GameObject> targets;
 
        public GameObject FindСlosest( float maxRadius ) {
            // сортируем мобов ( ЗДЕСЬ НУЖНО ВАМ ОТДЕЛЬНО ДОРАБОТАТЬ СОРТИРОВКУ )
            targets.Sort( ( m1, m2 ) => {
                return Vector3.Distance( m1.transform.position, gameObject.transform.position ).CompareTo(
                    Vector3.Distance( m2.transform.position, gameObject.transform.position )
                );
            } );
 
            return targets[ 0 ]; // Возвращаем ближнего ( или дальнего ) в сортировке можно поменять m2 и m1 местами и сортировтаь будет по-другому
        }
 
    }
На его основе можете обновить свой клас
1
1 / 1 / 0
Регистрация: 18.09.2014
Сообщений: 101
07.12.2016, 00:11  [ТС]
wmysterio, спасибо большое, буду завтра пробовать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2016, 00:11
Помогаю со студенческими работами здесь

Ошибка 0x000000101 , при игре 10 минутной игре в Dota 2, CS:GO
Имя события проблемы: BlueScreen Версия ОС: 6.1.7600.2.0.0.256.48 Код языка: 1049 Дополнительные сведения об этой проблеме: ...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о. частота тактирования на таймере=42Мгц ...

Как отлавливать нажатия клавиш в игре? Как их виртуально нажимать в игре?
Всем привет. Где-то месяц назад прочитал статью об каком-то парне, что сделал самообучающую программу для игр на Нинтендо. Но это вроде...

Непонятно
Почему я не могу отвечать на сообщения в этом разделе? Вроде всё делаю верно!!!

Непонятно
Есть простая програмка, решающая логические уравнения. Все решает замечательно, но при вводе короткого уравнения a|b по непонятной причине...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru