チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第52回:自動でセットプロジェクトを行うようにしよう!(1/2)

2014.02.14

  • Maya
  • ゲーム
  • コラム
  • チュートリアル
  • 中級者
  • 学生・初心者
  • 教育
  • 映画・TV
今回も便利なスクリプトを作ってみようという話です。ここのところスクリプトの話が多くなっているのは、コラムのネタとして書きやすいというウワサもあるとかないとか。今回のものはかなり実用的ですのでぜひ試してみてください。

3ds Max や Softimage を使われている方にとっては当たり前にある機能でも、Mayaに無い便利機能というものがたくさんあります。そんな中で私自身Softimageを触って「これがなぜMayaに無いのだ!」と思った機能の一つが、セットプロジェクトの自動化です。

Softimageでは新しいシーンを開くとき、現在設定してあるプロジェクト以外のシーンを開こうとすると親切に「プロジェクトの設定を、xxディレクトリに変更しますか?」と聞いてくれます。お店で買物をするのにポイントカードを出すのを忘れた時に、店員さんが「ポイントカードお持ちですか?」と聞いてくれるような錯覚を覚えます:)

Mayaでのプロジェクト設定はとても重要で、シーンを開くのにプロジェクトを正しくセットしていないとテクスチャパスが変更されて後で面倒を起こします。そのわりには何も忠告してくれないのです。これは何とかしなければいけません!
(ゲーム制作をしている時、プロジェクトをセットしているアーティストはほぼいなかったような気もしております。しかも間違ったところにセットしているのを何度か見かけたような気もします…。これはヒューマンエラーです。)

親切な店員システムをスクリプトで実現できるのでしょうか?もちろんMayaをカスタマイズすれば可能です。今回はそんな機能を作ってみましょう。

完成形は次の画像のような感じで、現在のプロジェクト以外のファイルを開こうとするとダイアログが出るようにしましょう。新しいプロジェクトのパスを表示して、

「セットして開く」
「セットしないで開く」
「キャンセル(セットもしない、シーンも開かない)」

をユーザーが選べるようにします。勝手にプロジェクトをセットされても困りますので。





どうやってプロジェクトディレクトリを特定するのか?

開くファイルのプロジェクトディレクトリがどこなのか、どうやって特定すれば良いのでしょうか?

「このディレクトリはMayaのプロジェクトですよ」という情報がディレクトリに付いていればわかりやすいですが、そういう情報はありません。しかしMayaのプロジェクトディレクトリには必ず「workspace.mel」というファイルがあります。この中に「テクスチャを入れるディレクトリはsourceimagesという名前のディレクトリ」などプロジェクトの情報が書かれています。まあ、これが「プロジェクト」の実体ですね。





ということは、開こうとしているファイルの場所から順々に上のディレクトリへたどりつつ「workspace.mel」があるか確認していけばよさそうですね。もしファイルがあれば、そのディレクトリがプロジェクトディレクトリです。

では早速MELでコードを書いてみましょう。こんな感じになります。

proc string autoSetProject.getProjectDir( string $filePath ){

    if ( `file -q -ex $filePath` == 0 ){
          // そんなファイルはない。
          return "";
    }

    // $filePathのあるディレクトリを取得
    string $dir = `dirname $filePath` + "/";
    if ( $dir == $filePath ){
         // ルートのドライブまでさかのぼっているので中断。
         return "";
    }


   // workspace.melがあるかどうか確認
   string $files[] = `getFileList -folder $dir -filespec "workspace.mel"`;
   if (`size($files)` ){
        return $dir;
   } else {
        $dir = autoSetProject.getProjectDir($dir);
        return $dir;
   }

}

次の様に実行すると「workspace.mel」のあるディレクトリ名を返します。ファイルパスは皆さんが持っているファイルへのパスに置き換えて下さい。パスを「/」区切りにしておくのを忘れないようにしましょう!

autoSetProject.getProjectDir("E:/temp/testProject/scenes/happyEverAfter.ma");



無事「E:/temp/testProject/」と返ってきました。

まあ、細かい説明はさておいて、関数が自分で自分を繰り返し呼びながらディレクトリをたどっています。つまり再帰を行っています。再帰を使うスクリプトは、ループから抜け出せなくなるバグを起こしがちなので、十分注意して下さい。

Mayaがフリーズしたら、そっとタスクマネージャーを立ち上げて、Mayaを止めれば大丈夫です。(今回のスクリプトを書くのに少なくとも5回はMayaをフリーズさせてしまいました…)

このスクリプトをいじれば、他のファイルを検索することにも使えますので、色々応用できます。

まずはプロジェクトディレクトリを取るという、最も必要な機能が出来ました。次にこのスクリプトを呼び出す場所を決めていきましょう。



シーンを開く手順

Mayaでシーンを開くときに何が起きているかおさらいしてみましょう。

最も基本的な方法は「File > Open Scene…」で開くことです。しかしステータスラインにシーンを開くアイコンがあったり、「Recent Files」にあるシーン履歴から開けたりもします。



こうなると単純に「Open Scene」のスクリプトだけに「親切な店員システム」を追加しても上手く動かないことになります。

…とりあえずは「File > Open Scene…」で何が起きているかたどってみましょう。

Mayaのメインメニューは全てHotkey Editorを見てみれば、何を実行しているかわかります。



どうやら「projectViewer Open」というスクリプトを実行しているようです。早速「whatIs」コマンドで調べてみましょう。



「C:/Program Files/Autodesk/Maya2014/scripts/others/projectViewer.mel」にあるスクリプトのようです。

projectViewer.melは「Open」「Import」「Save」などファイルにまつわる操作をするときに表示される「ファイルダイアログ」の処理を行っています。

コード内の次のあたりでは「fileDialog2」コマンドを実行して、ダイアログを表示するようになっています。この辺をいじればダイアログをカスタマイズできそうですね。



ダイアログでファイルが選択されると「performFileAction」というのが実行されます。これも「whatIs」で調べてみると、
「C:\Program Files\Autodesk\Maya2014\scripts\others\performFileAction.mel」
にあるスクリプトであることがわかります。

「performFileAction.mel」は「Open」「Save」「Import」等を「実際に行う」スクリプトです。

コードを調べると、シーンを新しく開く前に「saveChanges」なるものを実行していることに気づきます。



更にこれを調べてみると、
「C:\Program Files\Autodesk\Maya2014\scripts\others\saveChanges.mel」
であることがわかります。

中を見てみましょう。




このスクリプトはシーンが更新されているかどうかチェック(「file –q -amf」)して、確認ダイアログを表示するスクリプトです。
「全てがいい感じ」なら1を返すようです。なかなかコメントがイカしてますね!

スクリプトがスクリプトを呼び、たらい回しにされている様に感じられるかもしれませんが、まとめると次のようになり、しっかり機能別にスクリプトが分けてあることがわかります。

「projectViewer.mel」 → ファイル選択ダイアログを処理
「performFileAction.mel」 → 実際のファイル操作を処理
「saveChanges.mel」 → シーンが更新されてないか破棄する前にチェック




まとめ

今回はまずファイルパスを元に、プロジェクトのディレクトリを見つけ出すスクリプトを用意しました。

次にMayaでシーンを開くときの流れについて見てきました。

次回はいよいよMayaのスクリプトを改変して、自動セットプロジェクト機能を追加していきます。


Maya Learning Channel
製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。