-
Notifications
You must be signed in to change notification settings - Fork 0
/
Melee.cs
186 lines (143 loc) · 6.26 KB
/
Melee.cs
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
using UnityEngine;
using System.Collections;
public class Melee : Attacks{
// получение контролера у игрока
private CharacterController _controller;
private PlayerCharacteristics PlCh; //данные для получения параметров игрока
private Transform myTransform; // трансформ этого врага
private Transform myEnemyTransform; // трансформ игрока
private GameObject myEnemy;
private npcCharacteristics his;
private Behaviour hisBehaviour;
private bool isPlayer = true;
private bool playerAttack = false;
private double enemyHealth; // переменная для здоровья игрока
private float enemyArmor; // переменная для брони игрока
private string enemyTag;
private int armorBlockChance;
private int rnd;
private int distanceToEnemy; // расстояние до игрока
public GameObject myBody;
public Transform myModel;
private Behaviour myBehaviour;
private npcCharacteristics my; // характеристики врага
private Animator myAnimator; // Animator врага
private AIFollow myPathfinder; // получение компонента пасфайндера ЭТОГО врага
private EnemySearchProtocol myEnemySearch;
private EnemyAttack aggressivePlayer;
public float myTurnSpeed = 90; // скорость поворота в секунду
public float myLastAttack; // время последней атаки
public AudioClip steps; // звук шагов врага
public AudioClip punch; // звук атаки врага
public void Start(){
// получаем компоненты у игрока и его характеристики
PlCh = GameObject.Find("-Characteristics-").GetComponent<PlayerCharacteristics>();
myPathfinder = GetComponent<AIFollow>();
my = GetComponent<npcCharacteristics>();
myAnimator = myBody.GetComponent<Animator>();
myBehaviour = GetComponent<Behaviour>();
myEnemySearch = GetComponent<EnemySearchProtocol>();
aggressivePlayer = GetComponent<EnemyAttack>();
// Получаем контроллер
_controller = GetComponent<CharacterController>();
// Получаем компонент трансформации объекта, к которому привязан данный компонент
myTransform = transform;
// Получаем компонент трансформации игрока
myEnemyTransform = GameObject.Find("GLOBAL").transform;
myModel = transform.GetChild(0);
//выключаем пасфайндер, чтобы не ходил пока
Walk(false);
}
public void Update(){
if(! playerAttack){
if(aggressivePlayer.Attacking()){
SetRetreat();
playerAttack = true;
}
}
if(myModel.localPosition != new Vector3 (0,myModel.localPosition.y,0)){
myModel.localPosition = new Vector3 (0,myModel.localPosition.y,0);
}
if(myEnemy == null){
myEnemy = myEnemySearch.GetMeEnemy();
if(myEnemy.tag == "Global"){
SetRetreat();
}else{
SetMyEnemy(myEnemy);
}
}
if(isPlayer){
enemyHealth = PlCh.GetCurrentHealth(); // получаем здоровье игрока
enemyArmor = (float)PlCh.GetArmor(); // получаем броню игрока
}else if(! isPlayer){
enemyHealth = his.CurrentHealth(); // получаем здоровье игрока
enemyArmor = his.Armor(); // получаем броню игрока
}
transform.LookAt(myEnemyTransform);
Vector3 _direction = transform.TransformDirection(Vector3.forward) * 1000;
_direction.y = 2;
RaycastHit _hit;
if (Physics.Raycast(transform.position, _direction, out _hit, 1000)){
// Если луч пройдет через объект с тэгом "Global"...
if (_hit.transform.tag == enemyTag){
// ...и если дистанция до игрока меньше 50 метров...
if (Vector3.Distance(myEnemyTransform.position, myTransform.position) < my.DetectRange()){
Walk(true);
}else{ // если меньше 50 метров - враг не идет, анимации и звуков нет
Walk (false);
}
// если дистанция до игрока меньше радиуса атаки Range
if (Vector3.Distance(myEnemyTransform.position, myTransform.position) <= my.Range()){
// останавливаем анимацию ходьбы и звуки
Walk(false);
// ...и здоровье игрока больше нуля...
if (enemyHealth > 0){
MakeShot();
}
}
}
}
}
void MakeShot(){
if (Time.time > (myLastAttack + my.Cooldown() )){ // Создаем задержку выстрела...
enemyHealth = (enemyHealth - my.ColdWeaponDamage(enemyArmor) );
myAnimator.SetBool("forSmash", true);
audio.PlayOneShot(punch);
myLastAttack = Time.time;
}
if(isPlayer){
PlCh.SetHealth(enemyHealth);
}else{
his.SetCurrHealth(enemyHealth);
}
}
void Walk(bool w){
if(w){ // включаем пасфайндер и анимацию ходьбы + звук шагов
myPathfinder.enabled = true;
myAnimator.SetBool("forWalk", true);
myAnimator.SetBool("forSmash", false);
if (audio.isPlaying == false) {
audio.clip = steps;
audio.Play();
}
}else{ // враг не идет, анимации и звуков нет
myPathfinder.enabled = false;
myAnimator.SetBool("forWalk", false);
myAnimator.SetBool("forSmash", false);
audio.Stop();
}
}
public void SetMyEnemy(GameObject enemy){
his = enemy.GetComponent<npcCharacteristics>();
myEnemyTransform = enemy.transform;
myPathfinder.target = enemy.transform;
enemyTag = enemy.tag;
isPlayer = false;
}
public void SetRetreat(){
myEnemyTransform = GameObject.Find("GLOBAL").transform;
myPathfinder.target = myEnemyTransform;
enemyTag = "Global";
isPlayer = true;
}
}