/function - 関数ファイルを使用する

/function - 関数ファイルを使用する

アドオン内の関数 (function)ファイルを使用するコマンドです。

コマンドを関数ファイルに記述することで、複数行のコマンドをまとめて使用できます。

サンプルファイルのダウンロード

関数ファイルはアドオンの中のビヘイビアーパックの中に記述します。

本来であれば、このビヘイビアーパックの作り方から学ばなければいけませんが、今回は作成済みのビヘイビアーパックをダウンロードして、使い方を学びましょう。

以下の解説を元に作成したファイルを用意してあります。 次のリンクからダウンロードして、まずはこれを使うところから初めてください。

1. ダウンロード

リンク先の「Web IDE」と「クローン」の間にあるダウンロードボタンから、zipファイルでダウンロードしてください。

gl.png

example-mcfunction-master.zipという名前でダウンロードされます。

2. 展開してアドオンフォルダーに入れる

zipファイルをダブルクリックすると、zipファイルの中に入ります。

その中にも同じ名前のフォルダがあるので、こちらの方をクリップボードにコピーします。

コピーしたら、次のフォルダーに貼り付けてください。

C:\Users\[ユーザー名]\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\

フォルダーごとに分けると次のようになります。

  1. C:
  2. Users
  3. ユーザー名 人によって異なるので、自分のユーザー名のフォルダーを選んでください。
  4. AppData これは「隠しファイル」になっています。フォルダーウィンドウの表示タブに、隠しファイルの表示設定があるので有効にしてください。
  5. Local
  6. Packages
  7. Microsoft.MinecraftUWP_8wekyb3d8bbwe
  8. LocalState
  9. games
  10. com.mojang このフォルダーはよく使うので、ショートカットやクイックアクセスに登録しておくのがおすすめです。
  11. development_behavior_packs 「behavior_packs」の方ではないので注意してください。

12番目のフォルダとして、コピーしたexample-mcfunction-masterを貼り付けてください。

3. 新しいワールドを作りアドオンを適用する

ワールド作成時の設定で「チートの実行」を有効にしてください。 ゲームモードをクリエイティブにするだけでも構いません。

次に、左メニューの「ビヘイビアーパック」から「Example mcfunction」を有効にします。

bp.jpg

4. 関数ファイルを実行

ワールドに入ったら、次のコマンドを入力してください。

/function art/paint_creeper

地面にクリーパーの顔が描かれれば正しく適用されています。

ビヘイビアーパックの作り方

関数ファイルはアドオンのビヘイビアーパックに作成するので、先にビヘイビアーパックを作成する必要があります。

manifest.jsonの設定

/functioonを使うには"type": "data"のモジュール設定が必要です。 次のようにしてモジュールを追加しましょう。

{
  "format_version": 2,
  "header": {
    "description": "アドオンの説明",
    "name": "アドオンの名前",
    "uuid": "931b6ed0-a0fe-4cbe-acd8-054ac006ce7c",
    "version": [0, 0, 1],
    "min_engine_version": [ 1, 16, 200 ]
  },
  "modules": [
    // functionを使うにはこのモジュールが必要
    {
      "description": "モジュールの説明",
      // typeはdataにする
      "type": "data",
      // 独自のUUIDを設定する
      "uuid": "b023fb78-dd01-4f82-8481-66c3485f8de5",
      "version": [0, 0, 1]
    }
    // ここまで
  ]
}

関数ファイルの位置

[ビヘイビアパック名]/functions/[名前空間フォルダ]/[任意のフォルダ名]/[ファイル名].mcfunction

manifest.jsonと同じ位置にfunctionsフォルダーを作成し、さらにその中にもう1つ名前空間フォルダーを作成します。このフォルダーの下に関数ファイル(.mcfunction)を作成していきます。その間のフォルダーは自由に追加しても構いません。

例えばmygameという名前空間にし、gameフォルダーの中にstart.mcfunctionというファイルを作った場合。 [ビヘイビアパック名]/functions/mygame/game/start.mcfunctionというファイル構造になります。

ファイル位置とコマンドの関係

ファイルの位置がそのままコマンドの記入方法になります。コマンド実行時には拡張子の.mcfunctionを入力する必要はありません。

# 途中のフォルダ無し
# [behavior_pack]/functions/namespace/filename.mcfunction
/function namespace/filename

# フォルダがある場合
# [behavior_pack]/functions/namespace/folder/filename.mcfunction
/function namespace/folder/filename

# 複数のフォルダがある場合
# [behavior_pack]/functions/a/b/c/d/e/f.mcfunction
/function a/b/c/d/e/f

ファイルにコマンドを書く

次に関数ファイルにコマンドを書いていきましょう。例としてクリーパーを描くコマンドを作ってみます。今回の名前空間はartとしておきます。

クリーパー (creeper)描く (paint)ので関数名はpaint_creeperにします。拡張子の.mcfunctionをつけて作成してください。ファイル名がそのまま関数名になるのでわかりやすい名前を付けましょう。理想的な名前の付け方はありますが、無理に英語を使わずにローマ字書きの日本語から始めてみてください。

# 自分の位置を基準にクリーパーの顔を描く

# 描く部分の上を取り除く
fill ~ ~ ~ ~7 ~5 ~7 air

# 全体を緑で塗る 羊毛は13番が緑
fill ~0 ~-1 ~0 ~7 ~-1 ~7 wool 13

# 目を黒で塗る 羊毛は15番が黒
fill ~1 ~-1 ~2 ~2 ~-1 ~3 wool 15
fill ~5 ~-1 ~2 ~6 ~-1 ~3 wool 15

# 口を黒で塗る
fill ~2 ~-1 ~5 ~2 ~-1 ~7 wool 15
fill ~5 ~-1 ~5 ~5 ~-1 ~7 wool 15
fill ~3 ~-1 ~4 ~4 ~-1 ~6 wool 15

最終的なファイル構成とコマンドは次の形になります。

[ビヘイビアパック名]/functions/art/paint_creeper.mcfunction

/function art/paint_creeper

これで、複数行のコマンドを一度で実行できました。

あとは同じようにして、自由に関数ファイルを追加していってください。

編集後の再読み込み

ワールドを開いたままでは、ファイルを更新しても変更点はワールドに適用されません。適用するには専用のコマンドを使用して再読み込み (reload)する必要があります。

ただし更新されるのは読み込み済みのファイルのみです。新しくファイルを追加した場合はワールド自体を読み込み直してください。

/reload

関数ファイルの利点

最後にコマンドを関数ファイルにする利点をまとめておきます。

複数のコマンドをまとめられる

関数ファイルにはコマンドを複数行書くことができるので、一度のコマンドで複数のコマンドを実行できます。これにより管理するコマンドブロックの個数を大きく減らすことができます。また複数行をまとめて管理するため編集が容易になります。

コメントが書ける

コメントを書くことで、それらのコマンドがどのような意図を持っているのかを、言葉で残しておくことができます。

作っているときは覚えていても、何ヶ月後かに見直した際には、自分でもなぜそのような書き方にしたのか忘れてしまうことはよくあります。

積極的にコメントを残すようにしましょう。 初心者の内は全行にコメントをつけるくらいで構いません。

再利用しやすい

ワールド内のコマンドブロックから既存のコマンドを取り出すのは困難ですが、関数ファイルにすることで別のワールドにも容易に使いまわすことができます。よく使うパターンはうまくまとめて再利用しましょう。同じ処理を何度も書く必要はありません。

ファイル・コードで管理できる

バックアップが取りやすく、特にGitなどのバージョン管理システムを使って更新できます。これにより、前の状態を残したり戻ったりしやすくなります。いつでも戻れるということは色々と試しやすくなるということです。

高機能エディターの支援が受けられる

ファイル内検索やプロジェクト検索、それらによる一括置き換えなど書き切れないほどの機能がエディターにはあります。これらを使いこなせれば開発速度は何倍にもなるでしょう。

応用的な使い方

以下で応用的な使い方を紹介していきます。かなりコマンドに慣れてきている人向けになります。

例としてゲーム開始の際に行うコマンドを作りながら解説していきます。

まず、「ゲームの開始」機能なのでgameフォルダーを作り、そのフォルダーの中にstart.mcfunctionを作成します。

対象はプレイヤー全員にしたいので@aにしましょう。

# mygame/game/start.mcfunction

# プレイヤーの状態を初期化する
# すべての状態異常を消す
effect @a clear
# HPを回復する
effect @a instant_health 1 255 true
# 満腹度を回復する
effect @a saturation 1 255 true
# すべての持ち物を消す
clear @a

# 初期装備を与える
# 木の剣を持たせる
give @a wooden_sword
# 食べ物を与える
give @a bread 3

# ゲームモードをサバイバルにする
gamemode @a survival
# ゲーム開始地点に移動
spreadplayers 0 0 5 20 @a

結構長くなりました、これらをコマンドブロックで実行しようとすると管理が大変そうです。

しかし関数ファイルなら、以上のコマンドを次の1行で実行できるようになります。これが/functionの利点でした。

/function mygame/game/start

/executeを用いた対象の操作

さて、上の例の場合では@aなので全員が対象です。 これとは別にゲームへの復活用などとして、対象者を限定して実行したい場合はどうすれば良いでしょうか。

ファイルをコピーして対象だけを変えるのも1つの手ですが、内容を修正したくなった場合には、修正箇所も2箇所3箇所と増えていってしまいます。 こうなると修正漏れが出やすくなり、バグが発生しやすくなってしまうので、これは良い方法ではありません。

このような場合には対象者の管理を/executeに任せましょう。 /executeはコマンドの実行者自身ではなく、対象者が使ったことにするコマンドでした。 これを用いることで対象者を変更できます。

まずmygame/game/start.mcfunction@aをすべて@sに変更します。

# mygame/game/start.mcfunction
# ゲームを開始する

# プレイヤーの状態を初期化する
# すべての状態異常を消す
effect @s clear
# HPを回復する
effect @s instant_health 1 255 true
# 満腹度を回復する
effect @s saturation 1 255 true
# すべての持ち物を消す
clear @s

# 初期装備を与える
# 木の剣を持たせる
give @s wooden_sword
# 食べ物を与える
give @s bread 3

# ゲームモードをサバイバルにする
gamemode @s survival
# ゲーム開始地点に移動
spreadplayers 0 0 5 20 @s

この状態で/executeを使い、対象を変えて実行してみましょう。 そうすることで/executeにより選ばれたそれぞれの対象が、自分自身@sとして実行する形になります。

# 使った人自身
/exectute @s ~~~ function mygame/game/start
# 上はこれと同じ
/function mygame/game/start
# 全員に適用
/exectute @a ~~~ function mygame/game/start
# ランダムな一人に適用
/exectute @r ~~~ function mygame/game/start
# 復活する一人に適用
/exectute @p[tag=revive] ~~~ function mygame/game/start
# ゲームに参加しているプレイヤーだけに適用
/exectute @a[tag=entry] ~~~ function mygame/game/start

この様にすることで対象範囲を変えて実行でき、何より1つのファイルでコマンドを管理できるようになります。 ファイルが1つになると修正箇所も1箇所になるので修正漏れが起きることはありません。

もちろんすべて@sにしなければならないということはありません。 こうした使い方の方が便利なパターンもあるということです。

共通部分をまとめる

次にゲーム終了時のことを考えてみましょう。

次の例は単純にプレイヤーの状態を戻してロビーに帰るだけの簡単な仕組みです。 これも@sで作成しておけば、対象の使い分けができて便利そうです。

「ゲームの終了」なのでgame/exit.mcfunctionでファイルを作成します。

# mygame/game/exit.mcfunction
# ゲームを終了する

# プレイヤーの状態を初期化する
# すべての状態異常を消す
effect @s clear
# HPを回復する
effect @s instant_health 1 255 true
# 満腹度を回復する
effect @s saturation 1 255 true
# すべての持ち物を消す
clear @s
# ゲームモードをアドベンチャーにする
gamemode adventure @s

# ロビーに移動させる
tp @s 200 64 200

この場合は「プレイヤーの初期化」の部分がgame/startと同じなので、これらを共通化しましょう。 同じ箇所は1箇所にまとめるのが基本です。

「プレイヤーの初期化」なので名前はplayer/initialize.mcfunctionにして、該当部分の処理を移動させます。

# mygame/player/initialize.mcfunction
# プレイヤーの状態を初期化する

# すべての状態異常を消す
effect @s clear
# HPを回復する
effect @s instant_health 1 255 true
# 満腹度を回復する
effect @s saturation 1 255 true
# すべての持ち物を消す
clear @s
# ゲームモードをアドベンチャーにする
gamemode adventure @s

あとは、それぞれの関数ファイル内でさらに/functionを使い、このファイルを実行してあげれば良いだけです。

# mygame/game/start.mcfunction
# ゲームを開始する

# プレイヤーの状態を初期化する
function mygame/player/initialize

# 初期装備を与える
# 木の剣を持たせる
give @s wooden_sword
# 食べ物を与える
give @s bread 3

# ゲーム開始地点に移動
spreadplayers 0 0 5 20 @s
# mygame/game/exit.mcfunction
# ゲームを終了する

# プレイヤーの状態を初期化する
function mygame/player/initialize

# ロビーに移動させる
spreadplayers 200 200 1 5 @s

共通化したのでかなりスッキリとしました。 初期化の部分が関数ファイルとしてまとまることで、その部分で何をやっているかわかりやすくなるという利点もあります。

コメントで「初期化する」とあっても、長々とコマンドが続いていると一瞬ではわかりません。 しかし初期化と名前の付いた関数ファイルを実行していれば、初期化部分のまとまりがはっきりして理解が早くなります。 また、他の箇所で出てきた時にも同じ操作をしていることが明確になります。 上の例でも共通化した部分で同じ操作をしていることがすぐにわかりますね。

次のページへ
アドオン