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

Атака врагов 2D

26.02.2020, 14:13. Показов 11604. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой код:
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
private void Update()
    {
        isEnemy = Physics2D.OverlapCircle(attackPosition.position, checkRadius, whatIsEnemy);
        moveInputX = Input.GetAxis("Horizontal");
        moveInputY = Input.GetAxis("Vertical");
        rb.velocity = new Vector2 (moveInputX * speed, moveInputY * speed);            
        
        if (timeBtwAttack <=0 )
        {
            if (isEnemy == true)
            {                         
            Collider2D[] enemiesToDamage = Physics2D.OverlapCircleAll(attackPosition.position, checkRadius, whatIsEnemy);           
            for (int i = 0; i < enemiesToDamage.Length ; i++)
            {
                enemiesToDamage[i].GetComponent<Enemy>().TakeDamage(damage);
            }
            }
            timeBtwAttack = startTime;            
        }
        else
        {
            timeBtwAttack -= Time.deltaTime;
        }        
    }
Вопрос такой:
Сейчас он атакует всех кто есть в радиусе, как можно сделать так чтоб он атаковал их по очереди, по одному?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2020, 14:13
Ответы с готовыми решениями:

ИИ врагов
Я хочу чтобы враг ходил по определенной траектории и когда игрок пересекал эту траекторию, враг начинал в него стрелять. Еще было бы...

Создание врагов
Привет есть вот такой класс, работаю в андроид студио, пытаюсь создать большое количество врагов. Но отрисовывает только одного в методе...

Стрельба врагов
Есть класс энеми class fighterEnemy { public: Sprite shape; int HP; fighterEnemy(Texture *texture, Vector2f pos) { ...

9
109 / 81 / 37
Регистрация: 13.01.2016
Сообщений: 409
26.02.2020, 15:28
Он делает это не одновременно. Можно в цикле ввести задержку между врагами. То есть, ударил - подождал - ударил следующего - подождал. Или я неправильно понял вопрос.
Можно выделять и бить первого врага, которого он заметит в радиусе, игнорируя остальных. Затем помечать его, как уже ударенного и искать следующего.
0
4 / 1 / 3
Регистрация: 07.02.2020
Сообщений: 93
26.02.2020, 16:07  [ТС]
Проблема в том что как раз одновременно, т.е. 2 противника находятся в радиусе, и оба получают дамаг.
0
4 / 1 / 3
Регистрация: 07.02.2020
Сообщений: 93
27.02.2020, 11:26  [ТС]
Цитата Сообщение от DarkPtect Посмотреть сообщение
Он делает это не одновременно. Можно в цикле ввести задержку между врагами. То есть, ударил - подождал - ударил следующего - подождал. Или я неправильно понял вопрос.
Можно выделять и бить первого врага, которого он заметит в радиусе, игнорируя остальных. Затем помечать его, как уже ударенного и искать следующего.

Допустим да, я хочу чтоб он помечал и бил первого замеченного врага (или ближайшего не имеет значения мне нужно понять систему как это может работать) как это сделать?
0
109 / 81 / 37
Регистрация: 13.01.2016
Сообщений: 409
27.02.2020, 13:05
Например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (enemy == null)  //Если переменная не содержит ссылку на врага, то
            {
                foreach(GameObject obj in allEnemyes)  //Проходимся по массиву всех врагов 
                {
                    if(Vector3.Distance(obj.transform.position, transform.position) < distance) //Измеряем дистанцию между врагом и игроком
                    {
                        enemy = obj;  //если дистанция меньше, то в переменную врага кладём ссылку
                        break; //выходим из цикла
                    }
                    //сюда приходим, если у нас неи врагов на нужной дистанции
                }
            }
            else
            {
                //Атакуем врага, если переменная не пустая
            }
0
29 / 19 / 10
Регистрация: 24.02.2015
Сообщений: 124
27.02.2020, 21:06
Лучший ответ Сообщение было отмечено Frachetes как решение

Решение

твой же код с 1й правкой =)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void Update()
    {
        isEnemy = Physics2D.OverlapCircle(attackPosition.position, checkRadius, whatIsEnemy);
        moveInputX = Input.GetAxis("Horizontal");
        moveInputY = Input.GetAxis("Vertical");
        rb.velocity = new Vector2 (moveInputX * speed, moveInputY * speed);            
        
        if (timeBtwAttack <=0 )
        {
            if (isEnemy == true)
            {                         
            Collider2D[] enemiesToDamage = Physics2D.OverlapCircleAll(attackPosition.position, checkRadius, whatIsEnemy);           
 
/*Вот тут*/enemiesToDamage[0].GetComponent<Enemy>().TakeDamage(damage);
            }
            timeBtwAttack = startTime;            
        }
        else
        {
            timeBtwAttack -= Time.deltaTime;
        }        
    }
1
4 / 1 / 3
Регистрация: 07.02.2020
Сообщений: 93
27.02.2020, 21:10  [ТС]
Да я уже тоже разобрался че я делал, я каждого из массива в цикле выделал, а надо было просто одного, в любом случае спасибо!)
0
0 / 0 / 0
Регистрация: 10.05.2020
Сообщений: 1
10.05.2020, 16:21
Всем привет,очень нужна помощь.
Создал скрипт с атакой врага,суть что когда враг с игроком соприкасаются враг наносит удар, но после того как игрок отходит враг бьет на дистанции и дамажи.
Подскажите где ошибся или что не дописал.
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
public class EnemyAttack : MonoBehaviour
{
    
    private float timeBtwAttack;
    public float startTimeAttack;
    public int damage;
    
    private PlayerNEW player;
    private Animator anim;
    // Start is called before the first frame update
    void Start()
    { 
        anim = GetComponent<Animator>();
        player = FindObjectOfType<PlayerNEW>();
        
        
    }
 
    // Update is called once per frame
    void Update()
    {
       
        }
    public void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            if (timeBtwAttack <= 0)
            {
                anim.SetTrigger("SKattak");
            }
            else
            {
                timeBtwAttack = Time.deltaTime;
            }
            
                
 
            
        }
    }
public void OnEnemyAttack()
    {
        player.health -= damage;
        timeBtwAttack = startTimeAttack;
    }
}
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
10.05.2020, 20:19
gato_do_mato, не стесняйтесь создавать отдельную тему на форуме для вашего вопроса, не стоит внедряться в другие темы со своей проблемой, так как это засоряет текущую тему. Ведь если многие начнут в одной теме задавать свои разные вопросы, то во что это превратиться в итоге?

По вашему вопросу:
Насколько я понимаю, то наверно в конце анимации атаки врага, вы вызываете метод OnEnemyAttack, который влияет на игрока где бы он ни находился. Решения могут быть разные:
например добавить bool переменную, которую в OnTriggerStay2D устанавливать в true, а в OnTriggerExit2D в false. То-есть по этой переменной будет понятно, когда игрок соприкасается с врагом. А в методе OnEnemyAttack вначале поставить проверку - чему равна эта bool переменная, и если игрок внезапно отошел и bool переменная стала false, значит не наносить урон игроку.

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
using UnityEngine;
public class EnemyAttack : MonoBehaviour
{
 
    private float timeBtwAttack;
    public float startTimeAttack;
    public int damage;
 
    private PlayerNEW player;
    private Animator anim;
 
    private bool _isPlayerNear; // находится ли игрок рядом
    void Start()
    {
        anim = GetComponent<Animator>();
        player = FindObjectOfType<PlayerNEW>();
 
        _isPlayerNear = false; // изначально будем  считать, что игрок не рядом
 
    }
 
    public void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            if (timeBtwAttack <= 0)
            {
                anim.SetTrigger("SKattak");
            }
            else
            {
                timeBtwAttack = Time.deltaTime;
            }
 
            _isPlayerNear = true; // отмечаем, что игрок рядом
        }
    }
 
    // когда игрок выходит из триггера врага
    public void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            _isPlayerNear = false; // отмечаем, что игрок НЕ рядом
        }
    }
 
    // во время атаки проверяем
    public void OnEnemyAttack()
    {
        // если игрок рядом, значит отнимаем ему здоровье
        if (_isPlayerNear)
        {
            player.health -= damage;
        }
 
        timeBtwAttack = startTimeAttack;
    }
}
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 2
21.03.2021, 00:19
Вы потрясающий человек))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2021, 00:19
Помогаю со студенческими работами здесь

Слон бьет врагов ???
Приветствую, всех! Кто то скажет опять эти шахматы, сам спекся :wall: когда получил задание. Но дорогие форумчани помогите с задание. Не...

Ускорение появления врагов
Привет! Вопрос касается 2d платформера. Я хотел узнать, как можно изменить скорость появления врагов, то есть по истечению некоторого...

Здоровье врагов в массиве
Здравствуйте, название темы нелепое, за это простите пожалуйста. Значит так, пишу я игру, что то вроде tower defence. Есть у меня...

Google избавился от "врагов народа"
Компания Google объявила о том, что она победила так называемый линкбомбинг - прописывание ссылок с ключевыми словами, искажающими...

Подсчет количества пуль и врагов
у меня есть пуля (shot0), каким образом можно реализовать подсчет количества вылетевших пуль в динамическом тексте (qwe.text). работаю в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru