using PrimeTween; using TMPro; using UnityEngine; public class DamageNumberParticles : MonoBehaviour { public TextMeshProUGUI TextMesh; public Camera TextCamera; private CanvasRenderer _textRenderer; private ParticleSystem _damageParticles; private RenderTexture _renderTexture; private MaterialPropertyBlock _particleMaterialProps; private ParticleSystemRenderer _particleRenderer; private int _lastDamageNumber = -1; void Awake() { _damageParticles = gameObject.GetComponent(); _particleRenderer = gameObject.GetComponent(); _textRenderer = TextMesh.canvasRenderer; _particleMaterialProps = new(); _particleRenderer.GetPropertyBlock(_particleMaterialProps, 0); _renderTexture = new RenderTexture(256, 256, 24); TextCamera.targetTexture = _renderTexture; } void Start() { WaitForScene(); } async void WaitForScene() { await Tween.Delay(1f); SetDamageNumber(100); } public void SpawnDamageNumber(int damageValue, Vector3 direction) { SetDamageNumber(damageValue); var particleVelocity = _damageParticles.velocityOverLifetime; particleVelocity.x = direction.x; particleVelocity.y = direction.y; particleVelocity.z = direction.z; _damageParticles.Emit(1); } void SetDamageNumber(int number) { if (_lastDamageNumber == number) return; TextMesh.text = number.ToString(); TextCamera.enabled = true; TextCamera.Render(); Texture2D texture2D = new(_renderTexture.width, _renderTexture.height); RenderTexture.active = _renderTexture; texture2D.ReadPixels(new Rect(0, 0, _renderTexture.width, _renderTexture.height), 0, 0); texture2D.Apply(); _particleMaterialProps.SetTexture("_MainTex", texture2D); _particleRenderer.SetPropertyBlock(_particleMaterialProps); TextCamera.enabled = false; _lastDamageNumber = number; } }