滑走路や格納庫で同じ色のInterior Lightを並べていて色や明るさを設定した後に、Interior Lightを増やしたり位置を変えて、新しいものを同じ設定にするのが面倒だった経験はありませんか?プログラムを使えば1回直すたびにグループに追加して、直接数値入力できない色はスライダを微調整して、各項目の数値を入れて……と繰り返す必要はもうありません!
このページでは、同じ船・ステーションの全てのInterior Lightに同じ数値設定を書き込むプログラムを紹介します。便利な一括設定を今すぐ始めてみましょう!
サンプルプログラム
用意するもの
- Interior Lightを1つ以上お好みの数
- Programmable block を1つ
※同じステーションに既にあるInterior Lightも全て設定変更してしまうので、新しい船やステーションで行ってください。
まずはProgrammable blockのエディタを開き以下のプログラムを貼り付けましょう。
void Main(string argument){ var targets = new List<IMyTerminalBlock> ();
GridTerminalSystem.GetBlocksOfType<IMyInteriorLight>(targets);
for (int i = 0; i < targets.Count; i++) { targets[i].SetValue("Color", new Color(255, 0, 0)); targets[i].SetValue("Radius", 5.0f); targets[i].SetValue("Falloff", 1.0f); targets[i].SetValue("Intensity", 2.3f); targets[i].SetValue("Blink Interval", 0.0f); targets[i].SetValue("Blink Lenght", 10.0f); targets[i].SetValue("Blink Offset", 0.0f); } }
入力できたらRemember & Exitをクリックしてターミナル画面に戻りましょう。
Programmable blockのRunをクリックすると、そのステーションなり大型船のInterior Lightが全て赤くなり、色以外の数値も今回の設定ではMining Carriageの船首のライトに似た数値に変化します。繰り返しRunしても意味は無いですが、Interior Lightを付け直したり増やしてからRunすればそれらも同じ設定になります。
解説
上記のプログラムは、Interface nameがIMyInteriorLightのブロックをを取得して、取得したブロック全てに対してInterior lightに設定できる7つの設定項目の書き換えを行うプログラムです。
2行目:リストを作る
var targets = new List<IMyTerminalBlock> ();
複数のブロックに同じ操作をするときは、個別に操作せず、一纏めにするリストを作ることで、書くのも読むのも楽になります。任意の名前を付けられるので、ここでは「targets」と名付けたリストを作りました。
4行目:ブロックをリストに入れる
GridTerminalSystem.GetBlocksOfType<IMyInteriorLight>(targets);
ここでは、「IMyInteriorLight」という種類のブロック全てを、先ほど作った「targets」という名前のリストに入れています。
応用するときは、ブロックの種類がゲーム中の表示名とは違うプログラム用の名前なので、プログラミングガイドから目当てのブロックの「Interface name」を探すことと、別の名前でリストを作った場合はちゃんとその名前を使うことに気を付けてください。
6行目:各ブロックの各項目の数値を変更
for (int i = 0; i < targets.Count; i++) { targets[i].SetValue("Color", new Color(255, 0, 0)); targets[i].SetValue("Radius", 5.0f); targets[i].SetValue("Falloff", 1.0f); targets[i].SetValue("Intensity", 2.3f); targets[i].SetValue("Blink Interval", 0.0f); targets[i].SetValue("Blink Lenght", 10.0f); targets[i].SetValue("Blink Offset", 0.0f); }
最初のfor文は、先ほどの「targets」という名前のリストに何個の項目が入っているかを数えて、その回数分、つまり今回の場合はリストの最初のブロックから最後のブロックまでに対して、{から}までの動作を繰り返す部分です。
続く行はfor文で今選ばれているブロックに対し、指定した項目の数値を、指定した値に書き換えます。全ての項目を書き換え終えるとfor文によって次のブロックに同様の操作が行われていき、リストに読み込まれた全てのブロックの項目を同様に処理します。
設定項目名の後ろにある数値を変更することで、色や明るさ、点滅設定など任意に設定することができます。
別の種類のブロックに応用するならそれに応じた設定項目名が必要になります。これはプログラミングガイドで各ブロックの「Terminal properties:」に挙げられています。
上記のプログラムで色以外の設定項目の数値の後には「f」がついていますが、これは変数のデータ型がfloat型であることを表しています。各設定項目の変数のデータ型はプログラミングガイドで各ブロックの「Fields:」に「Terminal properties:」にある項目名とデータ型が併記されています。今の段階ならとりあえず『数値を扱う項目の殆どはfloat型なのでfをつける必要がある』と認識しておけば良いでしょう。
応用:特定のInterior Lightの設定変更
上記のプログラムでは全てのInterior Lightの設定を変更するため、格納庫と居住区のように別々の色を設定したいInterior Lightが既にある場合にそちらも変更してしまいます。そこで、特定の名前をつけたブロックだけの設定を変更するように改良してみましょう。
まずは1行目を見てください。
void Main(string argument){
これは、ターミナル画面のArgument欄に入力した文字列を「argument」という変数に読み込む部分です。
これを利用するため、4行目の
GridTerminalSystem.GetBlocksOfType<IMyInteriorLight>(targets);
を削除して、以下のように変更してみましょう。
if(argument.Length == 0){ GridTerminalSystem.GetBlocksOfType<IMyInteriorLight>(targets); }else{ GridTerminalSystem.SearchBlocksOfName(argument, targets); }
これは、Argumentから読み込まれた文字列の長さを数えて、何も書かれていなければ前と同じように全てのInterior Lightをリストに入れ、何か書かれていればその文字列を含む名前のブロックだけをリストにいれるように分岐する部分です。
少し使い勝手を広げるために分岐させていますが、何も入れずに使用することがないなら、上記の5行の代わりに以下のようにしても構いません。
GridTerminalSystem.SearchBlocksOfName(argument, targets);
この場合は「Argument欄から読み込まれた文字列を含む名前のブロックをリストに入れる」ようになります。
プログラムを書き換え終わって保存したらRunせずに、新しいInterior Lightをいくつか設置して、ターミナルを開いて色を変更したいInterior Lightだけ「Interior Light Red 1」,「Interior Light Red 2」...といった風に「共通の名前+α」になるように名前を変更しましょう。
そして、Progarmable blockのArgument欄に共通部分(上記そのままなら「Interior Light Red」)を入力しましょう。
プログラムをRunすれば、「Interior Light Red」を含む名前のInterior Lightだけが設定を変更されて赤くなります。
この解説は以上です。まずは数値設定を変えてライトを自由に扱うと良いでしょう、慣れてきたら対象とするブロックとそれに応じた設定項目を変えてSpotlightで同じ事をしたり、Rotorを一括して同じ角度に向けたりと応用して活用してください。