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

Движение врага за игроком

09.09.2022, 15:16. Показов 3165. Ответов 3

Author24 — интернет-сервис помощи студентам
Здравствуйте, я новичок в Unity и возникла проблема при написании скрипта слежки врага за игроком
Суть проблемы: враг вроде бы следит за игроком, но держится на дистанции от него, не подходя к нему ближе
Код скрипта прилагается:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public float speed;
    private Player player;
    // Start is called before the first frame update
    void Start()
    {
        player = FindObjectOfType<Player>();
    }
 
    // Update is called once per frame
    void Update()
    {
        transform.position = Vector2.MoveTowards(transform.position, player.transform.position, speed * Time.deltaTime);
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2022, 15:16
Ответы с готовыми решениями:

Движение врага за игроком в 2D
я сделал скрипт движения врага за игроком но он движется по y мне нужно заблокировать движения...

Передвижение через врага игроком
Суть проблемы такова. Делал я боевую систему и хотел сделать так ,чтобы игрок мог проходить сквозь...

Скрипт для врага следующего за игроком. Вид сверху
Уже несколько часов не могу написать скрипт для движения противника, следующего за игроком. В итоге...

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

3
Сын моей мамы
206 / 140 / 66
Регистрация: 09.05.2020
Сообщений: 733
09.09.2022, 21:22 2
попробуй зайти во все дочерние(вложенные в него) объекты своего игрока и установить им все позиции на 0
0
<Dragon/Craft>
24 / 19 / 6
Регистрация: 07.05.2019
Сообщений: 297
Записей в блоге: 2
10.09.2022, 20:38 3
Заходим в Документацию и читаем первую строку...
Движение врага за игроком

Для тех кто не "шпрехает на забугорном", сразу перевод:
Движение врага за игроком

ЧИТАЙТЕ ДОКУМЕНТАЦИЮ
В вашем случае нужно чтобы противник подходил к Вам, то есть, следовал за игроком, следовательно Вам нужна функция линейной интерполяции:
Движение врага за игроком

В случае с Unity:
Движение врага за игроком

Документация нужной функции...

Быстрый код от руки:
C#
1
2
3
4
5
6
7
    public float minimum = -1.0F; //От объекта, здесь можете указать текущую позицию противника. Если скрипт висит на враге, то пишите gameObject.transform.position 
    public float maximum =  1.0F; //К объекту, например игроку, здесь пишите прямое указание на игрока, а именно объявите игрока как объект, например [SerializeField] GameObject player; вне функции, вначале класса, а затем считайте его координаты: player.transform.position 
    void Update()
    {
        transform.position = new Vector3(Mathf.Lerp(minimum, maximum, t), 0, 0);
        t += 0.5f * Time.deltaTime;
    }
Этот способ хорош, когда у противников есть AI команда на то чтобы некоторое время преследовали игрока, но если нужно постоянно, то вот эти способы должны подойти:
Наш форум, тема 2013 года,
del Код от туда сюда дублирую:
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
 
public class Spider : MonoBehaviour {
    //сделано по уроку https://www.youtube.com/watch?v=ANuDASeE-Oc (https://www.youtube.com/watch?v=dgEfHvsi6Zo)
    //Этот мануал по скриту будет довольно трудно понять новичку, так как я тут изменял названия некоторых методов и переменных под себя
    //поэтому просто скопировать не получится (+скрипт игрока с ХП нужен, а это скрипт лишь для паука). 
    //Но и чисто по видео сделать тоже не получится без проблем, так как автор изменил код между 1 и 2 частью видео
    //но не сообщил об этом. Поэтому придется вам посмотреть видео, повторить все за автором, а потом вникнуть в то, что написано ниже, чтобы
    //заставить заработать код из видео.
    //Итак, если вы будете делать по этому видео уроку, то учтите, что автор во второй части видео немного передалал код из первой части видео
    //но это не попало в урок, и он не объяснил, что изменил. Поэтому после полного написания скрипта, чтобы паук ходил по точкам
    //необходимо его немного изменить. А для этого нужно в начале второй части видео посмотреть старый код из первой части, и переделать его.
    //А именно: в 34 (относительно моего скрипта) строчке автор сменил тег на GroupPoint, и добавил новую 35 строчку "points = new Transform[temp.childCount];", где
    //изменил подход - теперь точки пути для паука ищутся сразу всей кучей через родительский объект, у которого должен быть тег GroupPoint
    //(раньше искалась каждая точка по тегу). Поэтому в родительский объект в иерархии точек вам нужно добавить тег GroupPoint, иначе паук
    //не будет патрулировать территорию.
    //Самс скрипт:
 
    const float damage = -0.2f; //сила урона паука (у меня минусовое значение из-за особенностей скрипта на ХП, у вас, скорее всего, нужно положительное значение)
    NavMeshAgent agent;
    Animator animator;
    GameObject player; //ссылка на игрока, которого мы найдем позже по тегу
    Player HpPlayer; //
    float visible = 8f; //радиус видимости паука, если игрок подойдет ближе указанного значения, то паук начнет преследовать игрока
 
    Transform[] points; //массив точек (waypoints), по которым будет ходить паук, когда рядом не видит игрока (типо патрулирует)
    int path = 0; //переменная выбор пути, используется в скрипте, чтобы указывать на какую из точек в массиве сейчас идти (выбирается случайным образом)
    float minDistance = 1f; //минимальная дистанция до точки, когда паук посчитает, что дошел до нее. В видео уроки стоит 0.01, 
    //но тогда паук не всегда ее может достичь, если она прямо на полу.
    
    // Use this for initialization
    void Start () {
        animator = GetComponent<Animator>(); //получаем в переменную аниматор паука
        agent = GetComponent<NavMeshAgent>(); //получаем в переменную навигационный меш паука
        player = GameObject.FindGameObjectWithTag("Player"); //ищем игрока по тегу, и помещаем ссылку на него в переменную
        if (player != null) //если игрок найден (если не Null)
        {
            HpPlayer = player.GetComponent<Player>(); //помещаем в переменную скипт, который прикреплен к игроку, и в котором прописана переменная его HP
        }
        Transform temp = GameObject.FindGameObjectWithTag("GroupPoint").transform; //создайте в иерархии пустой объект, добавьте ему тег GroupPoint и поместите туда пустые объекты, которые будут точками пути для паука, тогда эта строчка найдет этот объект и поместить в переменную temp
        points = new Transform[temp.childCount]; //помещает в массив пустые объекты, которые дочерни относительно объекта с тегом GroupPoint (видимо нужно, чтобы определить размер массива)
        int i = 0;
        foreach (Transform t in temp) //помещает в массив координаты точек (или что-то вроде того, яхз)
        {
            points[i++] = t;
        }
    }
    
    // Update is called once per frame
    void Update () {
 
        if (player != null) //если игрок найден по тегу (т.е. если не Null)
        {
            float distance = Vector3.Distance(transform.position, player.transform.position); //определяем дистанцию между пауком и игроком, и помещаем в переменную
            if (distance < 1f) //если дистанция меньше указанного значения
            {
                //animator.SetBool("attack", true); //тут я поставил, чтобы проигрывалась анимация атаки, но она проигрывается 1 раз без зацикливания, поэтому выключил
                Player.SetHPPlayer(damage); //тогда наносим дамаг игроку, вызывая фукнцию в его скрипте (должен быть прикреплен к нему на инспекторе), название функции можете прописать свое, главное сделайте ее в скрипте игрока
                
            }
            else if (distance < visible) //если дистанция до игрока меньше радиуса видимости
            {
                //animator.SetBool("attack", false);//тогда выключаем анимацию атаки (если была включена), добавил я от себя
                agent.destination = player.transform.position; //и передаем агенту навигации координаты игрока, чтобы идти к нему
            }
            else
            {
                float distanceToPoint = Vector3.Distance(transform.position, points[path].transform.position); //иначе (если игрока нет в зоне видимости), тогда определеем координаты точки для патрулирования 
                if (distanceToPoint <= minDistance) //если дистанция до точки меньше минимальной, то точка считается достигнутой
                {
                    path = Random.Range(0, points.Length); //передаем в переменную случайное число от нуля до длинны нашего массива, содержащего все точки. Нужно, чтобы выбрать случайным образом, к какой точке идти дальше
                }
                agent.destination = points[path].transform.position; //направляем нашего агента к случайной точке, выбарнной выше
            }
        }
        if (agent.velocity.magnitude > 2f) //если скорость агента (или как-то так) выше указанного
        {
            animator.SetBool("walk", true); //тогда включаем анимацию движения
        }
        else
        {
            animator.SetBool("walk", false); //если ниже указанного, тогда выключаем анимацию движения
        }
    }
}
Код не идеален, но общая суть с вычислением дистанции и преследованием игрока одна. Считаем дистанцию, если меньше, то преследуем, если больше, то не преследуем. Можно указать чтобы всегда преследовал, то есть, если дистанция между врагом и игроком больше нуля, то враг идёт за игроком.

P.S. Эх... Если бы Мне два года назад помогали...
0
<Dragon/Craft>
24 / 19 / 6
Регистрация: 07.05.2019
Сообщений: 297
Записей в блоге: 2
10.09.2022, 21:12 4
Цитата Сообщение от VarionDrakon Посмотреть сообщение
Последний раз редактировалось alecss131; Сегодня в 21:07. Причина: ссылки на другие форумы запрещены
Спасибо. Код хотя бы дали продублировать.
0
10.09.2022, 21:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2022, 21:12
Помогаю со студенческими работами здесь

Движение врага
В общем, нужно, чтобы &quot;враг&quot; двигался от края платформы к краю. using UnityEngine; using...

Движение врага
Помогите реализовать код врага. Нужно чтобы враг двигался за игроком при этом мог обходить...

Движение врага в 2d игре
Собственно говоря есть код которым враг медленно но верно идёт к игроку movedir =...

Unity 2D Движение врага
Здравствуйте, помогите пожалуйста, со скриптом на C# для движения врага от начала до конца...

Движение врага в Unity 2D C#
Приветствую ! Такой интересный вопрос , делаю 2D игру на Unity , делаю врага … Есть сам игрок и...

Рандомное движение врага
Уважаемые форумчане! Подскажите новичку как правильно решить задачу по движению врага 2D Итак,...


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

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