ChangeModel

スイッチでモデルを替える。

■ そもそも「モデルを替える」ってどういうことさ。

 ひとつのPIでひとつの仕様を作っているうちは縁のない構文と思います。
 この構文が必要になるのは、例えば
  • スイッチで製造年度を切り替えたい!
 とか
  • スイッチで番台を切り替えたい!
 というような時です。スイッチばかりですね。

 それで、「モデルを替える」というのは、最初に読み込んで表示させたXファイルの代わりに、違うXファイルを読み込ませて表示させる、ということです。
 たとえるなら、スイッチを切り替えるとクーラーがAタイプからBタイプになるようにしたい!ということです。
 せっかくクーラーの話が出たので、クーラーを取り替える構文を書いてみることにします。

■ そんで、どうしたらいいんだ?

 まずは最初のオブジェクト定義です。
Object3D "Cooler" {
  ModelFileName = "cooler_a.x";
  ModelScale = 1.0;
  Joint3D "MainBody" {
    AttachCoord = ( 0.0, 3.0, 0.0);
    LocalCoord = ( 0.0, 0.0, 0.0);
  }
}
 本当に何の変哲もないObject3Dなので詳しい説明は省きます。
 さっくり説明すれば、「『Cooler』ちゅう名前で『cooler_a.x』ちゅうファイルのモデルを1.0倍で『MainBody』ちゅうオブジェクトの高さ3mのところにすえつける」ということです。
 では、このクーラーをスイッチでBタイプに替えられるようにしましょう。

1. 切り替えるためのスイッチを定義しておく。

 切り替えるためにはまずスイッチがなければなりませんよね。
 そこでそのスイッチをあらかじめ作っておきます。が、ここもさっくり省略して完成品だけ載せます。
DefineSwitch "クーラー" {
  Entry = "Aタイプ";
  Entry = "Bタイプ";
}
 極簡単に説明すれば、「『クーラー』ちゅう名前のスイッチに『Aタイプ』と『Bタイプ』の選択肢を作る。」ということですな。
 これをTrainInfoブロックの次に突っ込んでおきます。これでスイッチの定義はおしまいです。

2. スイッチに対応してモデルを切り替えさせる。

 いよいよmodel-changerの登場です。
 舞台はモデルを切り替えたいオブジェクトの定義文の中、例で言えばJoint3Dブロックの直前です。
 そこにこいつを突っ込みます。
ApplySwitch "クーラー" {
Case 1:
  ChangeModel = "cooler_b.x",1.0;
}
 はい、安心してください、今度はちゃんと説明しますから。

 ではまず一行目。
ApplySwitch "クーラー" {
 『クーラー』ちゅう名前のスイッチに対応した動作をこれから書きますよ、という意味です(厳密にはすこーし違うんですが省略)。
 ""の中身はDefineSwitchと揃えておかないとうまく動かないどころかエラー吐いて落ちます。

 二行目。
Case 1:
 2番目の選択肢が選ばれた時の動作をこれから書きますよ、という意味です(厳密にはすこーじ(ry)。
 ……え、なんで1なのに2番目なのかって?
 大事なんで太字で書きますよ。

 Railsimでは選択肢を0から数えます。

 いいですか?
 もう一度いいますよ。

 Railsimでは、選択肢を 0から 数えます。

 つまり、1番目の選択肢は「Case 0:」、2番目の選択肢は「Case 1:」、3番目は……もうお分かりですね。
 Railsimにおいて、多くの場合数え方は0からです。気をつけましょうね。

 さて、三行目に行きましょう。
  ChangeModel = "cooler_b.x",1.0;
 やっと真打登場です。
 この一行と(ほぼ)同等の文章が以下。
  ModelFileName = "cooler_b.x";
  ModelScale = 1.0;
 わかります?
 最初の定義とほぼ同じ「『cooler_b.x』ちゅうファイルのモデルを1.0倍で表示する」と書かれているだけなんですね。
 なぜ『ほぼ』同等なのかといえば、後者2行をここで書いてもエラーになるだけだからです。替えは効きません。

 この二行目と三行目のセットをどんどん増やしていけば(もちろんスイッチの選択肢も増やすべきですが)、理論上はほぼどんなモデルにも置き換えることができるというわけです。
 いろいろ凝ったことをしようとすると必ずと言って良いほどお世話になりますから、しっかり覚えておきたいものです。

 そして最後の四行目。
}
 『クーラー』ちゅうスイッチに対する動作の定義を終わるぜよ、という合図です。
 最後はちゃんと閉じてあげないとこれまたエラーです。最後まで責任とってよね!

3. ひとまず完成だぜ!

 これで晴れてクーラーをAタイプとBタイプで切り替えられるようになりました!パチパチパチ!
 というわけでできた構文の全貌が以下。
PluginHeader{
  ~~
}
TrainInfo{
  ~~
}
DefineSwitch "クーラー" {
  Entry = "Aタイプ";
  Entry = "Bタイプ";
}
PrimaryAssembly{
  ~~
  Body "MainBody" {
    ~~
  }
  Object3D "Cooler" {
    ModelFileName = "cooler_a.x";
    ModelScale = 1.0;
    ApplySwitch "クーラー" {
    Case 1:
      ChangeModel = "cooler_b.x",1.0;
    }
    Joint3D "MainBody" {
      AttachCoord = ( 0.0, 3.0, 0.0);
      LocalCoord = ( 0.0, 0.0, 0.0);
    }
  }
  ~~
}
 なかなかどうして立派なものです。

■ まとめってやつだ。

 さて、ここで最低限覚えていって欲しいことは、
ModelFileName = "XXXX.x";
ModelScale = Y.Y;
 と
ChangeModel = "XXXX.x",Y.Y;
 の意味するところは同じ、ということ。
 これだけでも覚えておけば、グッと使いやすくなるでしょう。

 ではまた!

名前:
コメント:

すべてのコメントを見る
最終更新:2016年07月03日 05:59
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。