【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节创建了三种粒子特效,火焰,寒冰,雷电
主场景创建/特效/粒子
初始的例子特效
火焰
寒冰
雷电
EntityFX.cs
更改的部分!!!
进入三个状态添加特效
ShockFxFor
、IgniteFxFor
和 ChillFxFor
,它们用于分别触发不同的视觉效果(电击、点燃、冰冻效果)。每个方法都会触发对应的效果并改变物体的颜色,持续一定时间后停止颜色变化。
总结分析:
-
共同点:
- 所有三个方法都播放一个对应的视觉特效(电击、点燃或冰冻),通过调用
Play()
播放特效。 - 通过
InvokeRepeating
方法周期性地触发对应的颜色变化函数(ShockColorFx
、IgniteColorFx
、ChillColorFx
),使物体的颜色呈现闪烁或渐变效果。 - 通过
Invoke
方法在一定时间(_seconds
)后停止颜色变化,调用CancelColorChange
方法。
- 所有三个方法都播放一个对应的视觉特效(电击、点燃或冰冻),通过调用
-
目的:
- 这些方法的目的在于通过视觉效果来模拟不同的状态,如电击、燃烧、冰冻等。通过定时触发颜色变化,表现出物体在不同状态下的效果。
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;elsesr.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];}}}