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

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

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

Author24 — интернет-сервис помощи студентам
Есть вот такой код:
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2020, 14:13
Ответы с готовыми решениями:

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

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

Стрельба врагов
Есть класс энеми class fighterEnemy { public: Sprite shape; int HP; ...

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

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

Допустим да, я хочу чтоб он помечал и бил первого замеченного врага (или ближайшего не имеет значения мне нужно понять систему как это может работать) как это сделать?
0
109 / 81 / 37
Регистрация: 13.01.2016
Сообщений: 406
27.02.2020, 13:05 5
Например:
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 6
Лучший ответ Сообщение было отмечено 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  [ТС] 7
Да я уже тоже разобрался че я делал, я каждого из массива в цикле выделал, а надо было просто одного, в любом случае спасибо!)
0
0 / 0 / 0
Регистрация: 10.05.2020
Сообщений: 1
10.05.2020, 16:21 8
Всем привет,очень нужна помощь.
Создал скрипт с атакой врага,суть что когда враг с игроком соприкасаются враг наносит удар, но после того как игрок отходит враг бьет на дистанции и дамажи.
Подскажите где ошибся или что не дописал.
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
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
10.05.2020, 20:19 9
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 10
Вы потрясающий человек))
0
21.03.2021, 00:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2021, 00:19
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru