アドオンのできることの幅を大きく広げる、今では欠かせない存在となったアニメーションコントローラ。一時期バグで動かなくなったときはアドオン先進勢が凍りついてしまったほどです。そんなアニメーションコントローラ、略して「アニコン」(たぶんますえく発祥です)はどんなことができるのでしょうか。
簡単に答えを言うと、コマンドとイベントが動かせます。コマンドに関してはコマンドブロックなしでコマンドを内部で動かすことができるということです!サバイバルアドオン系統に有利ですね!
あとは、検知できる条件に便利なものばかりあるのが利点です。例えば、プレイヤーが攻撃またはアイテムやブロックを使ったのを検知できたり、メインハンドに持っているものが何であるかを検知できたり、バージョン1.16からは最大HPと現在のHPを検知できたり、その他インバイロメントセンサーで検知できるものはすべて検知できます。もちろん、ただコマンドを常時実行することもできます。ハンパないですね。
使い方の本題に入る前にひとつ、断っておきます。
「アニメーションコントローラ」というものはアドオンパックのなかに二つ存在します!!
一体どういうことかというと、そのままの意味です。二つあります。リソースにひとつ、ビヘイビアにひとつ存在します。ただし、この二つは名前こそ同じですが全く効能が異なります。だからこの記事のタイトルにカッコ書きでビヘイビア側のものであるといっています。
エンティティイベントというもののうちのひとつがアニメーションコントローラで、もう片方はアニメーションですが、今回はアニメーションコントローラだけの紹介となり、リソースのアニメーション・その他コントローラ系も今回は扱いません。それらのファンだった方には申し訳ございません。
■読み方
まず、jsonの構成例はこんな感じです。
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.test": {
"states": {
"default": {
"transitions": [
{ "mid": "(1.0)" }
]
},
"mid": {
"transitions": [
{ "default": "(1.0)" }
],
"on_entry": [
"/execute @s ~ ~ ~ setblock ~ ~-1 ~ bedrock"
]
}
}
}
}
}
これをプレイヤーに紐付けすると、プレイ中は常にプレイヤーの足元に岩盤が置かれるようになります。
わからないひとにとっては、ふーんという感じでしょうね。そんなひとにはまずこういう認識を覚えておいてください。
「アニコンはすごろく」です。
上の例で理論を解説していきます。jsonと何度も照らし合わせながら読んでください。
すごろくのスタートはdefaultのコマです。要するに、ここからプログラムの実行がはじまります。次にdefaultコマのなかにトランジション(分岐)があり、midへ行けという指示があります。(1.0)とは、無条件を指します。
midコマにいくと、on_entryというものがあります。on_entryは、そのコマに入ったときに動作するコマンド、イベントを動かします。ここにもトランジションがあり、defaultへ行けという指示があります。以降繰り返しとなります。
コマの喩(たと)えが理解できないというひとはJSONを勉強しましょう。
つぎは少し応用しつつ新しいことも学んでいきましょう。
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.test": {
"states": {
"default": {
"transitions": [
{ "state1": "query.variant == 1 && query.is_sneaking" },
{ "state2": "query.is_sneaking" }
]
},
"state1": {
"transitions": [
{ "default": "!query.is_sneaking" }
],
"on_entry": [
"/effect @s regeneration 99999 1 true"
],
"on_exit": [
"/effect @s clear"
]
},
"state2": {
"transitions": [
{ "state3": "variable.time = variable.time < 200 ? variable.time + 1:0;return variable.time == 0;" }
],
"on_entry": [
"@s event1"
]
},
"state3": {
"transitions": [
{ "default": "!query.is_sneaking" }
],
"on_exit": [
"@s event2"
]
}
}
}
}
}
どう構成が変わろうとスタートはdefaultです。はじめバリアント値は0としましょう。
トランジションを見ると、なにやら条件が書いてあります。上から「バリアント値が1かつスニークをしている」「スニークをしている」です。スニークをしないと何も起こりません。スニークをしたとしましょう。すると、バリアント値は1ではないので、上から順に見ていくと一つ目はスルー、二つ目に当てはまりますね。ということでstate2のコマへ移ります。
state2コマにはon_entryがあります。「@s event1」のように書くと、紐付けされているエンティティのイベント「event1」が実行されます。「@s」はイベントを起こすよという起句のようなものなのでコマンドのセレクタのようには扱えないので「@s」以外の「@a」や「@e」などという書き方はできません。
次のトランジションは何か長ったらしい条件がかかれています。molangを履修していないとサッパリなんですが、公式みたいなものだと思ってください。
「variable.time = variable.time < (整数) ? variable.time + 1:0;return variable.time == 0;」
これをトランジションに書くと(整数)tickだけ次のコマへいくときに遅延を発生させられます。上記の例の場合は200tickなので、10秒後にstate3へ自動で移動します。
state3にはon_entryではなくon_exitがあるので先にトランジションに目を通します。トランジションには、先程の「スニークをしている」という条件の語頭に「!」がついています。これはこの辺の業界ではよくある否定の記号ですね。これで「スニークをしていない」という条件を表します。ということで、忘れてしまったかと思いますが、まだスニークしたままで先に進まないので解除しましょう。これでdefaultに戻ります。
それと同時にon_exitが動くわけです。on_exitはon_entryとは反対に、コマから出たときに動作します。on_exitの中身は先ほど説明したイベントの動作ですね。
さて、次はバリアント値を1にした場合の動作を見ていきましょう。
バリアント値が1のときにスニークをすると、defaultのトランジションを上から見ていったときに、一つめから条件が合うのでstate1へ移ります。もしここで、state1の条件とstate2の条件を逆に書くと、上から順に条件を照らし合わせているのでバリアント値が1でもstate1に移ることができなくなります。厳しい条件を上から書いていきましょう。
state1にはon_entryとon_exit両方ありますが、いつだって見る順番は「on_entry→トランジション→on_exit」です。ここまでの解説で気づけていましたか?
ということで、スニークした瞬間エフェクトがかかり、スニークを解除した瞬間エフェクトが強制的に消されます。もうこの時点でdefaultに戻ってきましたね。
■書き方
全体的には上記のjsonなり何なりをテンプレートにして必要なものを書き足すなど編集すればいいと思います。以下、その編集の上で必要なことを書き並べていきます。
・一番上のコマはdefault
絶対ではないですが、より面倒になるくらいなら黙って従いましょう。
・トランジションは必ず書く
使えるクエリ、バリアブルはmolangのリファレンスにだいたい載っています
プレイヤーが攻撃またはアイテムやブロックを使ったのを検知、メインハンドに持っているものが何であるかを検知するのは載っていません。しかし、リソースのテンプレートのアニコンを探すと見つかります。もともとはリソースのアニコンの拡張概念なのでこういったことが可能です。
・「等しい」は「==」
・否定は「!」
・「かつ」は「&&」
・「または」は「||」
こういう比較演算子はmolangの話になるので詳しくは紹介しません。
■最後に
jsonは間違っていないのに動作しない場合は、条件分岐のさせかたが間違っています。トランジションで上からひとつずつ吟味したり、基本に戻りすごろくを思い浮かべてスローな世界でシミュレーションしたり……。地味に頭を使います。
アニコンですごいものを作るコツは特にありません。チェーンコマンドのような動作はできませんが、だいたいはコマンド要素です。条件はクエリやバリアブルだけでなく、インバイロメントセンサーで検知できるものも、エンティティ側で検知してバリアントを設定することによって条件にできます。
0コメント