自学内容网 自学内容网

Unity类银河战士恶魔城学习总结(P166 Ailments FX 异常状态伤害粒子特效)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节创建了三种粒子特效火焰寒冰雷电

主场景创建/特效/粒子

初始的例子特效

火焰

寒冰

雷电

EntityFX.cs

更改的部分!!!

进入三个状态添加特效

ShockFxForIgniteFxForChillFxFor,它们用于分别触发不同的视觉效果(电击、点燃、冰冻效果)。每个方法都会触发对应的效果并改变物体的颜色,持续一定时间后停止颜色变化。

总结分析

  1. 共同点

    • 所有三个方法都播放一个对应的视觉特效(电击、点燃或冰冻),通过调用 Play() 播放特效。
    • 通过 InvokeRepeating 方法周期性地触发对应的颜色变化函数(ShockColorFxIgniteColorFxChillColorFx),使物体的颜色呈现闪烁或渐变效果。
    • 通过 Invoke 方法在一定时间(_seconds)后停止颜色变化,调用 CancelColorChange 方法。
  2. 目的

    • 这些方法的目的在于通过视觉效果来模拟不同的状态,如电击、燃烧、冰冻等。通过定时触发颜色变化,表现出物体在不同状态下的效果。
    • InvokeRepeating 的使用使得颜色变化在指定时间内不断变化,而 Invoke 则用来在效果持续一段时间后停止。
    public void ShockFxFor(float _seconds)
    {
        shockFx.Play();

        InvokeRepeating("ShockColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }



    public void IgniteFxFor(float _seconds)
    {
        igniteFx.Play();

        InvokeRepeating("IgniteColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }


    public void ChillFxFor(float _seconds)
    {
        chillFx.Play();

        InvokeRepeating("ChillColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EntityFX : MonoBehaviour
{
    private SpriteRenderer sr;

    [Header("Flash FX")]
    [SerializeField] private float flashDuration;
    [SerializeField] private Material hitMat;
     private Material originalMat;


    [Header("Ailment 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;


    private void Start()
    {
        sr = GetComponentInChildren <SpriteRenderer>();//这行代码使用 GetComponentInChildren 方法查找并获取当前游戏对象或其子对象中的 SpriteRenderer 组件,并将其赋值给 sr 变量。
        originalMat = sr.material;
    }

    public void MakeTransprent(bool _transparent)//攻击命中时候的透明特效
    {
        if (_transparent)
            sr.color = Color.clear;
        else
            sr.color = Color.white;
    }


    private IEnumerator FlashFX()//定义了一个私有的协程 FlashFX,用于在一段时间内改变 SpriteRenderer 的材质,然后恢复原始材质。
    {
        sr.material = hitMat;
        Color currentColor = sr.color;//保存最开始的颜色,闪光之后变回去

        sr.color = Color.white;
        yield return new WaitForSeconds(flashDuration);

        sr.color = currentColor;
        sr.material = originalMat;

    }

    //P59,骷髅战士的血条闪烁
    private void RedColorBlink()
    {
        if(sr.color !=Color.white)
            sr.color = Color.white;
        else
        {
            sr.color = Color.red;
        }
    }

    private void CancelColorChange()
    {
        CancelInvoke();//调用 CancelInvoke 方法取消所有与当前游戏对象关联的 Invoke 调用。
        sr.color = Color.white;

        igniteFx.Stop();
        chillFx.Stop();
        shockFx.Stop();
    }


    //10月30日
    //三个状态的携程
    public void ShockFxFor(float _seconds)
    {
        shockFx.Play();

        InvokeRepeating("ShockColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }



    public void IgniteFxFor(float _seconds)
    {
        igniteFx.Play();

        InvokeRepeating("IgniteColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }


    public void ChillFxFor(float _seconds)
    {
        chillFx.Play();

        InvokeRepeating("ChillColorFx", 0, .3f);
        Invoke("CancelColorChange", _seconds);
    }



    private void ShockColorFx()
    {
        if (sr.color != shockColor[0])
            sr.color = shockColor[0];
        else
        {
            sr.color = shockColor[1];
        }
    }


    private void IgniteColorFx()//燃烧状态颜色
    {
        if (sr.color != igniteColor[0])
            sr.color = igniteColor[0];
        else
        {
            sr.color = igniteColor[1];
        }
    }

    private void ChillColorFx()//燃烧状态颜色
    {
        if (sr.color != chillColor[0])
            sr.color = chillColor[0];
        else
        {
            sr.color = chillColor[1];
        }
    }



}
   


原文地址:https://blog.csdn.net/suzh1qian/article/details/144224207

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!