オブジェクトと関数セットは、常に一緒に使用します。オブジェクトと関数セットは別個のもので、これによって所有権が簡単に確立されます。オブジェクトは常に Maya によって、関数セットはユーザによってそれぞれ所有されます。
関数セットは、オブジェクトを操作する C++ クラスです。プラグインを使用してカーブを作成するの例では、MFnNurbsCurve が関数セットです(MFn の接頭辞がこのことを示しています)。
MFnNurbsCurve curveFn; MObject curve = curveFn.create( ... );
curve = curveFn.create( ... );
2 本目のカーブが作成され、カーブ MObject はこの新しいカーブを参照します。最初のカーブは、MObject ハンドルによって参照されなくなっただけで、まだ存在しています。
Maya API では、プロキシ オブジェクトを使用して新しい型の Maya オブジェクトを作成します。プロキシは、ユーザが作成するオブジェクトですが、Maya が所有します。
よくある誤解として、既存の関数セットから派生させることで新しい型のオブジェクトを作成できる、というものがあります。たとえば、MFnNurbsSurface は MFnDagNode から派生しています。ここで、MFnDagNode から派生した MySurface を作成し、特定のサーフェス型に対して動作するすべてのメソッドを与えれば、新しいサーフェス型を Maya に追加できる、と考えるかもしれません。残念ながら、これは間違いです。これは単に、新しいメソッドを使用して既存オブジェクトに対して動作する新しい関数セットになります。関数セットがユーザによって完全に所有されることに注意してください。Maya ではこれらの関数セットは認識も使用もされません。Maya では MObject によってハンドルされているオブジェクトだけを使用します。
オブジェクトと関数セットが分かれていることから起こる興味深い結果のひとつは、API が型に依存しないで動作することです。例:
MFnNurbsCurve curveFn; MObject curve = curveFn.create( ... ); MFnNurbsSurface surface( curve );
このコードではカーブが作成され、動作するサーフェス関数セットにその作成したカーブを渡します。MFnNurbsSurface はサーフェス オブジェクト上でしか動作しないため、上のサンプルでは実際に目に見える動作ではなく、ユーザがそれに気付かないことがあります。API のエラー チェック コードにより、このような誤った初期化がチェックされます。
関数セットは、どのような型の MObjects でも適用できます。型を認識できない場合は、オブジェクトを操作しようとしたときに、それを無視してエラー値を返します。詳細については、この章のエラー チェック、MStatus クラス、エラー ロギングを参照してください。