本篇教程的视频:

本篇教程源代码

GitHub地址:TutorialMod-Particle-1.21

介绍

老本行吗?不是

虽然说我以前是干粒子特效的,但是现在我已经不干了,而是主要写模组出教程了,不过,也许我可以重启粒子特效的教程,不过那是以后的事情了

这里我们将为我们的模组添加自定义粒子,这个粒子是一个简单的粒子,也就是Fabric Wiki是经典的GREEN FLAME,这个粒子是一个绿色的火焰粒子

因为更为复杂的粒子特效教程有人在做了,大家可以前往Here

查看源代码

原版的那些粒子可以到ParticleTypes这个类中查看

1
2
3
4
public static final SimpleParticleType ANGRY_VILLAGER = register("angry_villager", false);
...
public static final ParticleType<DustParticleEffect> DUST = register("dust", false, type -> DustParticleEffect.CODEC, type -> DustParticleEffect.PACKET_CODEC);
...

主要是两个类,一个是SimpleParticleType,一个是ParticleType,这两个类是用于注册粒子的类型

前者是非常简单的粒子,后者是比较复杂的粒子,比如说DustParticleEffect这个粒子就是一个复杂的粒子,它有颜色大小,又可以旋转等等

本篇教程我们将使用SimpleParticleType来注册一个简单的粒子,而上面给出的那个链接是一个比较复杂的粒子,大家可以去看看

那么下面的就是注册方法,当然我们不能直接用

1
2
3
private static SimpleParticleType register(String name, boolean alwaysShow) {
return Registry.register(Registries.PARTICLE_TYPE, name, new SimpleParticleType(alwaysShow));
}

这个方法我们待会还得改写

注册粒子

创建ModParticles类

这个类用于粒子的注册

1
2
3
public class ModParticles {

}

我们先来搞定它的注册方法

1
2
3
private static SimpleParticleType register(String name, SimpleParticleType type) {
return Registry.register(Registries.PARTICLE_TYPE, Identifier.of(TutorialMod.MOD_ID, name), type);
}

可以看到,我们这里的name是一个String,而type是一个SimpleParticleType,这里就直接指定了。这里并不像原版的那样是布尔值,改成了粒子类型。

后面再指定我们的命名空间

接下来就是注册我们的粒子

1
public static final SimpleParticleType GREEN_FLAME = register("green_flame", FabricParticleTypes.simple());

这里我们注册了一个GREEN_FLAME的粒子,这个粒子是一个绿色的火焰粒子,我们使用了FabricParticleTypes.simple()这个方法来创建一个简单的粒子,这是FabricAPI

最后一个是初始化方法

1
2
public static void registerModParticles() {
}

并在主类初始化

1
ModParticles.registerModParticles();

客户端注册

粒子这种东西它是要渲染的,所以我们需要在客户端注册

1
ParticleFactoryRegistry.getInstance().register(ModParticles.GREEN_FLAME, FlameParticle.Factory::new);

这里我们注册了GREEN_FLAME粒子,这个粒子的工厂是FlameParticle.Factory,这个工厂是原版的火焰粒子的工厂,我们可以直接使用

粒子文件

路径:resources/assets/tutorialmod/particles,名字就是我们注册的green_flame

1
2
3
4
5
{
"textures": [
"tutorialmod:green_flame"
]
}

使用粒子

用到粒子的地方其实很多,比如破坏方块、实体死亡、实体受伤等等,都会用到粒子

教程中我们没有这样的实例,这里的图文教程我补充一下

我们随便找一个之前写的自定义方块类,然后加入以下代码

1
2
3
4
5
6
7
8
9
10
@Override
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) {
float f = 0.25f;
if (random.nextFloat() < f) {
world.addParticle(ModParticles.GREEN_FLAME,
pos.getX() + random.nextDouble(), pos.getY() + random.nextDouble(), pos.getZ() + random.nextDouble(),
0, 0.1, 0);
}
super.randomDisplayTick(state, world, pos, random);
}

我们重写方块的randomDisplayTick方法

让这个方块随机产生粒子,这个粒子是GREEN_FLAME,位置是方块的位置(xyz),后面三个是xyz方向上的初速度

这样我们就可以看到在方块上产生的粒子了

另外,我们也可以使用particle命令来产生粒子