Jump to content
Sign in to follow this  
Константин Орлов

Unity: Преследование персонажа мобом

Recommended Posts

Тут придется напрячься. Так как это скорее напоминалка для тех, кто разбирается в Unity и скриптах, а не урок для новичков. Ибо новичку трудно будет вникнуть, что тут происходит по причинам описанным в самом скрипте.

 

Сделано по уроку:

 

 

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); //если ниже указанного, тогда выключаем анимацию движения
        }
	}
}

 

Share this post


Link to post
Share on other sites
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

  • Если у вас есть факты, вещдоки, и свидетельские показания, то обратитесь: vk.com/orkons или orkons@ya.ru, они будут проверены и опубликованы. Возможна беседа под запись с публикацией на YouTube.
    Все материалы на сайте сделаны в пародийных целях и являются художественным вымыслом, все совпадения с реальными людьми и событиями случайны.

Powered by Invision Community
Поддержка Invision Community в России