ターゲットセレクター引数を使いこなそう

対応バージョン:Java Edition 1.21.11

この記事では、MinecraftのコマンドやDatapackで必ず登場するターゲットセレクターの引数を学びます。@a[distance=..5] のように [...] を付けることで、「近くのプレイヤーだけ」「特定の名前のプレイヤーだけ」「サバイバルモードの人だけ」と対象を細かく絞り込めるようになります。実際にコマンドを打って動作を確かめながら進めましょう。

目次

前提知識

この記事では以下の知識を前提にしています。

  • チートを有効にしたワールドに入れること
  • チャット欄(T キー)にコマンドを入力した経験があること
  • Datapackの基本的なフォルダ構成を知っていること(Datapackの基本的なフォルダ構成

ターゲットセレクターとは?

Minecraftのコマンドは「誰に・何に対して実行するか」を必ず指定する必要があります。その「対象を指定するための記号」がターゲットセレクターです。

たとえば以下のコマンドでは、@a の部分がターゲットセレクターです。

effect give @a speed 10 1

@a は「ワールド内の全プレイヤー」を意味するので、このコマンドは「全プレイヤーにスピードIを10秒付与する」という処理になります。effect give という命令だけでは「誰に?」が決まらないため、ターゲットセレクターは省略できません。

Datapackの .mcfunction ファイルに書くコマンドでも、チャット欄と全く同じようにターゲットセレクターを使います。まずはどんな種類があるかを確認しましょう。

基本セレクターを確認しよう

引数を付ける前に、ベースとなる基本セレクターを整理しておきましょう。それぞれが「誰を・何を対象にするか」の出発点になります。

セレクター対象複数ヒットよく使う場面
@aワールド内の全プレイヤーあり全員にエフェクト・メッセージを送る
@eワールド内の全エンティティ(プレイヤー含む)ありモブをまとめて操作する
@p実行位置に最も近いプレイヤー1人なしコマンドブロックで1人だけ対象にする
@sコマンドを実行しているエンティティ自身なしDatapackの .mcfunction 内で「自分自身」を指す
@rワールド内のランダムなプレイヤー1人なしくじ引きや抽選の演出
@n実行位置に最も近いエンティティ1体(1.21.2以降)なし近くのモブ1体を対象にする

@a@e は複数のエンティティを同時に対象にできるため、引数による絞り込みが特に重要です。@s はDatapackの .mcfunction 内で頻繁に使います。execute as @e[type=zombie] run ... のように別エンティティとして実行するとき、その対象エンティティ自身を @s で参照できるからです。

ターゲットセレクター引数とは?

基本セレクターに [引数名=値] を続けて書くことで、対象をさらに絞り込めます。複数の引数はカンマ区切りで並べることができ、すべての条件を同時に満たすエンティティだけが対象になります(AND条件)。

@a                                   # 全プレイヤーが対象
@a[distance=..5]                     # 5ブロック以内のプレイヤーに絞る
@a[distance=..5,gamemode=survival]   # さらにサバイバルモードのみに絞る

引数の書き方に迷ったときは、チャット欄で @a[ まで入力するとオートコンプリートが表示されます。使える引数の一覧が確認できるので活用しましょう。

チャット欄に @a[ と入力したときのオートコンプリートが表示されている様子

それでは引数を1つずつ見ていきましょう。

ステップ1:距離で絞り込む(distance)

distance は、コマンドの実行座標からの距離(ブロック数)で対象を絞り込む引数です。範囲の書き方は以下の3パターンあります。

書き方意味
distance=..55ブロック以内(上限のみ指定)
distance=3..3ブロック以上(下限のみ指定)
distance=3..83ブロック以上8ブロック以内(範囲指定)
# 実行位置から5ブロック以内のプレイヤーにスピードエフェクトを付与
effect give @a[distance=..5] speed 10 1

distance がない @a だとワールド内の全員が対象になります。Datapackで「近くにいるプレイヤーだけ処理したい」ときに必ず使う引数です。

実際に入力して確認しよう

  1. チャット欄を開き、以下を入力して Enter
effect give @a[distance=..5] speed 10 1
  1. 自分の近く(5ブロック以内)にスピードエフェクトのパーティクルが出れば成功
  2. distance=5..に変更してから再度実行し、今度はエフェクトがかからないことを確認する
distance=..5 で近くのプレイヤーだけにエフェクトがかかり、離れるとかからなくなる様子

ステップ2:名前で絞り込む(name)

name は、エンティティの表示名(プレイヤー名やカスタム名)で対象を絞り込む引数です。特定のプレイヤーだけを対象にしたいときに使います。

# プレイヤー名が「Steve」の人だけにエフェクトを付与
effect give @a[name=Steve] speed 10 1

# 名前が「Steve」以外の全プレイヤーを対象(!で否定)
effect give @a[name=!Steve] speed 10 1

引数の値の前に ! を付けると「〜以外」という否定条件になります。name だけでなく taggamemode など多くの引数で同様に使えます。

実際に入力して確認しよう

  1. 自分のプレイヤー名を確認する(TABキーのプレイヤーリストなどで確認)
  2. 自分の名前を入れて実行し、自分だけにエフェクトがかかることを確認する
effect give @a[name=自分のプレイヤー名] speed 10 1
  1. 否定形でも試してみる
effect give @a[name=!自分のプレイヤー名] speed 10 1
  1. 自分にはかからず、他のプレイヤーにはかかることを確認する(シングルプレイの場合は対象0人で何も起きないことを確認)
name= で特定プレイヤーだけを対象にしているスクリーンショット

ステップ3:ゲームモードで絞り込む(gamemode)

gamemode は、プレイヤーのゲームモードで対象を絞り込む引数です。@a と組み合わせて「サバイバルのプレイヤーだけ」「クリエイティブ以外のプレイヤー」といった条件が作れます。

対象ゲームモード
gamemode=survivalサバイバル
gamemode=creativeクリエイティブ
gamemode=adventureアドベンチャー
gamemode=spectatorスペクテイター
gamemode=!creativeクリエイティブ以外すべて
# サバイバルモードのプレイヤーにだけ発光エフェクトを付与
effect give @a[gamemode=survival] glowing 5 0 true

Datapackでゲームの処理を作るとき、クリエイティブの管理者プレイヤーをゲームの効果から除外したい場面が多くあります。そういったときに gamemode=!creative が役立ちます。

実際に入力して確認しよう

  1. サバイバルモードで以下を実行し、エフェクトがかかることを確認する
effect give @a[gamemode=survival] glowing 5 0 true
  1. クリエイティブモードに切り替えてから再度実行し、エフェクトがかからないことを確認する
/gamemode creative
サバイバルでは発光エフェクトがかかり、クリエイティブに切り替えると対象外になるスクリーンショット

ステップ4:タグで絞り込む(tag)

tag は、事前に tag コマンドで付与したカスタムタグを条件にする引数です。同じエンティティに複数のタグを付けることもでき、Datapackで「役割」や「状態」を管理する手段として非常によく使います。

# 近くの村人全員にタグ「target」を付ける
tag @e[type=villager,distance=..10] add target

# タグ「target」を持つ村人だけにダメージを与える
damage @e[type=villager,tag=target] 10

# タグを持っていないエンティティを対象にする(否定)
damage @e[type=villager,tag=!target] 10

type=villager だけでも動きますが、tag=target を組み合わせることで「このDatapackが管理している村人だけ」を他の村人と区別できます。複数のDatapackを共存させるときに特に重要なテクニックです。

実際に入力して確認しよう

  1. 近くに村人をスポーンさせる
summon villager ~ ~ ~
  1. タグを付ける
tag @e[type=villager,distance=..10] add target
  1. タグが付いたか確認する
tag @e[type=villager,distance=..10] list
  1. タグを持つ村人だけにダメージを与えて動作を確認する
damage @e[type=villager,tag=target,limit=1] 10
tag list でタグ確認後、tag=target のゾンビだけにダメージが入る様子

ステップ5:チームで絞り込む(team)

team は、team add コマンドで作成したチームに所属しているエンティティを対象にする引数です。チームは名前の色を変えたり、フレンドリーファイアを制御したりする機能も持っています。

# チーム「red」に所属しているプレイヤーにエフェクトを付与
effect give @a[team=red] speed 10 1

# どのチームにも所属していないプレイヤーを対象にする
effect give @a[team=] speed 10 1

# チーム「red」以外のプレイヤーを対象にする
effect give @a[team=!red] speed 10 1

team=(値を空にする)で「チーム未所属」のエンティティを指定できます。チーム名と引数を使い分けることで、PvPやチーム戦のDatapackが作りやすくなります。

実際に入力して確認しよう

  1. チーム「red」を作成する
team add red
  1. 自分をチーム「red」に追加する
team join red @s
  1. チーム「red」のメンバーにエフェクトをかけて動作確認する
effect give @a[team=red] speed 10 1
  1. チームから離脱して、エフェクトがかからなくなることを確認する
team leave @s
team join でチームに参加後、team= 引数でチームメンバーだけを対象にできることを示すスクリーンショット

ステップ6:並び順と取得数を制御する(sort / limit)

sort は対象の並び順を、limit は対象の最大数を制御する引数です。この2つはセットで使うことがほとんどで、「最も近い1体だけ」「ランダムな3人」といった指定ができます。

sort の値意味
sort=nearest実行位置に近い順
sort=furthest実行位置から遠い順
sort=randomランダム順
sort=arbitrary順不同(デフォルト)
# 最も近いプレイヤー1人だけにエフェクトを付与
effect give @a[sort=nearest,limit=1] speed 10 1

# ランダムな3人にエフェクトを付与
effect give @a[sort=random,limit=3] speed 10 1

# 最も近いゾンビ1体にダメージを与える
damage @e[type=zombie,sort=nearest,limit=1] 10

@p は「最も近いプレイヤー1人」ですが、@a[sort=nearest,limit=1] と書くことで他の引数(taggamemode など)と組み合わせられるため、より細かい条件指定が可能になります。

実際に入力して確認しよう

  1. 村人を3体スポーンさせ、バラバラな距離に配置する
summon villager ~2 ~ ~ {NoAI:1b}
summon villager ~5 ~ ~ {NoAI:1b}
summon villager ~10 ~ ~ {NoAI:1b}
  1. 最も近いゾンビ1体だけにダメージを与えて、1体だけ体力が減ることを確認する
damage @e[type=villager,sort=nearest,limit=1] 10
  1. limit=3 に変えて全員に当たることも確認する
execute as @e[type=villager,sort=nearest,limit=3] at @s run damage @s 10
sort=nearest,limit=1 で3体のゾンビのうち最も近い1体だけにダメージが入る様子

引数まとめ一覧

この記事で学んだ引数を一覧にまとめます。複数の引数はカンマで並べることで AND 条件として機能します。

引数役割
distance実行位置からの距離で絞るdistance=..5
nameエンティティ名で絞るname=Steve
gamemodeゲームモードで絞る(プレイヤーのみ)gamemode=survival
tagカスタムタグの有無で絞るtag=target
team所属チームで絞るteam=red
sort対象の並び順を指定するsort=nearest
limit対象の最大数を指定するlimit=1

Datapackのファイルに書いてみよう

ここまで学んだ引数を組み合わせて、Datapackの .mcfunction ファイルに書いてみましょう。

my_datapack/
├── pack.mcmeta
└── data/
    └── my_datapack/
        └── function/
            └── effect.mcfunction
# effect.mcfunction
# 3ブロック以内のサバイバルプレイヤーに発光エフェクトを付与する
effect give @a[distance=..3,gamemode=survival] glowing 2 0 true

末尾の true はエフェクトのパーティクルを非表示にするオプションです。distancegamemode を組み合わせることで、クリエイティブの管理者プレイヤーは除外しつつ、近くのサバイバルプレイヤーだけを処理できます。

コマンドを書いている様子

実際に入力して確認しよう

  1. 上記フォルダ構成でDatapackを作成してワールドに読み込む
  2. 以下のコマンドを実行する
/function my_datapack:effect
  1. サバイバルモードで座標の近くに立ち、発光エフェクトが継続的に付くことを確認する
  2. /gamemode creative に切り替えて、エフェクトがかからなくなることを確認する

まとめ

  • ターゲットセレクター(@a / @e など)はコマンドの「対象を指定する記号」で、省略できない
  • [...] で引数を付けることでセレクターの対象をさらに絞り込める
  • distance で距離、name で名前、gamemode でゲームモード、tag でカスタムタグ、team でチームによる絞り込みができる
  • sortlimit を組み合わせると「最も近い1体だけ」「ランダムな3人」といった取得方法も制御できる
  • 複数の引数はカンマで並べると AND 条件になる。! を付けると否定条件になる
  • チャット欄で動作を確認してからDatapackのファイルに移すと理解が深まる

次の記事では、今覚えたセレクター引数をそのまま使って、givetellraw など基本コマンド10個を**「参加演出Datapack」を作りながら**身につけていきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次