类银河恶魔城 P18-4 P18-5 Snow and Fire flies Hit and Critical hit particles

发布于:2025-07-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

 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);
 }


网站公告

今日签到

点亮在社区的每一天
去签到