私もこんなものは初めて作りました。プログラムの経験がない人は何をやっているのかさっぱり判らないと思いますが、気にする必要はありません。悪いのはあなたではなくXPressoの方です。「XPressoではif文を表現できない」のです。if文は階層化できますが、XPressoで階層化されたif文を表現するのは事実上無理です。私はやったことありませんし、やってみたいとも思いません。COFFEEで書いた方がずっと簡単です。3条件分岐ノードXPressoにはC言語のswitch文に似た働きをする「条件分岐」ノードがあります。「どうしてもCOFFEEを書きたくない」という人はこれを使うしかありませんが、あまりおすすめはできません。条件分岐ノードには、「複数の処理を実行できない」、「処理の続行やbreakの設定ができない」、「defaultの設定ができない」といった機能上の欠点があるからです。COFFEEノードを使えばswitch文も普通に扱えます。それでは条件分岐ノードを使ってマテリアルを切り替える実験をしてみましょう。新規シーンを作成し、「立方体」オブジェクトを作成し、XPressoタグを作成して下さい。マテリアルマネージャでカラーの異なるマテリアルを3個作って下さい。次に、立方体にマテリアルを適用し、テクスチャタグを作成して下さい。マテリアルはどれでも構いません。図804-5次に、XPresso編集ウインドウに「立方体オブジェクト」、「テクスチャタグ」、「3個のマテリアル」をドラッグします。図804-6それではこれから、「オブジェクトの高さ(Y方向の位置)に応じて色を変えるXPresso」を作ります。論理」から「条件分岐」ノードを作成します。計算」から計算ノードを作成します。これで必要なノードは全てそろいました。図804-7まず、立方体ノードに「位置.Y」出力ポートを作成し、計算ノードの入力につなぎます。計算ノードのデータタイプは「整数」、演算タイプは「除算」、入力2は「100」に変更して下さい。これによって、立方体の高さが100変った時に、出力が1変るように値がスケールされます。同時に、位置データが浮動小数から整数に変換されます。図804-8次に、計算ノードの出力を条件分岐ノードの「スイッチ」ポートにつないで下さい。条件分岐ノードは、スイッチポートの値が0の時に一番上の入力ポートにリンクされたデータを出力ポートに出力します。スイッチポートの値が1の時に2番目の入力ポートのデータを出力します。入力ポートが多数ある場合は、順番にスイッチポートの値に対応したデータが出力されます。入力ポートはいくらでも増やせます。スイッチポートの値がマイナスの場合、一番上の入力ポートのデータが出力されます。スイッチポートの値が入力ポートの総数を超えた場合、一番上の入力ポートに戻ります。次に、マテリアルがリンクされた3個のオブジェクトノードに「オブジェクト」出力ポートを作成し、条件分岐ノードにつなぎます。条件分岐ノードのデータタイプは「リンク」に変更します。マテリアル」入力ポートを作成し、条件分岐ノードの出力ポートにつなぎます。すると次のようになるはずです。図804-9サンプル804dを開いて、立方体オブジェクトを上下に動かしてみて下さい。位置によって立方体に適用されるマテリアルが切り替わり、色が変わるはずです。4COFFEEでswitch文を使うそれでは比較のために、COFFEEノードを使って同じXPressoを作ってみます。この場合、XPressoの構成は次のようになり。条件分岐ノードを使った場合と大差ありません。サンプル804eを開いて確認してみて下さい。図804-11また、COFFEEノードの中のプログラムは次のようになります。l3_in;break;}ここで、1行目の「switch()」はswitch文であることを表します。switch文の()の中には整数を入力する必要があり、これが実行する「行数」を表します。立方体の高さの値は連続的に変化する浮動小数(例、1.234)であるため、「int()」関数を使って整数(例、1)にキャスト(変換)しています。0:」は0行目を表し、switchの値が0の時にこの行が実行されます。この行が実行された後、下の行も順番に全て実行されます。この行だけで実行を停止したい場合には、行の最後に「break」を追加して止めます。4、5行目も同じです。switchの値に対応するcaseが存在しない場合、出力ポートのデータは変更されません。最後に出力されたデータがそのまま出力されます。このような場合に特別な処理をさせるには、「default:」という行を追加します。このXPressoに限れば、条件分岐ノードを使う方がCOFFEEノードを使うより簡単です。条件分岐ノードではこれ以上複雑な機能を表現できません。その点、COFFEEノードを使えばより複雑な機能を表現できます。COFFEEノードを使うことをお勧めします。5全部COFFEEで書く参考までに、全部をCOFFEEノード内部で処理する方法についてサンプル804fで説明します。R8でXPressoが導入されるまで、私たちがCOFFEEタグの中で普通にやっていたことです。XPressoの構成は確かに簡単になります。COFFEEタグの中に書き込むこともできます。ポートやワイアを作る必要は全くありません(サンプル804g)。図804-12しかし、COFFEEはずいぶん複雑になります。ここで、1行目は現在のシーンファイルを取得しています(COFFEEタグの場合は自動的に取得されます)。3行目は、立方体オブジェクトを取得しています。ここでは、「オブジェクトマネージャの一番上にあるオブジェクト」として取得していますが、オブジェクトが増えた場合は名前や階層にしたがってオブジェクトを検索するプログラムを追加する必要があります(COFFEEタグの場合は自動的に取得されます)。5行目は、テクスチャタグを取得しています。ここでは「一番左にあるタグ、の右にあるタグ、の右にあるタグ」として取得していますが、タグが増えた場合は名前や順番にしたがってタグを検索するプログラムを追加する必要があります。6行目は、テクスチャタグにリンクされているマテリアルのマーカーを取得しています。7行目は、立方体の位置ベクトルを取得しています。9行目は、マテリアルマネージャの一番左(上)にあるマテリアルを取得し、さらにそのマーカーを取得しています。10行目は、一つ右(下)にあるマテリアルと、そのマーカーを取得しています。11行目は、さらに一つ右(下)にあるマテリアル、とそのマーカーを取得しています。13から18行目までは、変数名は変ってますが、ステップ4で説明したswitch文と全く同じです。ちなみに、13行目の「pos.y」は、「posベクトルのy成分」という意味です。20行目は、switch文の中で選択されたマテリアルのマーカーを、テクスチャタグに設定しています。私もこのようなプログラムを書いたのは数年ぶりです。XPressoが導入されて以降、オブジェクトを取得するのにCOFFEEを使うことはほとんどなくなったからです。ここまでのステップを振り返ってみると、XPressoとCOFFEEの得手不得手がよくわかります。XPressoは、オブジェクトやマテリアルを取得するのは得意だが、ループや条件分岐を処理するのが苦手。COFFEEは、ループや条件分岐を処理するのは得意だが、オブジェクトやマテリアルを取得するのが苦手。XPressoとCOFFEEをうまく組み合わせて使うのが一番いいのです。今回の実験の中ではステップ4がそれに相当します。