地形オブジェクトを利用する -ArmA訓練所-

ArmA訓練所
2007/05/08

エディターで自分で配置したユニットに特定の処理を行うときは、ユニットに付けた名前を指定しますが、
もともと地形に配置されている街灯や家、電波塔や貯水塔を処理する場合について説明します。

もともと地形に配置されている街灯や家などをオブジェクトと呼びます。
そしてこれらはオブジェクトIDという固有の番号を持っています。
早い話、ユニットの名前の代わりにこのオブジェクトIDを使えば、処理の対象を指定できます。

実際にオブジェクトIDを使うにはいくつか準備が必要になります。
まずはオブジェクトIDを調べなければなりません。
エディターでマップを開き、利用したいオブジェクトをマップ上で探します。
必要であればプレイヤーを配置して、プレビューを行い、実際の位置関係を確認するのも良いでしょう。
目的のオブジェクトが見つかったらマップをマウスホイールを回転させてズームします。
かなり拡大した状態で、エディター画面の右にあるShow IDsをクリックします。
すると、オブジェクトの上に数字が表示されると思います。
これがそのオブジェクトのもつオブジェクトIDです。
オブジェクトID表示はマップを拡大しているときしか表示されないので気をつけてください。

オブジェクトIDを確認したら、ひとまずメモを取っておきましょう。
エディターでオブジェクトIDを使って処理対象を指定するには
( object xxxxxx ) という形にします。xxxxxxはオブジェクトIDが入ります。
特定のオブジェクトが破損していないかを調べるには
? alive ( object xxxxxx )
みたいな感じで指定することになります。
ところが、ArmA 1.05時点ではこの書き方が利用できません。
BISのwikiを見たところ、私の英語力ではよく分からなかったのですが、
OFPの時は出来たけど、ArmAでは出来ない仕様になっている模様です。
代わりにnearestObjectを使えと書いてあります。
ここまで真面目に読んだのに無駄だった・・・と思うかもしれませんが、
バージョンが上がったら改善されそうな気がするので記憶にとどめておきましょう。(確証は全くありませんが・・・)

ここから本題

オブジェクトIDをobject xxxxxxで指定できないときの代替手段としてnearestObjectを使えと書いてありました。
書き方としては次のようになります。
_nObject = nearestObject [player,"StreetLamp"]
この一行の処理を説明すると、
プレイヤー自身に最も近い"StreetLamp"を一つ見つけ、見つかったオブジェクトを_nObjectに代入します。
これを実行した後は上でも説明していたオブジェクトIDの代わりに_nObjectを使えばいいことになります。
さっきの処理を書いた後に? alive _nObjectのような条件文を書けば、
プレイヤーに最も近い"StreetLamp"が壊れていなければ真(true)、壊れていれば偽(false)となります。

参考例として、街のどこかにある街灯を消すと言ったものを紹介します。
マップで街灯のある位置を探します。
街灯のすぐそばに動かないオブジェクトを配置しましょう。
例えばドラム缶(Barrel black)などを配置し、name欄にdoramuと付けましょう。
トリガーを一個配置し、条件文をthisからtrueに変更します。
on actの欄に次のように書きます。
( nearestObject [ doramu, "StreetLamp"] ) switchLight "OFF";
赤い文字の部分がオブジェクトを表し、青い文字が命令で、緑の文字が命令のパラメータです。
この状態でミッションの開始時間を22時などの夜にしてみましょう。時間はエディタの画面右上で変更可能です。
ミッションをプレビューしてみると街灯が夜でも消えているはずです。

おそらくArmAではこの方法しか出来ないのだろうと思いますが、
なぜオブジェクトIDの直接指定を廃止したのか理解できません。
この方法の欠点は、目的のオブジェクトの近くに何かしら配置しないといけないことと、
ある程度距離が(例えばドラム缶と街灯の間が)空いていた場合に、意図せず近くにあった別のものに反応してしまうことです。
同種の建物が並んでいた場合などに意図した建物の隣の建物が処理対象になった・・・なんてことにならないように注意が必要です。

もう一つ致命的なのが、オブジェクトの種類が分からないと使えないと言うことです。
例えば、ドラム缶の近くにある壁が壊れているかどうか判定するのに、
先ほどの街灯="StreetLamp"に相当する壁="????"を書かないといけないのですが、
壁をなんと書いて良いのか分からないと使えないんです。
これから私もいろいろと調べてまとめてみたいと思います。

使える地形オブジェクトの種類はこちら Staticオブジェクト一覧


Homeへ