Unity类银河战士恶魔城学习总结(P166 Ailments FX 异常状态伤害粒子特效)
【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;
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)!