とかさんのブログ

Minecraftについていろいろ投稿していきます。 主にBedrockEdition(BE, 旧Poket Edition, PE)のアドオン解説記事を投稿しています。アドオン製作最後の砦

Search feature で最適な場所を見つける【Minecraft】

設置条件があるフィーチャーは条件に合わない場所には当然設置されません。隣接している座標なら置けたなんて場合もそうです。そんな状況に対応するのがこのSearch featureです。

Search featureは条件に合う座標を探し出し、そこにフィーチャーを設置します。

使いこなせば地形によってピッタリ合う構造物を作ることができるかもしれません。

解説内の表記について

解説内で出てくる丸括弧はデータを表しています。つまり各々で変える部分。例は下記の通り

  • (String)"abcdef","Hello World"
  • (Integer)123456,1024
  • (Float)0.625,10000000000.0
  • (Value)0.625,10000000000.0
  • (Bool)true,false
  • (Object){"data": (Integer), ... , "data_256": (String)}
  • (Molang)"variable.size = math.sin((query.ground_speed/30)*360);"

(*****+)とは通常の(Integer),(Value)などの使い方に加え、設定した範囲内でランダムな値も使えるということです。{"min": (Integer),"max": (Integer)}のようにすると、ランダムな値を設定できます。

(List ****)はそれぞれの配列型を示します。例:["egg","chicken"]

(***/***)は複数の型に対応してます。

Search featureとは

Search featureは設置するフィーチャーの設置条件に合う座標(有効座標)を探し、有効座標にフィーチャーを設置します。

また、その際検索範囲や必要な設置個数等も変更することができます。

と、書いておきながらなんですが条件がないフィーチャーでも使用可能です。その場合は設定したどれかの上限まで設置を続けます。

複数のフィーチャーを制御するSequenceやWeightedとは違い、単一のフィーチャーに対して動作します。

ほかのフィーチャについては下のリンクを参照して下さい↓

Search feature のサンプル

あまり本来の使い方とは言えるかどうか微妙ですが....

範囲は基準点(このフィーチャーがトリガーされた点)からの相対座標になります。なのでこの場合は4x3x6の範囲になるわけですね。

フィーチャールールは各チャンク座標(x=0,z=0)の地表でトリガーするようにしています。

指定しているフィーチャーは設置条件として下面に草ブロックの条件が入っています。

ファイル構造はこんな感じ

  • feature_rules
    • toka7290:testfeaturerule.json
  • features
    • testfeature_control_search.json
    • testfeature_singleblock_3.json
  • manifest.json
  • pack_icon.png

実際に見てみるとこんな感じ↓

2020-11-12 (4)

画像の上がz軸の+方向、左がx軸の+方向です。草ブロックの上にしか設置されていません。

"required_successes"11なので塊がどれも11個になってます。11個置けないところは仕様ですべて置かないようになっているので。上の左から2番目は設置されていません。

下の右から2番目はSearch featureの挙動がよくわかる設置のされ方をしています。"search_axis""-x"なので、z軸を-方向に探して行きます。端まできたらy軸を+方向に上がってまたz軸を探し...を繰り返します。y軸の端まで来たらx軸を-方向に動いてまたz軸を...というのを繰り返していくわけですね。

コンポーネント解説

"format_version": (String)

このfeatureが作成されたバージョン。必須
"1.13.0"が最低バージョン

"description": (Object)

このfeatureの情報設定。現状はIDの設定のみ。

"identifier": (String)

このfeatureのID。必須
名前空間:IDの形式で書く。名前空間はアドオン(パック)の名前。
IDとファイル名は一緒でなければダメ。

"places_feature": (String)

設置するフィーチャーのIDを設定します。必須
名前空間:IDの形式で書く。

"search_volume": (Object)

検索範囲を設定します。必須
範囲の最小座標と最大座標のを設定して直方体の範囲を定義します。(バウンディングボックス)
範囲はトリガーされた位置からの相対座標になります。
サンプルコードの場合、範囲を視覚化すると画像のようになります。青い場所が最小座標(手前)と最大座標(奥)。赤枠が入力(トリガー)位置
2020-11-12 (5)
パラメータは以下のとおり

"min": (List Integer)

最小座標を設定します。必須
座標の値は順にx,y,zを示す。
各座標の値は"max"の各座標の値より小さく無ければなりません(ワールドが開けなくなります)

"max": (List Integer)

最大座標を設定します。必須
座標の値は順にx,y,zを示す。
各座標の値は"min"の各座標の値より大きく無ければなりません(ワールドが開けなくなります)

"search_axis": (String)

検索1ステップを進める座標軸の順番を設定します。必須
使える値とその挙動は以下のとおり。軸の前についている+-は軸に対して進む方向を表しています。
search_axisの値
評価順
+x +z→+y→+x
-x -z→+y→-x
+y +x→+z→+y
-y -x→+z→-y
+z -x→+y→+z
-z +x→+y→-z
-xのステップを視覚化する以下のようになる。(サンプルと同じ)
search_axis

"required_successes": (Integer)

有効設置数を設定します。
条件に合う座標(有効座標)をいくつ見つけるか設定します。設定した数有効座標を見つけるとその全てに対して、フィーチャーを設置します。もし、設定した数より有効座標が少ない場合は設置を行いません。(有効座標があったとしても)
デフォルトは1

Single blockとAggregateを組み合わせればブロックの検査と条件分岐ができるので地味に使えるやつです。

空間があるかブロックが検査できるってありがたいですよね。

それではまた~

質問や修正箇所がありましたらTwitterまでお願いします。

img
コメント一覧を開く
コメントフォーム
記事の評価
  • リセット
  • リセット

質問はdiscordの利用を推奨します。