uploaded:2020/11/01 engine version:1.16.40

HPバーをパーティクルだけでつくる


 アニメーションコントローラやエンティティのクライアントjsonと紐付けするのは各自でやってください。
 つけたいエンティティのjsonを編集して紐付けるので、すべてのエンティティにつけたい場合は手動ですべてのエンティティのjsonを編集する必要があります。
 コマンドでこのパーティクルを出そうとすると何も出ません。追加できているかどうかはパーティクル単体では確かめることはできません。


Res../particles/hp_bar.json
{
  "format_version": "1.10.0",
  "particle_effect": {
    "description": {
      "identifier": "ex:hp_bar",
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/particle/hp_bar"
      }
    },
    "components": {
     "minecraft:emitter_local_space": {
        "position": true,
        "rotation": true
      },
      "minecraft:particle_motion_parametric": { //エンティティの足元からの高さ = 2.25
        "relative_position": [ 0.0, 2.25, 0.0 ]
      },
      "minecraft:emitter_rate_steady": {
        "spawn_rate": "Math.random(15, 25)",
        "max_particles": 50
      },
      "minecraft:emitter_lifetime_looping": {
       "active_time": 10,
       "sleep_time": 0
      },
      "minecraft:emitter_lifetime_expression": {
        "activation_expression": 1,
        "expiration_expression": 0
      },
      "minecraft:emitter_shape_custom": {
        "offset": [ 0, 0.1, 0 ],
        "direction": [ 1.0, 0.0, 0.0 ]
      },
      "minecraft:particle_lifetime_expression": {
        "max_lifetime": 0.5
      },
      "minecraft:particle_appearance_billboard": {
        "size": [ 0.25 , 0.02 ], //拡大率 [ 横, 縦 ]
        "facing_camera_mode": "lookat_xyz",
        "uv": {
          "texture_width": 64,
          "texture_height": 64,
          "uv": [ "(1.0 - query.health / query.max_health) *32", "(query.health == 0) ? 34 : 30" ], //いちばん重要なところ
          "uv_size": [ 32, 4 ]
        }
      },
      "minecraft:particle_appearance_tinting": { //次に重要なところ
        "color": [ 
          "math.min(2- 2*query.health/query.max_health, 1)",
          "math.min(2*query.health/query.max_health, 1)",
          0.0,
          1.0
        ]
      }
    }
  }
}

「いちばん重要なところ」がHPを検知してテクスチャに反映させている部分です
「次に重要なところ」は白黒のテクスチャに色をつけるために必要なコンポーネントです。逆に、後からこうして色をつけるためにテクスチャは白黒になっています。

■色の遷移方式の変更

 上記のjsonの状態では、HP最大からゼロにかけて緑から黄や橙を通じてだんだんと赤になっていく遷移方式です。
 そこで、ある値を境にパッと黄、赤へと変わる遷移方式にする場合のコードを紹介します。
 上記の「次に重要なところ」が指すコンポーネント内の"color"要素を次のように変更します。
"color": [
  "(query.health / query.max_health < 0.25) ? 1.0 : 0.0",
  "(query.health / query.max_health < 0.125) ? 0.0 : 1.0",
  0.0,
  1.0
]

 この場合、HPが全体の0.25(=1/4)より小さくなった場合に黄色く、HPが全体の0.125(=1/8)より小さくなった場合に赤くなるようになっています。その二つの値についてはお好みで変更するといいでしょう。


Res../textures/particle/hp_bar.png
※テクスチャ本体を長押しや右クリックするとダウンロードできると思います
※ぼやけて見えますが、ダウンロードしたものはぼやけません(そのまま使えます)

 意味があって白黒にしてあります。色を塗ると色が混ざります。
 色を変えたい場合は上記のパーティクル定義jsonにある色を司る部分にて指定してください。

■最も重要な部分の解説

 "minecraft:particle_appearance_billboard"の"uv"ではテクスチャの切り取る部分(の基準)を指定し、"uv_size"でその切り取る大きさを指定しますが、今回は元のテクスチャテクスチャファイルの横が64なのに対して半分の32しか切り取っていません。
 下の図で赤い枠線がその「切り取る部分」です。HPに応じて切り取る部分を横に動かしていけばたしかにHPが減っていくように映すことができますね。"逆紙芝居"といったところでしょうか。
 考えたひとは頭いいと思いました。

最後に

 もっと自分なりにカスタマイズしたい場合は研究しましょう。HP最大からゼロにかけて緑から黄や橙を通じてだんだんと赤になっていく色の遷移方式ならばできませんが、HPが減って暗くなった部分を完全に黒く(無彩色に)することもできます。はたまた、枠をつけるとなるとより難しくなります。
 わたしから伝えられることは以上です。
constructed by: Rinca Hayamine