課題
FMBEにおいて、playanimationコマンドで記述したmolangをコマンド実行直後の1tickのみ実行したい。
解決策
molangの文末にreturn 1;を記述する。
詳細な解説
はじめに
執筆時点での環境はMinecraftBE 1.21.101です。FMBEは今後のアップデートで利用できなくなる可能性のある技術ですので、ご注意ください。また、この記事は備忘録を兼ねており、一部厳密でない説明が含まれる場合があります。
/playanimationコマンドとアニメーションの仕組み
まず、/playanimationコマンドの基本と、その動作に必要なアニメーションの仕組みについて説明します。
/playanimationコマンドの構文
このコマンドは、entityに特定のアニメーションを再生させるためのものです。
/playanimation <entity: target> <animation: string> [next_state: string] [blend_out_time: float] [stop_expression: string] [controller: string]
特に重要なのが以下の引数です。
-
stop_expression: アニメーションを停止し、次のstateへ移るための遷移条件をMolangで記述します -
next_state:stop_expressionが満たされたときに遷移する先のstateです -
controller: このアニメーションを管理するanimation_controllerを指定します
これらの引数を正しく理解するために、Minecraftのアニメーションがどのような要素で構成されているかを知る必要があります。
前提知識:アニメーションを構成する3要素
Minecraftのアニメーションは、主に以下の3つの要素の関係性によって制御されています。
-
animation_controller
- アニメーション全体を管理する親のような存在です。1つのentityは複数の
animation_controllerを持つことができます
- アニメーション全体を管理する親のような存在です。1つのentityは複数の
-
state(状態)
- 「歩いている状態」「攻撃している状態」など、entityの特定の状態を指します。どの
stateにいるかによって、再生されるアニメーションが決まります
- 「歩いている状態」「攻撃している状態」など、entityの特定の状態を指します。どの
-
transition(遷移)
- ある
stateから別のstateへ移るための「きっかけ」です -
transitionは「遷移条件」と「遷移先state」のセットで定義されます - 最も重要な点は、Minecraftのシステムが毎tick、現在のstateが持つ
transitionの遷移条件を常にチェックしていることです。条件を満たすものが見つかると、対応する「遷移先state」へ移動します
- ある
return 1;がMolangを1tickで停止させる仕組み
/playanimationコマンドを実行すると、stop_expressionを遷移条件とする特殊なtransitionが一時的に追加された状態になります。
return 1; がない場合
stop_expressionにreturn 1;のような明確な返り値がない場合、遷移条件は満たされない(false)と判定されます。
- 1tick目: 遷移条件が評価されますが、
falseなのでstateは遷移しません。しかし、この評価の一部としてMolangが実行されます - 2tick目: entityはまだ元のstateに留まっているため、システムは再び同じ遷移条件を評価します。これにより、Molangがもう一度実行されてしまいます
- 3tick目以降: stateが遷移しない限り、これが繰り返されます
return 1; がある場合
Molangでは、1はtrue(真)を意味します。return 1;を記述すると、遷移条件が即座に満たされたと判定されます。
-
1tick目: 遷移条件が評価され、
return 1;によりtrueと判定されます。これにより、next_stateで指定したstateへの遷移が即座に発生します。この過程でMolangが1回実行されます -
2tick目: entityは既に別のstateに移動済みです。そのため、前回の
stop_expressionは評価対象から外れ、Molangが再度実行されることはありません
