[ 編集このページを編集する ]

トップ > MAP作成 > トリガーエディタ > Jass Script > Jass講座 > ユニットグループ



ユニットグループ/group は、ユニットの集まりを指す変数のこと。ユニットにまとめて命令を出したり、範囲内のユニットを選ぶ等、MAP作りに欠かせない要素だ。

しかし、トリガーエディタで使った場合がそうであるように、ユニットグループはその性質上、メモリリークの温床になりうる。正しい使い方を必ずマスターしたい。

Jass NewGenの導入が前提です。導入せずとも利用できる内容も一部ありますが、あったほうが断然有利です。



宣言

ユニットグループを使うには、まず変数に対し、ユニットグループを作成する。

  • 作成
        local group SampleGroup = CreateGroup()
    ユニットグループを宣言して、空のユニットグループを作成。

この空のグループにユニットを追加して使う。最後には、メモリリークの原因になるので必ず破棄すること。

  • 破棄
        //ユニットグループの破棄
        call DestroyGroup(group whichGroup)
        //ユニットグループ変数のnull化も忘れずに。
        set SampleGroup = null

ユニットの追加

ユニットを追加する方法はいくつかある。

  • ユニット一体を追加
        call GroupAddUnit(group whichGroup, unit whichUnit)
  • 特定のプレイヤーの全ユニットを設定
        call GroupEnumUnitsOfPlayer(group whichGroup, player whichPlayer, boolexpr filter returns nothing)
  • 指定した範囲(rect)内の全ユニットを設定
        call GroupEnumUnitsInRect(group whichGroup, rect r, boolexpr filter)
  • 地点から、一定距離以内の全ユニットを設定
        call GroupEnumUnitsInRange(group whichGroup, real x, real y, real radius, boolexpr filter)

ほかにもいろいろ。

ユニットの削除

ユニットグループから除外する方法について。あくまでグループから取り除くだけで、ユニットそのものが消えるわけではない。

  • ユニット一体を削除
        call GroupRemoveUnit(group whichGroup, unit whichUnit)
  • グループ内の全ユニットを削除
        call GroupClear(group whichGroup)
    ユニットグループを空の状態に戻すだけで、再利用可能。

これらでユニットグループを空にしても、DestroyGroup を呼ぶのを忘れないように。

使用例

範囲内のユニットについて処理したい

『範囲内のユニットを選んで○○する』を実装するとき、下の方法がおすすめ。

サンプル集より、ノックバックからソースを一部転載。

   function CastThunderClap takes unit Caster returns nothing
       local real   AOE            =   200+I2R(GetUnitAbilityLevel(Caster,'AHtc')*50)+16
       //まず、ユニットグループを作成
       local group  UnitsAround    =   CreateGroup()
       local real   X              =   GetUnitX(Caster)
       local real   Y              =   GetUnitY(Caster)
       local unit   PickedUnit     =   null
       
       //地点X,Yから、距離AOE以内の全ユニットを、UnitsAround に格納する。
       call GroupEnumUnitsInRange(UnitsAround,X,Y,AOE,null)
       
       //※ここが重要
       loop
           //UnitsAround内の、一番はじめに登録されてあるユニットを PickedUnit へ格納
           set PickedUnit = FirstOfGroup(UnitsAround)
           //PickedUnit が存在しない、すなわち UnitsAround が空の場合、ループを抜ける
           exitwhen PickedUnit == null
           //UnitsAround から、PickedUnit を取り除く。
           call GroupRemoveUnit(UnitsAround,PickedUnit)
           
           //ここで、Picked Unit について処理を行う。

       endloop

       //グループを解放          
       call DestroyGroup(UnitsAround)
       //変数を開放
       set UnitsAround =   null
       set PickedUnit  =   null
   endfunction

他にも、

    call ForGroup(group whichGroup, code callback)

を使うという手もあるが、この方法だと引数を渡すことができないので、なにかと不便。

おまけ

関数一覧

ユニットグループに直接関係する、関数の一覧

native CreateGroup                          takes nothing returns group
native DestroyGroup                         takes group whichGroup returns nothing
native GroupAddUnit                         takes group whichGroup, unit whichUnit returns nothing
native GroupRemoveUnit                      takes group whichGroup, unit whichUnit returns nothing
native GroupClear                           takes group whichGroup returns nothing
native GroupEnumUnitsOfType                 takes group whichGroup, string unitname, boolexpr filter returns nothing
native GroupEnumUnitsOfPlayer               takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
native GroupEnumUnitsOfTypeCounted          takes group whichGroup, string unitname, boolexpr filter, integer countLimit returns nothing
native GroupEnumUnitsInRect                 takes group whichGroup, rect r, boolexpr filter returns nothing
native GroupEnumUnitsInRectCounted          takes group whichGroup, rect r, boolexpr filter, integer countLimit returns nothing
native GroupEnumUnitsInRange                takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing
native GroupEnumUnitsInRangeOfLoc           takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing
native GroupEnumUnitsInRangeCounted         takes group whichGroup, real x, real y, real radius, boolexpr filter, integer countLimit returns nothing
native GroupEnumUnitsInRangeOfLocCounted    takes group whichGroup, location whichLocation, real radius, boolexpr filter, integer countLimit returns nothing
native GroupEnumUnitsSelected               takes group whichGroup, player whichPlayer, boolexpr filter returns nothing

native GroupImmediateOrder                  takes group whichGroup, string order returns boolean
native GroupImmediateOrderById              takes group whichGroup, integer order returns boolean
native GroupPointOrder                      takes group whichGroup, string order, real x, real y returns boolean
native GroupPointOrderLoc                   takes group whichGroup, string order, location whichLocation returns boolean
native GroupPointOrderById                  takes group whichGroup, integer order, real x, real y returns boolean
native GroupPointOrderByIdLoc               takes group whichGroup, integer order, location whichLocation returns boolean
native GroupTargetOrder                     takes group whichGroup, string order, widget targetWidget returns boolean
native GroupTargetOrderById                 takes group whichGroup, integer order, widget targetWidget returns boolean

native ForGroup                             takes group whichGroup, code callback returns nothing
native FirstOfGroup                         takes group whichGroup returns unit