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