LoginSignup
4
2

More than 1 year has passed since last update.

【Minecraft BE Addon講座#13】3発動の設定とアニメーションの活用

Last updated at Posted at 2021-09-21

本ページはアドオン講座#13、「アニコン編、3発動の設定とアニメーションの活用」です。
目次や、この講座については#1の記事をご覧ください。

アニコン編で理解してほしいこと!

マイクラBEのゲーム、企画制作に必須ともいえるアニメーションコントローラー。ここではアニコンとは何なのかから、アニコンを活用したコマンドブロックにないコマンド実行条件の設定まで、何かしらのゲームを作れるレベルへの到達を目標に解説していきます。

  • (前提#3~#4)基礎編
  • (前提#5)コンポネ編、entity.jsonの書き方
  • (前提#8)ファンクション編復習、コマンドの実行主の理解
  • (#11)アニコンとは?
  • (#11)アニコンの追加方法
  • (#11)アニコンの常時実行
  • (#12)状態(state)とは?
  • (#12)状態の切り替え(トランジション)方法
  • (#12)条件の設定とMoLang
  • (#12)[実践]空中ジャンプを作ってみよう
  • (#13)3発動、on_entryとon_exitとアニメーション

3発動って何???????

先に断っておきますが、今思いついた言葉なので、正式な用語ではありません。(笑)

アニコンでは発動タイミング、方法が実は3種類存在するため、その3種類のことを3発動と勝手に呼んでいます。

一つ目は前回#12で使用した、"on_entry"です。

"on_entry"「その状態になったときに1度だけ実行」です。

二つ目は"animations"で、これは「その状態である間、常時実行」です。

三つ目は"on_exit"で、これは「その状態から離れるときに1度だけ実行」です。

流れとしては、その状態(state)になってから、別の状態にトランジションするまで、
"on_entry""animations""animations"→......→"animations""on_exit"
というイメージでしょうか。

"on_entry""on_exit"は単純で、前回#12でもやったように、カッコの中にスラッシュコマンドなり、イベントなりを書くだけです。
前回#12で作ったファイルに少し書き足してみました。

behavior/animation_controllers/system.animation_controllers.json
{
    "format_version" : "1.10.0",
    "animation_controllers" : {
        "controller.animation.system" : {
            "initial_state" : "default",
            "states" : {
                "default" : {
                    "transitions" : [
                        { "jump" : "(query.get_equipped_item_name == 'apple') && (query.is_using_item)"}
                    ]
                },
                "jump" : {
                    "on_entry": [
                        "/effect @s levitation 1 38 true",
                        "@s minecraft:entity_event"
                     ],
                    "on_exit": [
                        "/say state_end",
                        "@s minecraft:entity_event"
                     ],
                    "transitions" : [
                        { "default" : "!query.is_using_item" }
                    ]
                }
            }
        }
    }
}

しかし、"animations"だけちょっと使い方が異なります。

アニメーションの活用

元々アニコンはアニメーションをコントロールするものですから、そりゃアニメーションは使えるでしょうけど、使ってどうするのと思うかもしれません。
実はビヘイビアなら、アニメーションでもスラッシュコマンドやイベントを実行できるのです!
これを利用して、その状態のときの常時実行として使おう!ということです。

しかし少し面倒なのが、直接アニコンに書き込むことはできず、

  • ①アニメーションをビヘイビアのentity.jsonに登録
  • ②アニメーション用のフォルダ、ファイルの作成
  • ③アニコンにアニメーション名を記載

と複数のステップを踏まなければなりません。

とはいえ、やること自体はアニコンを追加したときと、さほど変わらないので、ささっと解説していきます。

まずはentity.jsonへの登録から。
今回はanimation.jump_repeatという名前で作っていきます。

behavior/entities/player.json
{
  "format_version": "1.13.0",
  "minecraft:entity": {
    "description": {
      "identifier": "minecraft:player",
      "is_spawnable": false,
      "is_summonable": false,
      "is_experimental": false,
      "animations": {
        "system": "controller.animation.system",
        "jump_repeat": "animation.jump_repeat"
      },
      "scripts": {
        "animate": [
          "system"
        ]
      }
    },

    "component_groups": {
      ...

※「...」は略

<注意> アニコンのときは「登録」と「常時実行」の両方を行いましたが、アニコンで切り替えをしたいアニメーションの場合、「登録」のみを行うので、"scripts"/"animate"の中には書きません。 アニコンとentity.jsonの"animate"の両方に書いてしまうと二重に実行されてしまうので注意が必要です(昔これに気付くのに1か月くらいかかった)。 entity.jsonの"animate"のみに書くと、アニコンに関係なく常時実行できます。

次はフォルダ、ファイル作成です。
behaviorフォルダの直下(#3でアドオンの構造を説明したときと同じ位置)に新規フォルダでanimationsを作成します。
その中にファイルjump_repeat.animation.jsonを作成します。
作成方法はリソースのアニメーションのコピー→名前変更でもいいし、テキストドキュメントの作成→拡張子の変更でもいいです。

アニコンの作成のときは、リソースに書いてある内容を参考に解説しましたが、アニメーションの場合、今回の用途で必要になる"timeline"が、さらっと見た感じ見当たらないので、最初から自分で作っていきます。

behavior/animations/jump_repeat.animation.json
{
  "format_version": "1.8.0",
  "animations": {
    "animation.jump_repeat": {
      "animation_length": 0.05,
      "loop": true,
      "timeline": {
        "0.0": [
          "/say jumping now!",
          "@s minecraft:entity_event"
        ]
      }
    }
  }
}

こんな感じです。
1行ずつ解説していくと

2行目、いつもの"format_version"
3行目、この中にアニメーションを入れますよのカッコ始まり
4行目、アニメーションの名前
5行目、このアニメーションの(時間的な意味の)長さ(単位は秒)
6行目、このアニメーションを繰り返すか
7行目~、タイムライン("timeline")です。
8行目に"0.0"とあるのは、アニメーション全体の長さが0.05秒であるうちの0.0秒目にカッコ内を実行するという意味です。

これが繰り返される("loop": true)ので、0.05秒おきに"0.0"のカッコ内が実行されるというアニメーションになります。

<追加情報> マイクラ内ではtickという時間単位がよく使われます。20tick=1秒になります。ここではマイクラ内のtickにそろえるため、0.05秒(=1/20秒)に1度実行されるようにしています。

最後にアニコンの実行したい状態(state)のところにアニメーションの名前を書いて終了です。

behavior/animation_controllers/system.animation_controllers.json
{
    "format_version" : "1.10.0",
    "animation_controllers" : {
        "controller.animation.system" : {
            "initial_state" : "default",
            "states" : {
                "default" : {
                    "transitions" : [
                        { "jump" : "(query.get_equipped_item_name == 'apple') && (query.is_using_item)"}
                    ]
                },
                "jump" : {
                    "animations" : [ "jump_repeat" ],
                    "on_entry": [
                        "/effect @s levitation 1 38 true",
                        "@s minecraft:entity_event"
                     ],
                    "on_exit": [
                        "/say state_end",
                        "@s minecraft:entity_event"
                     ],
                    "transitions" : [
                        { "default" : "!query.is_using_item" }
                    ]
                }
            }
        }
    }
}

おそらく、"on_entry""on_exit"と同様に、カンマ(,)で区切ればアニメーションも複数追加できると思います。

これで3発動すべての解説が終わりました!

アニコン編終了!

今回#13でアニコン編が終了になります!
使用頻度が高く、かつ難易度が高いアニコンでしたが、いかがだったでしょうか。
アニコンを身に付ければ、間違いなくシステムのできることの幅が何倍にも広がるので、ぜひ何回も見返しながら身に付けてみてください!

このアニコン編では、

をメインに解説しました。
また、この講座で使われなかった条件に興味がある場合は、

から探してみてください。
また、検索すれば先人たちが残した質問や記事もいくつか出てくるので、それを参考にするのもよいと思います。

最後まで読んでくれたみなさんが、作りたいものが作れますように!
お疲れ様でした!!

↓目次#1へ↓

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2