using UnityEngine;
public class Bullet : MonoBehaviour
{
public float speed;
public float lifetime;
public float distance;
public int damage;
public LayerMask whatIsSolid;
private Transform player; // Ссылка на игрока
private Vector2 target; // Цель, куда должна лететь пуля
[SerializeField] bool enemyBullet;
private void Start()
{
Invoke("DestroyBullet", lifetime);
if(enemyBullet)
{
// Найти игрока на сцене (убедитесь, что у объекта игрока есть тег "Player")
player = GameObject.FindGameObjectWithTag("Player").transform;
// Вычислить вектор направления на игрока
target = (player.position - transform.position).normalized;
}
}
private void Update()
{
RaycastHit2D hitInfo = Physics2D.Raycast(transform.position, transform.up, distance, whatIsSolid);
if(hitInfo.collider != null)
{
if(hitInfo.collider.CompareTag("Enemy"))
{
hitInfo.collider.GetComponent().TakeDamage(damage);
}
if(hitInfo.collider.CompareTag("Player") && enemyBullet)
{
hitInfo.collider.GetComponent().ChangeHealth(-damage);
}
DestroyBullet();
}
// Перемещать пулю в направлении цели, если она вражеская
if (enemyBullet && target != Vector2.zero)
{
transform.up = target; // повернуть пулю к цели
transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
}
else // если это не вражеская пуля, она продолжит движение вверх
{
transform.Translate(Vector2.up * speed * Time.deltaTime);
}
}
public void DestroyBullet()
{
Destroy(gameObject);
}
}
Обратите внимание на то, что скрипт теперь ищет объект игрока и сохраняет вектор направления от пули к игроку. В методе Update, если переменная enemyBullet установлена в true, пуля будет повернута и двинется в сторону игрока, иначе она продолжит движение вверх как раньше. Убедитесь, что у игрока есть тег "Player", чтобы его можно было обнаружить с помощью GameObject.FindGameObjectWithTag.
код пули:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float speed;
public float lifetime;
public float distance;
public int damage;
public LayerMask whatIsSolid;
[SerializeField] bool enemyBullet;
private void Start()
{
Invoke("DestroyBullet", lifetime);
}
private void Update()
{
RaycastHit2D hitInfo = Physics2D.Raycast(transform.position, transform.up, distance, whatIsSolid);
if(hitInfo.collider != null)
{
if(hitInfo.collider.CompareTag("Enemy"))
{
hitInfo.collider.GetComponent<Enemy>().TakeDamage(damage);
}
if(hitInfo.collider.CompareTag("Player") && enemyBullet)
{
hitInfo.collider.GetComponent<Player>().ChangeHealth(-damage);
}
DestroyBullet();
}
transform.Translate(Vector2.up * speed * Time.deltaTime);
}
public void DestroyBullet()
{
Destroy(gameObject);
}
}