Space-Smash-Out/Assets/Scripts/DamageNumberParticles.cs

72 lines
1.8 KiB
C#

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<ParticleSystem>();
_particleRenderer = gameObject.GetComponent<ParticleSystemRenderer>();
_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;
}
}