Задать вопрос
@Kiryuha161

После того, как поставил Spawn Manager, игрок перестал стрелять, а полоса здоровья перестала уменьшаться. Почему и как это исправить?

Добрый день! В 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;
		}
	}
}
  • Вопрос задан
  • 45 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы