マイクラでカスタムパーティクルを作ったお話

マイクラコマンドアドベントカレンダー!? おもしろそう!!!!
とりあえず1枠取った!!
せっかくの機会だし、これまで自分がやったことないことをやってみよう!
そこで、自作カスタムパーティクルの制作が頭に浮かびました

image.png

ということでこの記事は、自分がマイクラで頑張ってカスタムパーティクルを作った、備忘録みたいなものになります

由一些从未认真撰写过愚蠢的电脑文档的人所创作的,因此请您在睡觉前喝杯咖啡,漠视地阅读它吧☆☆☆(?)

我們該用什麼方法去尋找創造的途徑?

我想把在外部绘制的纹理带进游戏里,可能需要自定义模型数据…我们来看看前辈的数据包吧。

senjin.png

我觉得他应该在用自定义字体(小並感)。
所以我打算用自定义字体来制作自定义粒子。

制作资源包

image.png
image.png

当将制作好的资源包放入我的世界并输入下方的指令时…

/summon minecraft:text_display ~ ~ ~ {text:'{"text":"\\uE000"}',background:0,billboard:center,brightness:{block:15,sky:15}}
/summon minecraft:text_display ~ ~ ~ {text:'{"text":"\\uE001"}',background:0,billboard:center,brightness:{block:15,sky:15}}
/summon minecraft:text_display ~ ~ ~ {text:'{"text":"\\uE002"}',background:0,billboard:center,brightness:{block:15,sky:15}}
/summon minecraft:text_display ~ ~ ~ {text:'{"text":"\\uE003"}',background:0,billboard:center,brightness:{block:15,sky:15}}
image.png

在我的Minecraft游戏中,我绘制的图像成功地以文字显示的形式呈现出来了!

用相同的方式,可将图像强行覆盖在UNICODE字体上,使得在「uE000」位置显示最左边的图像,在「uE001」位置显示从左数第二个图像。现在资源包已经完成了。

制作数据包

下一步,我打算用命令创建一个类似于使用连续拍摄模式的方式将刚才的内容制作成动画的系统。

首先,我们将召唤一个用于安装自定义字体的文本显示装置。

summon minecraft:text_display ~ ~ ~ {Tags:[particle,slash],text:'{"text":"\\uE000"}',background:0,billboard:center,brightness:{block:15,sky:15}}

将背景色设为透明,亮度设为最大,这是一个包含“uE000”文本的显示器↓

image.png

下一步,我们会创建一个系统,每个tick将其更改为下一张图片。要实现这一点,我们必须了解“我应该显示第几帧图像”,因此我们需要为文本显示自身准备一个可测量的“计时器”。有多种实现计时器的方法,例如使用Storage或PortalCooldown,但本次我们打算使用“记分板”。

#データパックをリロードしたときに実行する
    scoreboard objectives add age dummy

我为计时器准备了一个记分板,我给它取名为“age”,意思是“年龄”。

#毎ティック実行する
    execute as @e[tag=particle] run scoreboard players add @s age 1

↑然后,此计时器将每个刻度增加1。
在”execute as @e[tag=particle]”这部分,我们选择了之前的文本显式。
你知道分数也可以给除了玩家之外的实体使用哦~

现在,我们已经完成每个时钟周期增加1分的得分的部分了。
接下来,让我们写一个根据这个计时器的值来改变文本显示图像的处理逻辑。

#タイマーをまだもらってない憐れなテキストディスプレイに対して初動のタイマーを授ける
    execute unless entity @s[scores={age=0..}] run scoreboard players set @s age 0

#タイマーが1のとき、2のとき、3のとき、に、テキストディスプレイの中身を書き換える
    execute if entity @s[scores={age=1}] run data modify entity @s text set value '{"text":"\\uE001"}'
    execute if entity @s[scores={age=2}] run data modify entity @s text set value '{"text":"\\uE002"}'
    execute if entity @s[scores={age=3}] run data modify entity @s text set value '{"text":"\\uE003"}'
#タイマーが4のとき、自分自身をkillする
    execute if entity @s[scores={age=4}] run kill @s

当计时器推进时的处理,然后每个tick都执行此操作…

#毎ティックタイマーの処理を実行する
    execute as @e[tag=slash] at @s run function particle:slash/
#毎ティックタイマーを1増やす
    execute as @e[tag=particle] run scoreboard players add @s age 1

できた。これでsummon.mcfunctionを実行させると…

1.gif

搞定了!粒子以流畅的方式显示出来。


召唤文本显示器

计时器数量增加

根据计时器变化的图片也随之改变

再次计时器增加

再次图片改变


按照以下方式,自制的粒子效果将被显示出来。
很遗憾,因为是gif格式,所以流畅度稍微不太容易感受到…
好了!自定义的粒子完成了!就这样结束!!

你以为呢?

嗯,虽然现在就这样结束也可以,但是在制作过程中我有些想法。比如说:“就只有这些感觉有点不够呢”。这样的话,和别人制作的粒子没有任何区别。那样我就不喜欢了,所以我想要自己想出“希望有的东西”,并加入身份。我认为对于我所想的粒子,“希望有的东西”就是『尺寸的变化』。你不觉得能够随意调整尺寸的粒子会很方便吗?从现在开始我会实现这个系统。

最后挣扎不已

既然有机会,那么这次就试试最近推出的”宏”吧。在输入”function”命令时,可以添加选项的功能(严格来说并非如此的认知)。这次我们将写一个带有名为”Size”的选项的函数。

#テキストディスプレイを召喚
summon minecraft:text_display ~ ~ ~ {Tags:[particle,slash,summoned],text:'{"text":"\\uE000"}',background:0,billboard:center,brightness:{block:15,sky:15}}

#「召喚された瞬間」のテキストディスプレイに、マクロで受け取った値をnbtに代入
$execute as @e[tag=summoned] run data modify entity @s transformation.scale set value [$(Size),$(Size),$(Size)]

#「召喚された瞬間」を認識するタグを剥奪
execute as @e[tag=summoned] run tag @s remove summoned

ドルマークから始まってる文がマクロ文です
[\$(Size),\$(Size),\$(Size)] の部分が、
例えば5.0を代入すると、 [5.0,5.0,5.0]、
10.0を代入すると、[10.0,10.0,10.0]
として扱われます
functionを実行するときにオプションで加えた好きな値をここで反映してくれる訳ですね

こうしてマクロのおかげでサイズを手軽に自由に変えられるようになったカスタムパーティクル、完成品がこちらになりまーす↓

可以通过宏来自由调整尺寸的自制粒子 pic.twitter.com/8ChdPf997l— ほりしゅ (@Twi_HollySyu) 2023年12月1日

当自制斩击粒子用于对剑的击打时,大量产生!!!

最后

自作パーティクルなんて正直いくらでも作り方はあるしわざわざ記事にするまでもない事だったのかもしれないけど、挑戦したなら記事にしたいよねってことで書いてみました。
自分オリジナルの要素も思いついて実装できたからけっこう満足したね。
この記事が少しでも初心者中級者上級者の参考になれば幸いです。


あとこの記事が上がる日12/6は私の誕生日なのでぜひTwitterで祝えください
Twitter → @Twi_HollySyu

请参考

某M氏的视频:(https://www.youtube.com/watch?v=w0Zraz-o8yE)

為了那些耐心閱讀到這裡的人,這裡有可以下載本次的詳細時間表和資源的連結:(https://github.com/HollySyu/CustomParticele-By-HollySyu/tree/main)

广告
将在 10 秒后关闭
bannerAds