Maya外の情報を利用したUIの変形

クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームの城作りの名人といえば加藤清正、戦国大好き人間の中林です。

今回はMayaの簡単なUIを外部情報を利用して変えてみた話です。

そもそものキッカケは?

アーティストからMayaでテクスチャのみの衣装替えが面倒だという相談がキッカケです。
テクスチャの衣装替えは大抵はテクスチャのファイルパスかファイル名の一部を変更するだけで済むのですが、それでも仕様によってはパーツごとにカラーやノーマル、マスクなど様々なテクスチャがあって、変更だけでも10枚を超す場合もあります。僕も昔は根性でやってたけど、あまり楽しい作業ではありません。
それで手作業の変更が面倒なのでテクスチャ毎にシーンデータを作成して読み替える方法をとる場合もありますが、シーンデータの読み替えも時間がかかるのであまり効率的ではありません。
今回はそんなテクスチャ簡単に変更する方法の話、ではありません!!
テクスチャの入れ替えはls -type "file"をfor文で回す。getAttrでファイルパスを取得して、置換してからSetAttrで差し替える。だけなので特に書くことはありません。

今回の問題はキャラによって衣装の数が違う

この辺は仕様に寄りますが、頼まれたプロジェクトでは1色~9色でいわゆるレア度で衣装の有無が変わる感じになってました。
キャラAはカラー1,3,7の3色、キャラBはカラー1,2,4,5,6の5色、キャラCは7色の予定だけど作業中で4色しかない。という感じです。


こだわりが無ければこんな感じの全衣装分のボタンを用意すればいいけど、これだとキャラAのように3色だった場合に半分以上が外れボタンで、全ての衣装の番号を覚えてる人も少ないので、外れボタンを押すたびに「その衣装はありません!!」と表示されるのはストレスが溜まります。

数に合わせてボタンの数も変えれば良いじゃん

単純な話ですが衣装の数に合わせてボタンの数を変えれば外れボタンを押すことはなくなります。


なので、ボタンの数を変えればいいじゃん、自動的に!!
あれ、いつの間にか自動的にという言葉が増えてる……。
では、自動的ボタンの数を変えるメニュー作った方法例を紹介します。

※今回の仮仕様
・setProjectがしっかりしていてsourceimagesフォルダ内に全衣装テクスチャが入っている。
・全テクスチャが衣装ごとに変わる(肌などの変わらない部分も全て別テクスチャ)
・テクスチャファイル名はどの衣装もレア度の差分はあるけど衣装番号の同じ6,7文字目になってます。

※テクスチャファイル名イメージ
 CosUR01_body.png
 CosUR01_arm.png
 AcsUR01_head.png
 CosSR03_body.png
 CosSR03_arm.png
 AcsSR03_head.png
 CosNO07_body.png
 CosNO07_arm.png
 AcsNO07_head.png

実際にはゲームのテクスチャはパーツやノーマル、マスクなど沢山ありますが仮名にそんなに行数を取ってもなんなのでこの辺で止めます。
当然、使っているテクスチャの情報はMaya内部にはあるけど、使っていないテクスチャの情報はありません。でも、workspaceのあるフォルダからsourceimagesフォルダを探してテクスチャリストという外部情報を取得すれば何とかなります。

●サンプルコード

{
    string $numList[];
// workspaceフォルダからsourceimagesフォルダを見つけて、中のpngファイル一覧を取得 string $path = <font color="aqua">workspace</font> -q -rd; for($file in <font color="aqua">getFileList</font> -folder ($path + <font color="yellow">"sourceimages"</font>) -fs <font color="yellow">"*.png"</font>){ // ファイル名から番号情報を取得 $file = startString($file, 7); // 前から7文字目まで取得 $file = endString($file, 2);  // 後ろ2文字を取得で番号 // 新しい番号ならリストに追加 if(!stringArrayContains($file, $numList)){ $numList[size($numList)] = $file; } }
window -width 150; columnLayout -adjustableColumn true; // 番号からボタンを配置 for($num in $numList){ button -l ("Button " + $num ) -c ""; } showWindow; }

UIを毎回消すとかボタンを押した処理を省きますがテクスチャ名に沿った数だけのボタンができます。テクスチャファイル名の一覧を取得して、テクスチャ名から必要な数値を取り出して、for文でボタンを作るだけだから単純で簡単です。
更に今選んでいる衣装のボタンをenableにできればベストと思われます。
ツールとしてもちろんボタンを最大数作るのも有りですが、少ない手間で使うアーティストの不満が解消されるなら状況に応じてUIが変わるように作るのも有りだと思います。

閑話休題

我々COYOTEでは過去に似たようなテクスチャを入れ替えるツールで拡張子をpsdとpng等の他画像に切り替えるツールを作ることが多くありました。
理由はテクスチャはPhotoshopでレイヤー情報を残しつつ2倍の解像度で作成することが多いためpsdで作業します。これをMayaで確認をする毎に半分のサイズに変更してファイル名の拡張子を打ち直すのが面倒なので、作業途中はpsdのまま保存して確認をするためです。
しかし、Mayaではpsd専用ノードがあって他の画像ファイルと違います。その為、拡張子だけ変えれば大丈夫だと思っていると痛い目を見ます。というか、僕がMayaが落ちる不具合で何度も痛い目を見ました。
でも、最近この手の相談は無くなりました。無くなった理由に関しては、そのうち別のブログで紹介をしたいと思います。

MayaのUIだからと情報を限定する必要はない

慣れないとMayaのツールだからMaya内からの情報しか使ってはいけないと勘違いしがちですがそんなことはありません。利用可能であればフォルダ内のファイル情報など外部の情報をいくらでも使って構いません。
Melでは応用範囲は狭いですが、Pythonを使うと一気に広がります。COYOTEではプロジェクト管理にRedmineを使ってますが、アーティストがチケットのステータス変更の度にHPを開くのが面倒と相談を受けて、Maya上のUIでメニューを作ってステータス変更をできるツールを作成したこともあります。このツールも当然、チケットの数や内容という外部情報によって変化していました。
状況に合わせてUIを変える事は、余計な情報が無くなって見やすくなる場合もあるので試してみる価値は大きいです。

Author: nakabayashinobukazu