チュートリアル > マテリアルの自動割り当て |
MAXScript によって、オブジェクトの選択、レンダリングの開始や停止などのシーン イベントを監視するコールバック スクリプトを作成することができます。このスクリプトで、監視対象のシステム イベントが検出されたときに常に一定のアクションが自動的に実行されます。
以下のスクリプトで、マテリアル エディタのスロット 1 から、選択した、または新規に作成した任意のオブジェクトに自動的にマテリアルを割り当てます。
macroScript は AutoMat と呼ばれます。スクリプトを使用する場合は、[カスタマイズ...](Customize...)を使用してスクリプトを [HowTo] カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。
AutoMat スクリプトがアクティブかそうでないかを追跡するために、変数内にスクリプトの状態を格納する必要があります。変数はローカルとして宣言され、最初に undefined が格納されます。 まだ値が何も割り当てられていないためです。
isChecked ハンドラは true または false を返し、ボタンの状態を判別します。 true の場合、ボタンはツールバー上で押された状態で表示されるか、メニューやクアッド メニューにチェックマークが付きます。 false の場合は、通常の状態で表示されます。 AutoMat_Enabled はローカル変数で、コールバックがアクティブな場合は true 、アクティブでない場合は false 、スクリプトがまだ開始されていないときは undefined が格納されています。
Macroscript_Body_Event_Handlers
on Execute ハンドらは、ボタンを押す、メニューから選択する、ショートカットを押すなどして macroScript が実行されるたびに実行されます。ハンドラには、スクリプトの「本体」が含まれています。
Macroscript_Body_Event_Handlers
if AutoMat_Enabled == undefined then AutoMat_Enabled = true else AutoMat_Enabled = not AutoMat_Enabled
スクリプトが初めて開始され、変数に undefined が含まれている場合は、これに true を代入します。そうでない場合は、Not 論理式( true は false に、false は true になる)を使用して変数の値を逆にします。
変数が true を含んでいる場合は、先に進んでコールバックを作成します。 if では、 then の後の式または else の後の式のどちらかを評価するためのブール値があると想定されます。そのため、 AutoMat_Enabled == true を書く必要はありません。変数自体が、正しい選択を行うために if にとって十分な true または false を含んでいるためです。ただし、いずれの形式とも有効です。
コールバックには、実行されるスクリプトを含んだ文字列が必要です。スクリプトのテキストが複数の行から構成される場合は、それを文字列の変数に格納しておくことができます。この例では、変数 txt に格納されます。 「¥n」 は、文字列内部で改行復帰を示すために使用されます。
マテリアル エディタはスロット内でマテリアルとマップの両方を表示することができるので、スロット 1 には現在のところテクスチャ マップが含まれていないことを確認する必要があります。そのため、スロット 1 内のオブジェクトのスーパークラスをテクスチャ マップと比較して、それがテクスチャ マップでない場合にのみ先に進みます。
このコード行では、前の行で既に定義済みの文字列に、文字列を追加して成長させます。最初の行の文字列の末尾には「¥n」が含まれていたので、文字列を評価したりリスナーに出力したりすると、新しく追加された文字列は新しい行に表示されます。
文字列内のこのコードでは、マテリアル エディタのスロット 1 にあるオブジェクトを現在の選択の .material プロパティに代入します。これは、MAXScript が選択範囲で検出されたすべてのオブジェクトを内部的に反復し、それぞれにマテリアルを割り当てるという意味です。類似した事例については、「チュートリアル - すべてのマテリアルの削除」も参照してください。
Material_Editor_meditMaterials
次に、このスクリプトをシーンのコールバック スクリプトに追加します。スクリプトは選択セットが変更されたときに実行され、後で名前を指定することで削除できるよう固有の ID である #AssignMaterial が付けられています。また、持続性がないため MAX シーンと一緒に保存されることはありません。つまり、シーンを保存してそれを後でもう一度ロードしても、このスクリプトは実行されないということです。
変数 AutoMat_Enabled が false を含んでいる場合は、コールバックを削除してスクリプトを無効にします。固有の ID を持っているので、ユーザ定義の名前である #AssignMaterial を指定することで、スクリプトをコールバックのリストから簡単に削除できます。
スクリプトを評価してツールバーをカスタマイズした後にテストを実行することができます。マテリアル エディタの最初のスロットに、たとえばテキスチャ マップなどの何らかのマテリアルが必要です。[マテリアル エディタ](Material Editor)のビューポート アイコンにある[マップを表示](Show Map)をオンにして、マップを表示することもできます。
スクリプトのボタンを押さないでボックスなどのジオメトリを作成した場合、通常はマテリアルはありません。ボタンを押して同じオブジェクトを選択した後に、マテリアルがそのオブジェクトに自動的に割り当てられるようになります。
新しく作成されるオブジェクトも、作成中に現在の選択になると、マテリアルが割り当てられ、3ds Max 内で選択コールバック イベントをトリガします。
スクリプトを無効にするには、ボタンを再度押す必要があります。 ボタンまたはメニュー項目のチェックマークがオフになり、コールバックが削除されます。これで通常どおりオブジェクトを選択したり作成できるようになります。