/function - 関数ファイルを使用する
アドオン内の関数 ファイルを使用するコマンドです。
コマンドを関数ファイルに記述することで、複数行のコマンドをまとめて使用できます。
サンプルファイルのダウンロード
関数ファイルはアドオンの中のビヘイビアーパックの中に記述します。本来であれば、このビヘイビアーパックの作り方から学ばなければいけませんが、今回は作成済みのビヘイビアーパックをダウンロードして、使い方を学びましょう。
以下の解説を元に作成したファイルを用意してあります。 次のリンクからダウンロードして、まずはこれを使うところから初めてください。
1. ダウンロード
リンク先の「Web IDE」と「クローン」の間にあるダウンロードボタンから、zipファイルでダウンロードしてください。
example-mcfunction-master.zip
という名前でダウンロードされます。
2. 展開してアドオンフォルダーに入れる
zipファイルをダブルクリックすると、zipファイルの中に入ります。
その中にも同じ名前のフォルダがあるので、こちらの方をクリップボードにコピーします。
コピーしたら、次のフォルダーに貼り付けてください。
C:\Users\[ユーザー名]\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\
フォルダーごとに分けると次のようになります。
C:
Users
ユーザー名
人によって異なるので、自分のユーザー名のフォルダーを選んでください。AppData
これは「隠しファイル」になっています。フォルダーウィンドウの表示タブに、隠しファイルの表示設定があるので有効にしてください。Local
Packages
Microsoft.MinecraftUWP_8wekyb3d8bbwe
LocalState
games
com.mojang
このフォルダーはよく使うので、ショートカットやクイックアクセスに登録しておくのがおすすめです。development_behavior_packs
「behavior_packs」の方ではないので注意してください。
12番目のフォルダとして、コピーしたexample-mcfunction-master
を貼り付けてください。
3. 新しいワールドを作りアドオンを適用する
ワールド作成時の設定で「チートの実行」を有効にしてください。 ゲームモードをクリエイティブにするだけでも構いません。
次に、左メニューの「ビヘイビアーパック」から「Example mcfunction」を有効にします。
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
としておきます。
クリーパー を描く ので関数名は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
関数ファイルの利点
最後にコマンドを関数ファイルにする利点をまとめておきます。
複数のコマンドをまとめられる
関数ファイルにはコマンドを複数行書くことができるので、一度のコマンドで複数のコマンドを実行できます。これにより管理するコマンドブロックの個数を大きく減らすことができます。また複数行をまとめて管理するため編集が容易になります。
コメントが書ける
コメントを書くことで、それらのコマンドがどのような意図を持っているのかを、言葉で残しておくことができます。
作っているときは覚えていても、何ヶ月後かに見直した際には、自分でもなぜそのような書き方にしたのか忘れてしまうことはよくあります。
積極的にコメントを残すようにしましょう。 初心者の内は全行にコメントをつけるくらいで構いません。
再利用しやすい
ワールド内のコマンドブロックから既存のコマンドを取り出すのは困難ですが、関数ファイルにすることで別のワールドにも容易に使いまわすことができます。よく使うパターンはうまくまとめて再利用しましょう。同じ処理を何度も書く必要はありません。
ファイル・コードで管理できる
バックアップが取りやすく、特に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
共通化したのでかなりスッキリとしました。 初期化の部分が関数ファイルとしてまとまることで、その部分で何をやっているかわかりやすくなるという利点もあります。
コメントで「初期化する」とあっても、長々とコマンドが続いていると一瞬ではわかりません。 しかし初期化と名前の付いた関数ファイルを実行していれば、初期化部分のまとまりがはっきりして理解が早くなります。 また、他の箇所で出てきた時にも同じ操作をしていることが明確になります。 上の例でも共通化した部分で同じ操作をしていることがすぐにわかりますね。