EntityFX.cs
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
using Random = UnityEngine.Random;
public class EntityFX : MonoBehaviour
{
private SpriteRenderer sr;
[Header("Flash FX")]
[SerializeField] private float flashDuration;
[SerializeField] private Material hitMat;
private Material originalMat;
[Header("Ailemnt colors")]
[SerializeField] private Color[] chillColor;
[SerializeField] private Color[] igniteColor;
[SerializeField] private Color[] shockColor;
[Header("Ailment particles")]
[SerializeField] private ParticleSystem igniteFx;
[SerializeField] private ParticleSystem chillFx;
[SerializeField] private ParticleSystem shockFx;
[Header("Hit FX")]
[SerializeField] private GameObject hitFx;
[SerializeField] private GameObject criticalHitFx;
private void Start()
{
sr = GetComponentInChildren<SpriteRenderer>();
//sr = GetComponent<SpriteRenderer>();
originalMat = sr.material;
}
public void MakeTransprent(bool _transprent)
{
if (_transprent)
{
sr.color = Color.clear;
}
else
{
sr.color = Color.white;
}
}
private IEnumerator FlashFX()
{
sr.material = hitMat;
Color currentColor = sr.color;
sr.color = Color.white;
yield return new WaitForSeconds(flashDuration);
sr.color = currentColor;
sr.material = originalMat;
//Invoke
}
private void RedColorBlink()
{
if (sr.color != Color.white)
{
sr.color = Color.white;
}
else
{
sr.color = Color.red;
}
}
private void CancelColorChange()
{
CancelInvoke();
sr.color = Color.white;
igniteFx.Stop();
chillFx.Stop();
shockFx.Stop();
}
public void IgniteFxFor(float _seconds)
{
if (igniteFx == null)
return;
else
igniteFx.Play();
InvokeRepeating("IgniteColorFx", 0, .3f);
Invoke("CancelColorChange", _seconds);
}
public void ShockFxFor(float _seconds)
{
if (shockFx == null)
return;
else
shockFx.Play();
InvokeRepeating("ShockColorFx", 0, .3f);
Invoke("CancelColorChange", _seconds);
}
public void ChillFxFor(float _seconds)
{
if (chillFx == null)
return;
else
chillFx.Play();
InvokeRepeating("ChillColorFx", 0, .3f);
Invoke("CancelColorChange", _seconds);
}
private void IgniteColorFx()
{
if (sr.color != igniteColor[0])
sr.color = igniteColor[0];
else
sr.color = igniteColor[1];
}
private void ShockColorFx()
{
if (sr.color != shockColor[0])
sr.color = shockColor[0];
else
sr.color = shockColor[1];
}
private void ChillColorFx()
{
if (sr.color != chillColor[0])
sr.color = chillColor[0];
else
sr.color = chillColor[1];
}
public void CreateHitFx(Transform _target,bool _critical)
{
if (hitFx == null|| (_critical && criticalHitFx == null)) return;
float zRotation = Random.Range(-90, 90);
float xPostiotion = Random.Range(-.5f, .5f);
float yPostiotion = Random.Range(-.5f, .5f);
Vector3 hitFxRotation = new Vector3(0,0,zRotation);
GameObject hitPrefab = hitFx;
if (_critical)
{
hitPrefab = criticalHitFx;
float yRotation = 0;
zRotation = Random.Range(-45,45);
if (GetComponent<Entity>().facingDir == -1)
yRotation = 180;
hitFxRotation = new Vector3(0, yRotation, zRotation);
}
GameObject newHitFx = Instantiate(hitPrefab,_target.position + new Vector3(xPostiotion, yPostiotion), Quaternion.identity);
//newHitFx.transform.position = new Vector2(xPostiotion,yPostiotion);
newHitFx.transform.Rotate(hitFxRotation);
Destroy(newHitFx, .5f);
}
}
CharacterStats.cs
public virtual void DoDamage(CharacterStats _targetStats)
{
bool criticalStrike = false;
if (TargetCanAvoidAttack(_targetStats))
return;
_targetStats.GetComponent<Entity>().SetupKnockbackDir(transform);
int totalDamage = damage.GetValue() + strength.GetValue();
if (CanCrit())
{
totalDamage = CalculateCriticalDamage(totalDamage);
criticalStrike = true;
}
fx.CreateHitFx(_targetStats.transform , criticalStrike);
totalDamage = CheckTargetArmor(_targetStats, totalDamage);
_targetStats.TakeDamage(totalDamage);
DoMagicalDamage(_targetStats);
}