今回は、サンプルプログラム/hello, worldを元に、データをスクリプトの外から持ってくる方法の一つを使い、テキストパネルに1つのプログラマブルブロックで複数パターンの結果を出してみましょう。
準備
電源のほかに必要なブロック
種類と数 | 備考 |
---|---|
前回と同じもの | |
Text panel×1 | 名前を「Text panel Test」にしておく |
Show text on screenをオンにしておく。 | |
Programmable Block×1 | スクリプトの内容は下記 |
追加でいるもの | |
Button Panel×1 | 設定は後で解説 |
元のスクリプト
このサンプルプログラム/hello, worldの完成形を元に変更していきます。
public void Main(string argument) { IMyTextPanel target; target = GridTerminalSystem.GetBlockWithName("Text panel Test") as IMyTextPanel;
target.WritePublicText("hello, world", false); }
第1段階:下準備
まずは同じ動作のまま、少し処理を変更する下準備です。5行目を1行下げて、5~6行目を次のように変更します。
新5行目:変数を用意する
変数の型 = 変数の中身;
↓
string text = "hello, world";
テキストパネルを用意したときの「IMyTextPanel target」と同じように、今度はstringという型でtextという変数を作っています。また、そのままhello, worldという文字列を中に入れる処理まで同じ行で済ませました。
string型というのは、文字列を入れることができる型です。
新6行目:書き込み内容に変数の中身を使う
target.WritePublicText("hello, world", false);
↓
target.WritePublicText(text, false);
こうすると「hello, worldと書き込む」から、「変数textの中身を書き込む」という処理に変わります。
ここでの引用符の有無についてですが、ざっくり箇条書きにすると以下のようになります。
- WritePublicText括弧内のカンマより前は「string(文字列)型のデータ」が入る場所で、直接書く以外の方法も使える。
- 今回はstring型の変数を指定することで、中身を読み取らせている。変数の名前なので引用符はいらない。
- 元のスクリプトは「string型のデータ」を直接書くために二重引用符""で囲っていた。
第1段階まとめ
第1段階が済んだ状態は、以下の通りです。
public void Main(string argument) { IMyTextPanel target; target = GridTerminalSystem.GetBlockWithName("Text panel Test") as IMyTextPanel;
string text = "hello, world"; target.WritePublicText(text, false); }
実行しても動作は全く変わりませんが、string型のデータの存在と、WritePublicText()に直接文字列を書かない書き方を知ることができました。では、実際に機能を変える次の段階に進みましょう。
第2段階:機能を変更
表示する文字列を、プログラムの外から持ってくるように改造します。
まずは1行目に注目してください。
public void Main(string argument) {
これはデフォルトで用意されているMainメソッドの始まりですが、括弧()の中に「string型の変数を作る」のと同じ文がありますね。
括弧()の中では、上記と同様にargumentというstring(文字列)型の変数を作り、そのうえで、引数と呼ばれる「実行の際に渡されたデータ」を受け取って変数に入れています。
ここに何処から何の文字列が送られてきているのかというと、プログラマブルブロックのメニューにある「Argument」というテキストボックスに書かれている内容が、スクリプトが実行されたときに送られてきています。
これを踏まえて、5~6行目を変更していきます。
新5行目:argumentを書き込む
string text = "hello, world"; target.WritePublicText(text, false);
↓
target.WritePublicText(argument, false);
6行目のWritePublicTextで使う変数を、textではなくargumentに変更します。
これによって、変数textを使うところが無くなったので、それを作る5行目は削除してしまいます。
変数を変更したことで、「変数textを作って中身をhello, worldにする」+「変数textの中身を書き込む」という処理から、「変数argumentの中身を書き込む」という処理に変わりました。
完成状態は以下のようになります。
public void Main(string argument) { IMyTextPanel target; target = GridTerminalSystem.GetBlockWithName("Text panel Test") as IMyTextPanel;
target.WritePublicText(argument, false); }
データの入力元を変えて実行する
プログラマブルブロックのメニューからデータを入力する
プログラマブルブロックのターミナルメニューで、まずはそのままRunをクリックして実行してください。パネルには何も表示されないか、すでに何か書いてあれば消去されます。
これは、Argumentテキストボックスが空白なので、スクリプトは何もない文字列を受け取って書き込んだからです。
今度は「Argument」に「hello!」と書いて、Runをクリックして実行してみましょう。今度はhello!と表示されます。
適当な文字列を入力してまた実行すれば、それが反映されます。
これだけで見ると、内容を変える時にスクリプトを変更せずにすむだけですが、実はもうちょっと便利になっています。その点は次に解説します。
ツールバーアクションからデータを入力する
ボタンパネルのボタンを照準して、Kキーで設定画面を開いてください。
ボタン1にプログラマブルブロックをドラッグ&ドロップし、アクションは「Run with default argument」を設定してください。
ボタン2にもプログラマブルブロックをドラッグ&ドロップし、今度は「Run」を選んでください。すると、テキストボックスのあるArgumentというダイアログが出てきます。ここに、hello!以外の文字列、何でもいいですが思いつかなければ「ABC」とでも入れてください。
ボタン3にもプログラマブルブロックをドラッグ&ドロップし、同じく「Run」を選んでください。今度はボタン2と違う文章を、思いつかなければ「XYZ」とでも入れてください。
それでは、1~3のボタンを押してください。そうすると、テキストパネルの文字列が変化します。
ツールバー設定の「Run with default argument」は、メニューでのRunボタンと同じように、ブロックのArgument欄の内容をスクリプトに渡して実行するアクションです。
ツールバーでの「Run」は、Runボタンと違い、設定するときに書き込んだ内容が保存され、それをArgument欄の代わりにスクリプトに渡して実行するアクションです。また、このアクションだけは、Argumentを別にすることで同じツールバーに複数設定できるという特徴があります。
ボタンパネルだけでなく、センサーやタイマー、操縦席など、ツールバー設定系の画面で設定するブロックで同様の設定が可能です。
補足
文字列に何か処理して書き込む
5行目を、下記のように変更してみてください。
target.WritePublicText(argument, false);
↓
target.WritePublicText("input:"+argument+"\n", true);
こうすると、実行するたびに、「input:設定した文字列」という文が改行して追加されていきます。
まず、消さずに追加されるのは前回少し触れたとおり、WritePublicTextのオプションで、追記するかどうかを「true」(真)にしたからです。
文字列の変化についてですが、まず、string(文字列)型のデータは「+」で足すことで繋がります。
そして、「引用符で囲んで直接書かれたinput:という文字列」+「argumentに入っている文字列」+「引用符で囲んで直接書かれた改行文字」を「計算した結果」がWritePublicTextに渡されているため、上記のような出力結果になっています。
まとめ
今回の内容では、Argument欄を使用して使う文字列を変更し、同じブロックのまま動作を変える方法、ちょっとした文字列の処理を解説しました。
例えば、複数のセンサーのそれぞれにArgumentを変えたRunを設定することで、どのセンサーに引っ掛かったのかをパネルに表示するような動作を作るときに、プログラマブルブロックを1つだけ、スクリプトを書き換えずに設定するようなことが可能になります。
また、文字列を繋げることを使って、argumentに全文を書かずに変化する部分だけ書くことができます。