Danro/Assets/Scripts/Animations/EnemyAnimationEvents.cs
Danil Iarosh 92bd2d36b9 VFX Pool, new VFX, small fixes etc
- Исправил мелкие баки в поведенчеких скриптах
- Добавил CreatureAnimationEvents.cs для унификации поведения анимационных ивентов игровых сущностей
- Добавил VFX для смерти врагов
- Добавил пул VFX, пока много багов, UNSTABLE
- Настроил исользование пула в анимационных скриптах
2025-12-05 08:37:00 +03:00

92 lines
3.5 KiB
C#

using System.Collections;
using UnityEngine;
using RR.Game2D.Behaviour;
using RR.Game2D.Behaviour.ScriptableObjects;
using RR.Game2D.Core.Managers;
using UnityEngine.VFX;
namespace RR.Game2D.Animations
{
public class EnemyAnimationEvents : MonoBehaviour, CreatureAnimationEvents
{
[SerializeField] private VisualEffectAsset deathVFX;
private SFXAsset _stepSounds;
private SFXAsset _hurtSounds;
private void Awake()
{
// Загружаем и кэшируем звуковые эффекты из контроллера врага
UpdateSFX();
}
public void UpdateSFX()
{
// Кэшируем ссылки на звуковые эффекты из контроллера врага
EnemyController controller = GetComponent<EnemyController>();
_stepSounds = controller.sfxAsset.stepSounds;
_hurtSounds = controller.sfxAsset.hurtSounds;
}
public void OnDeath()
{
throw new System.NotImplementedException();
}
public void OnDeathBegin()
{
// Проигрываем звук получения урона
if (_hurtSounds && _hurtSounds.soundEffects.Length > 0)
GameManager.Instance.Audio.PlayRandomSfxAt(_hurtSounds.soundEffects, transform.position);
// Переводим врага на слой "No Collision"
gameObject.layer = LayerMask.NameToLayer("No Collision");
// Получаем компоненты
Rigidbody2D rb = GetComponent<Rigidbody2D>();
Collider2D col = GetComponent<Collider2D>();
EnemyController controller = GetComponent<EnemyController>();
EnemyFireScript fireScript = GetComponent<EnemyFireScript>();
// Отключаем скрипты и коллайдер
if (controller) controller.enabled = false;
if (fireScript) fireScript.enabled = false;
if (col) col.enabled = false;
if (!rb) return;
// Останавливаем физику
rb.linearVelocity = Vector2.zero;
rb.bodyType = RigidbodyType2D.Kinematic;
}
public void OnDeathEnd()
{
// Уничтожаем врага
// Создаем визуальный эффект смерти
if (deathVFX)
{
Collider2D col = GetComponent<Collider2D>();
Vector3 pos = new Vector3(transform.position.x, col ? col.bounds.center.y : transform.position.y, transform.position.z);
// Используем Spawn: пул сам реинициализирует, запустит Play() и вернёт объект обратно после таймаута.
GameObject vfx = VFXPool.Instance.Spawn(deathVFX, pos);
if (vfx) vfx.transform.rotation = transform.rotation;
}
Destroy(gameObject);
}
public void OnStep()
{
// Проигрываем звук шага
if (_stepSounds && _stepSounds.soundEffects.Length > 0)
GameManager.Instance.Audio.PlayRandomSfxAt(_stepSounds.soundEffects, transform.position);
}
public void OnJump()
{
throw new System.NotImplementedException();
}
}
}