Добрый день! В Unity не так давно, опыта не много. Столкнулся с такой проблемой: у игрока и врага были установлены полосы здоровья. По нажатию кнопки игрок стреляет префабом пули. Когда пуля попадает у врага уменьшается здоровье и полоса. Когда игрок сталкивается с врагом, то уменьшается здоровье и полоса у игрока. Всё работало нормально. Но когда я написал код спавна игрок перестал стрелять и полосы здоровья не работают ни у врага, ни у игрока. В чём может быть причина и как это исправить?
Вот код спавна:
public class SpawnManager : MonoBehaviour
{
public GameObject[] EnemyPrefabs;
private float _borderX = 19f;
private float _borderY = 7.5f;
private float _positionX;
private float _positionY;
void Start()
{
SetRandomPosition();
Vector2 enemyPosition = new Vector2(_positionX, _positionY);
for (int i = 0; i < EnemyPrefabs.Length; i++)
{
SetRandomPosition();
Instantiate(EnemyPrefabs[i], enemyPosition, Quaternion.identity);
}
}
private void SetRandomPosition()
{
_positionX = Random.Range(-_borderX, _borderX);
_positionY = Random.Range(-_borderY, _borderY);
}
}
Код выстрела
public class Shoot : MonoBehaviour
{
private float _attackDistance = 1f;
private float _closestDistance = float.MaxValue;
private float _bulletSpeed = 5f;
[SerializeField] private GameObject _bulletPrefab;
[SerializeField] private Transform _gunTransform;
[SerializeField] private Button _buttonShoot;
private GameObject[] _enemies;
public Transform Target;
public GameObject ClosestEnemy;
public GameManager GameBehavior;
private void Start()
{
_buttonShoot.onClick.AddListener(FindAndShoot);
GameBehavior = GameObject.Find("Game manager").GetComponent<GameManager>();
}
private void FindClosestEnemy()
{
_enemies = GameObject.FindGameObjectsWithTag("Enemy");
foreach(GameObject enemy in _enemies)
{
float distance = Vector2.Distance(transform.position, enemy.transform.position);
if(distance <= _closestDistance)
{
_closestDistance = distance;
ClosestEnemy = enemy;
Target = ClosestEnemy.transform;
}
if(distance > _closestDistance)
{
_closestDistance = float.MaxValue;
}
}
}
private void ShootInClosestEnemy()
{
if (GameBehavior.Patrons > 0)
{
Instantiate(_bulletPrefab, _gunTransform.position, _gunTransform.rotation);
GameBehavior.Patrons--;
if (GameBehavior.Patrons <= 0)
{
GameBehavior.Patrons = 0;
}
}
}
private void FindAndShoot()
{
FindClosestEnemy();
if (ClosestEnemy != null && _closestDistance <= 5f)
{
ShootInClosestEnemy();
}
}
}
Код пули:
public class Bullet : MonoBehaviour
{
public Rigidbody2D _bulletRb;
public Transform Target;
private Enemy _enemy;
private Shoot _shoot;
private float _bulletSpeed = 5f;
private void Start()
{
_shoot = GameObject.FindObjectOfType<Shoot>().GetComponent<Shoot>();
_enemy = FindObjectOfType<Enemy>().GetComponent<Enemy>();
_bulletRb= GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
Target = _shoot.Target;
Vector3 direction = (Target.position - transform.position).normalized;
GetComponent<Rigidbody2D>().velocity = direction * _bulletSpeed;
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
Hit(20);
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
Hit(25);
}
}
private void Hit(float damage)
{
Destroy(gameObject);
_enemy.TakeDamage(damage);
}
}
И код полосы здоровья. Не знаю, что ещё может пригодиться.
public class HealthBar : MonoBehaviour
{
public Image[] FillImages;
public List<Character> CharacterObjects;
public void Start()
{
CharacterObjects = FindObjectsOfType<Character>().ToList();
for (int i = 0; i < CharacterObjects.Count; i++)
{
CharacterObjects[i].GetComponent<Character>();
}
}
private void Update()
{
for(int i = 0; i <CharacterObjects.Count;i++)
{
FillImages[i].fillAmount = CharacterObjects[i].CurrentHealth / CharacterObjects[i].MaxHealth;
}
}
}