ベクトルパーティクルについて

# はじめに
この記事は、/particleついて、ある程度の知識があるを前提としています。

今回解説する動くparticleのことを、"**ベクトルパーティクル**"と呼称します。

### まずこれを見てほしい

<img width="500" alt="2023-12-15 08-51-04 - Trim.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616983/4866a354-bbd4-ebc1-d382-9074e6c4191b.gif">

配布されてるデータパックやマップをプレイしたことがあるなら見たことがあるだろう、
普通だったらランダムな方向に飛んで行ってしまうparticleが
上記のgifように特定の方向にのみ進むparticle、これについて解説していきます。

# とりあえず例文を

といっても原理を先に説明しても普通何もわからないので、例文を用意しました。
```/execute as @e[type=armor_stand] at @s anchored eyes positioned ^ ^ ^ run ```
```particle flame ~ ~ ~ ^ ^ ^10000000 0.00000001 0 normal @a```

これだけ見ても何もわからない人が多いと思うので、軽く解説すると
実行者の目の位置から前方にflameを飛ばす、という処理です。
上記のアマスタからflameを飛ばしてるgifはこれを使っています。

execute ~ runの部分についてはこの記事の主題とは外れるので省きますが、
/particleについて多少の知識を持っているなら違和感に気付けるはずです。

そう、**表示範囲、速度、個数の部分が明らかにおかしいです。**
普通、/particleを書くときは
普通、表示範囲には実数を、速度にはもっと1に近い値を、表示数には1以上の数値を入れます。
ですが、ベクトルパーティクルは違います。
ベクトルパーティクルは
・ベクトルパーティクルに使えるparticleを用いること
・表示範囲のxyzの値の最低1つの値を0より大きくすること
・速度の値を0より大きくすること
・表示数を0にすること
この条件を満たすことでベクトルパーティクルにできます。
具体的な記述については後述します。

# 原理について

### ベクトルパーティクルにできるparticleの種類
ベクトルパーティクルは全ての種類のparticleには対応していません。
それなら、一体どのparticleなら対応しているのか、それは、**速度の値が実際に反映されるparticle**です。
それ以外のparticleでやろうとしても上手く行きません。

私の記事でParticleチートシートの内容として速度の値が反映されるかを書いているので
よかったら参考にしてください

https://qiita.com/Lapis-lja/items/a408eaeaaebe113a308e

### なぜparticleの表示数が0なのか
**はっきり言って仕様です。**
そのようにしないとベクトルパーティクルはできません。
この仕様により、ベクトルパーティクルは1コマンドにつき1つしか表示できません。

### なぜ表示範囲と速度の値があの様になっているのか
この理由を端的に表すと、
**相対座標を入れた場合、表示範囲部分の値が小さいと上手く行かないから** です。

一旦それはおいておいて、
やり方としては、表示範囲のxyzの値の代わりに、実行座標からxyzのどの方向に飛んでいって欲しいかを入力します。

#### ベクトルを入力した場合
ベクトルとは、表示範囲xyzに実数をそのまま入れた場合のことを指すとします。

例として、実行位置の真上へ飛んで欲しいときは
```/particle flame ~ ~ ~ 0 1 0 0.1 0 normal @a``` でできます。
もしこのコマンドのparticleの速度を変えるなら、速度の値を変えるか、yベクトルの値を変えるとできます。
飛ばす方向を変えるなら、ベクトルの各値を任意の値にするとできます。

<img width="500" alt="2023-12-15 09-59-05 - Trim.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616983/d229915f-f2cd-934e-f6e9-61b4c9f6bcdf.gif">

「...え？さっきのあの値はなんだったの？」ってなったと思いますが、
これは向き相対ではなくベクトルを入力した場合の話です。

#### 相対座標を入力した場合
相対座標を入力する場合も、どの方向へ飛んで欲しいかで入力する値を決めるかは変わりません。
ですが、入力する値が大きく変わります。

例文として、さっきと同じコマンドではありますが
```/particle flame ~ ~ ~ ^ ^ ^10000000 0.00000001 0 normal @a```
これは、flameを目線の10000000ブロック先へ、速度を0.00000001で飛ばすコマンドです。

<img width="500" alt="2023-12-15 08-51-04 - Trim.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616983/4866a354-bbd4-ebc1-d382-9074e6c4191b.gif">

やっぱり、設定されてる値がおかしいですよね。私もそう思います。
この理由として、値が小さいとおかしな方向へ飛んで行ってしまうからです。
その詳しい理由は省きますが、表示範囲の値を大きくしているのは、**限りなく遠くに設定し、誤差を小さくすることで任意の方向に飛ばしているから**です。
当然、その値が大きくなるほどparticleの速度も速くなるので、その分速度の値は小さくする必要があります。
これが真相です。

# 結局どう書いたら上手く行くの?
まず、/particleの速度の値が実際に反映されるparticleを使います。

次に、
entityの向きに関係なしにparticleを飛ばすのなら、表示範囲のxyzに飛ばしたい方向へのベクトルを入れます。

```/particle flame ~ ~ ~ 0 1 0 0.1 0 normal @a```
これで、実行位置の真上に飛ばせます。

entityの向きに依存させて飛ばすのなら、表示範囲のxyzに飛ばしたい方向への向き相対を入れます。

```/particle flame ~ ~ ~ ^ ^ ^10000000 0.00000001 0 normal @a```
これで、実行者の向いている方向に飛ばすことが出来ます。

飛ばす方向が決まったので、その分particleの速度を下げます。

最後に、**絶対に表示数を0にします。**

これでベクトルパーティクルにできます。

# 終わりに
ここまでちゃんと読んだなら、ある程度は理解できたんじゃないかと思います。
ベクトルパーティクルには無限の可能性があるので、皆さんもいい演出目指してください。

ちょっとした応用の1例を貼って終わりとします。
読了、ありがとうございました。

<img width="500" alt="2023-12-15 10-41-07 - Trim.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616983/03f3ec65-87f6-6291-6527-d0a6b2f758b0.gif">