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

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





トリガーとは

Jass Scriptの機能のひとつで、イベント/Event条件/Conditionアクション/Action の3つの要素からなる関数群。

指定したイベントが発生すると、条件が真の場合、アクションで示された関数が実行される。

『ユニットが死んだとき』や『ユニットがダメージを受けたとき』、『プレイヤーがチャットコマンドを入力した時』などの検知に便利。一度作成されたトリガーは明示的に破棄されるまで有効で、メモリ上に残り続ける。

使い方

まず、トリガーを作成する。

    local trigger tempTrig=CreateTriger()

ここではローカル変数を使っているが、他のいろいろな場所から TriggerExecute 等で呼び出したいときは、グローバル変数を使うこと。

次に、トリガーにイベントを登録する。

    call TriggerRegisterUnitEvent(tempTrig,Hero,EVENT_UNIT_DEATH)

これは、ユニットが死亡した場合のイベント例。他のイベントに関しては、GUIのエディタで作成 -> カスタムスクリプトに変換、等で調べるといい。

トリガーに条件を登録する。

    call TriggerAddCondition(tempTrig, Condition(function CustomCondition))

後述にあるとおり、これはないほうがいいかもしれない。この例では、CustomCondition という、boolean型を返り値にもつ関数が実行される。

最後に、トリガーにアクションを登録する。

    call TriggerAddAction(tempTrig,function CustomAction)

この例では、CustomAction という関数が実行される。

まとめると、以下のようになる。

    //下のイベントが発生したとき、実行される
    function CustomAction takes nothing returns nothing
        local unit DyingUnit = GetDyingUnit()

        //ここに処理を記入
    endfunction

    function CreateTrigger_HeroDied takes unit Hero returns nothing
        local trigger tempTrig=CreateTriger()

        call TriggerRegisterUnitEvent(tempTrig,Hero,EVENT_UNIT_DEATH)
        //後述の理由により、条件は省略する
        //call TriggerAddCondition(tempTrig, Condition(function CustomCondition))
        call TriggerAddAction(tempTrig,function CustomAction)
    endfunction

使わないイベント

以下のイベントを使ってはいけない。

    native TriggerRegisterTimerEvent takes trigger whichTrigger, real timeout, boolean periodic returns event
    native TriggerRegisterTimerExpireEvent takes trigger whichTrigger, timer t returns event

これらのラッパーである、TriggerRegisterTimerEventPeriodicTriggerRegisterTimerEventSingleTriggerRegisterTimerExpireEventBJ も同様。

これらのイベントは一見便利だが、より処理が軽い命令に TimerStart 関数がある。こちらを使おう。

条件/Condition は必要?

条件をつけると、イベントの発生条件を区切ることができ、便利な気がしないでもない。しかし、以下の点が非常に不便だ。

  • 条件で指定する関数には、引数がつけられない
  • 条件分岐は、アクション内でしても実質かわらない
  • 実は、Condition関数で作られる conditionfunc 型をメモリから開放するには、DestroyCondition を使わなければならず、メモリリークの原因ともなりうる。

以上のような理由から、アクションのなかで if 命令を使って、発生条件を区分するのが定石。

注意点

イベント依存の引数関数(GetTriggerUnit())などの値が保証されているのは、アクションの関数が実行された直後のみ。同じ引数関数を使うイベントが発生した場合、瞬時に上書きされてしまうからだ。利用する引数関数は上記サンプルのように、アクション内ですぐにローカル変数に格納しよう。

また、使い終わったトリガーと条件は、必ず破棄する。