using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovePlatform : MonoBehaviour
{
public GameObject Pos1;
public GameObject Pos2;
private bool MoveBool;
public float speed;
public float maxDictant;
private void FixedUpdate()
{
if (MoveBool == false)
{
transform.position = new Vector2(Pos1.transform.position.x + speed, Pos1.transform.position.y + speed);
if (Vector2.Distance(transform.position, Pos1.transform.position) <= maxDictant) // что-то
{
MoveBool = true;
}
}
else if (MoveBool == true)
{
transform.position = new Vector2(Pos2.transform.position.x + speed * Time.deltaTime, Pos2.transform.position.y + speed * Time.deltaTime);
if (Vector2.Distance(transform.position, Pos2.transform.position) <= maxDictant) // что-то
{
MoveBool = false;
}
}
}
}
void Fire()
{
if (CanFire == true)
{
_audioSoruce.PlayOneShot(FireSound);
Rigidbody2D clone = Instantiate(bullet, gunPoint.position, Quaternion.identity) as Rigidbody2D; // не ругаться)
clone.GetComponent<BulletEnter>().atack = thisAtackTower; // тут беру атаку из башни, ибо с увеличением уровня урон меняется у неё и там разные комбинации всякие, они в связках работают
clone.transform.up = gunPoint.up;
clone.velocity = clone.transform.up * speed;
CanFire = false;
StartCoroutine(WaitFire());
}
}
IEnumerator WaitFire()
{
yield return new WaitForSeconds(fireRate);
CanFire = true;
}
public int ZombieArrayGivePosition;
за это и отвечает, я считывал точки к которым стремится враг и брал тех у кого они наибольшие, получилось что он стреляет в тех, кто ближе к финишу идёт, я хотел ещё раз прогнать, чтоб отсортировать тех, кто по vector2.Distance смотреть кто ближе к финишу и выбирать в цель именно его, но посчитал, что это будет совсем ресурсно затратно и не правильно и решил не делать так. Как нормальные люди подобное реализуют? или это что-то из разряда, что в один ответ короткий не поместится? private Transform target;
public int thisAtackTower;
public float speed = 10;
public Rigidbody2D bullet;
public Transform gunPoint;
public float fireRate = 1;
private float curTimeout;
public int ZombieArrayGivePosition;
public List<GameObject> zombieArray = new List<GameObject>();
public List<GameObject> ZombieMaxArrayList = new List<GameObject>();
public List<GameObject> zombieArrayNew = new List<GameObject>();
public GameObject NewTarget;
public AudioSource _audioSoruce;
public AudioClip FireSound;
void OnTriggerExit2D(Collider2D collider)
{
if (collider.gameObject.tag == "Zombie")
{
target = null;
zombieArray.Remove(collider.gameObject);
ZombieMaxArrayList.Remove(collider.gameObject);
}
}
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.gameObject.tag == "Zombie")
{
zombieArray.Add(collider.gameObject);
}
}
void OnTriggerStay2D(Collider2D collider)
{
if (collider.gameObject.tag == "Zombie")
{
ChekDistante();
if (target != null)
{
transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, Mathf.Atan2(target.transform.position.y - transform.position.y, target.transform.position.x - transform.position.x) * Mathf.Rad2Deg + 90);
Fire();
}
}
}
private void ChekDistante()
{
ZombieArrayGivePosition = 0;
for (int i = 0; i < zombieArray.Count; i++)
{
if (zombieArray[i].GetComponent<ZombieStandart>().NewPosition > ZombieArrayGivePosition)
{// проверяю, если максимальная точка меньше точки из массива, то беру её
ZombieMaxArrayList.Clear();
ZombieMaxArrayList.Add(zombieArray[i]);
ZombieArrayGivePosition = zombieArray[i].GetComponent<ZombieStandart>().NewPosition;
}
else if (ZombieArrayGivePosition == zombieArray[i].GetComponent<ZombieStandart>().NewPosition)
{
ZombieMaxArrayList.Add(zombieArray[i]);
}
}
if (zombieArray.Count > 0)
{
NewTarget = ZombieMaxArrayList[0];
target = NewTarget.GetComponent<Transform>();
ZombieMaxArrayList.Clear();
}
}
void Fire()
{
curTimeout += Time.deltaTime;
if (curTimeout > fireRate)
{
Debug.Log(Time.deltaTime);
curTimeout = 0;
_audioSoruce.PlayOneShot(FireSound);
Rigidbody2D clone = Instantiate(bullet, gunPoint.position, Quaternion.identity) as Rigidbody2D;
clone.GetComponent<BulletEnter>().atack = thisAtackTower;
clone.transform.up = gunPoint.up;
clone.velocity = clone.transform.up * speed;
}
}
}