我的世界 1.20.1 forge 模组开发——粒子

第一个粒子

最近有了些想法,于是乎,重新开始了模组开发的学习。
本文主要用于记录开发过程的问题,留下学习的记录。
参考forgegemwire1.20.1
参考boson1.16.5
与以上不同的是,这里将更大篇幅的记录粒子开发
而不是浅尝辄止,并且会解释的更加详细
在实操了1.16.5和1.20.1的粒子系统后
我发现粒子系统的改变并不大
1.16.5和1.20.1之间几乎只有一些名称的变化
下面的开发版本为1.20.1

生成粒子的方式

  1. 关于两端(客户端/服务端)
    首先你要知道粒子只在客户端显示
    但这并不意味着服务器与粒子的生成毫无关系
    如果你要在多人服务器中实现一些复杂的自定义时,有些数据只能从服务器获得
    比如伤害事件,只在服务端触发,这就需要数据同步或者在服务端使用SendParticles

  2. 生成粒子的方法
    服务端server
    serverLevel.SendParticles
    客户端client
    clientLevel.addParticle
    Minecraft.getInstance().particleEngine.add(particle);
    在后面会再详细的说明这两种方法的区别

  3. 关于逻辑刻和渲染刻
    逻辑刻在mc中是每秒20tick,若电脑性能较差也会有所降低
    但渲染刻则根据电脑性能不同有所区别,一般都会高于逻辑刻的频率
    要注意你影响粒子生成的是哪种刻,下面会有一个例子

TestParticle–粒子类

这里我们继承的是原版中的DustColorTransitionParticle类

  1. 为什么要继承这个类?

    并没有什么特别的,只要继承了TextureSheetParticle(1.20.1)/SpriteTexturedParticle(1.16.5)类即可使用自定义材质
    你也可以直接继承TextureSheetParticle
    主要的区别是DustColorTransitionParticle已经设置了粒子的最大生命、运动轨迹等等
    我们直接继承灰尘的表现形式

  2. 粒子需不需要注册?

    粒子需要注册,但不是像Item或者Block一样去注册Particle
    而是注册ParticleType,或者你可以把ParticleType理解成Item、Block
    一个粒子类型还需要注册一个Provider(1.20.1)/Factory(1.16.5)(这两者并没有什么区别)
    Provider类一般直接写在你的Particle类里做内部类

public class TestParticle extends DustColorTransitionParticle {
   
	//这两个成员变量来至父类,可以实现颜色的转变
    private final Vector3f fromColor;
    private final Vector3f toColor;

    protected TestParticle(ClientLevel p_172053_, double p_172054_, double p_172055_, double p_172056_, double p_172057_, double p_172058_, double p_172059_, TestOption p_172060_, SpriteSet p_172061_) {
   
        super(p_172053_, p_172054_, p_172055_, p_172056_, p_172057_, p_172058_, p_172059_, p_172060_, p_172061_);
        float f = this.random.nextFloat() * 0.4F + 0.6F;
        this.fromColor = this.randomizeColor(p_172060_.getFromColor(), f);
        this.toColor = this.randomizeColor(p_172060_.getToColor(), f);
    }
    //根据TestOptition的xyz的速度更改颜色
    private Vector3f randomizeColor(Vector3f p_254318_, float p_254472_) {
   
        return new Vector3f(this.randomizeColor(p_254318_.x(), p_254472_), this.randomizeColor(p_254318_.y(), p_254472_), this.randomizeColor(p_254318_.z(), p_254472_));
    }
	//根据粒子age、TestOption速度获取颜色
    private void lerpColors(float p_172070_) {
   
        float f = ((float)this.age + p_172070_) 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值