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