CG系

mayaのリグコントローラーをmelで作る【ソース公開中】

今回は、mayaで使うリギングのサポートツールを作っていきます。

リグの形をワンクリックで作れるやつです。

実装した機能や感じたことを備忘録的にまとめました。

最後にはソースコードを全文載せてますので、何かしらの参考にして頂けると幸いです。

参考ツールの紹介

今回のツールは無料で公開されてる『rig101 Wire Controllers』を元に作ってます

たしか、こちらのリグの本にダウンロード先のURLが載ってました。

本の情報なので、URLを載せるのは止めときます。

リグコントローラーツールの特徴4選

  • 直感的にリグの形が分かる
  • よく使う形とそうでない形に分けた
  • 選択したノードにスナップ・その数だけリグを作る
  • グリッドレイアウトで簡単キレイ
  • 参考ツールにあった不要な形は除いた

このツールの特徴は以上の5つです。

順番に解説していきます。

【ボタンを画像化】直感的にリグの形が分かる【選択コストの削減】

参考ツールはテキストでリグの形が書いてあります。

しかし、わざわざ文字を読んで、「あ~squareって書いてあるから四角ね~」、、、

って、英語に疎い私はそんな風に変換してられません。

みっつ

リグを作るたびに、
『日本語に置き換えて→形を想像し→ボタンを押す…』
毎回この工程をやってたら、キャラのアニメーション作る前にプロジェクト終わりますよ…

なるべく判断に時間を取られないように、ツールのUIは直感的に分かる作りにしました。

これなら英語が苦手な私のような人にも、簡単に使いこなすことができます。

よく使う形とそうじゃない形をタブで分けた

リグの形も頻出なものと、そうでないものがあります。

タブを分けることで、「あの形はどこだっけ~」といった判断の時間を減らしてます。

極力、使い手が迷わないUI設計を心掛けました。

選択したノードにスナップ・その数だけリグを作る

参考ツールでは、原点にしかリグが作られない仕様でした。

みっつ

ジョイントを選択し、ツールのボタンを押しても、リグが原点に作られるのは使いにくいですね…

マウスを移動させてる間にプロジェクトが終わります。

そう考えたので、選択箇所にスナップするように作りました。

加えて、選択したノードの数だけリグが作られるようにしてます。

指のリグとか作ってるときに、コピペするのが面倒だったので実装しました。

グリッドレイアウトで簡単でキレイ

//====================================
// === レイアウトの記述例 ==================


string $tabs = `tabLayout -innerMarginWidth 1 -innerMarginHeight 1`; 
string $grid_01 = `gridLayout -numberOfColumns 6 -cellWidthHeight 50 50`;

//====================================
//====================================

レイアウトには gridLayout を使うことで、簡単でキレイなUIを実現してます。

たったの2つのフラグで見た目を調整できるので、保守管理も楽です。

(正直、columnとrowって苦手なんですよね…)

参考ツールにあった不要な形は除いた

正直、使うタイミングが不明なものが多かったので、個人的に不要と感じた形は削りました。

リグの形はシンプルなやつが好みですね。

【苦労話】アイコン作成は地味に大変

UIのアイコンは自作したのですが、これが意外に骨の折れる作業でした(笑)

トータル3時間くらいアイコン作ってましたね…

レイヤ名のリネームも、途中からやってません(笑)

今回のツールで勉強になった点

  • 引数や戻り値の使い方
  • switchのcaseに文字列を渡す時の記法

今回は以上の2点が勉強になりました。

引数や戻り値の使い方【基本が大事】

//====================================
//====================================

global proc main_KK_MakeController(string $mode){
    //選択したノードの位置情報をとってくる
    float $pos[];
    float $rot[];
    int $i;
    string $node[],$ctrName;
    
    $node = `ls -sl`;
    
    //選択してるノードがあるかを判定
    if(0 == size($node)){
        $ctrName = `KK_MakeController($mode)`;//コントローラーを作りつつ、コントローラーの名前を取得
    }
    else{
        for($i=0;$i<size($node);$i++){
            $ctrName = `KK_MakeController($mode)`;
        
            $pos = `xform  -q -t -ws $node[$i]`;
            $rot = `xform -q -ro -ws $node[$i]`;
            
            xform -t $pos[0] $pos $pos $ctrName;//コントローラーの名前を参照して、選択したノードの場所へスナップ
            rotate $rot[0] $rot $rot $ctrName;   
        }

//====================================
//====================================

KK_MakeController($mode) がカーブでリグを作る関数になっており、$modeの値によって作られるリグが変わるようになってます。

KK_MakeController(KK_CUBE) なら、立方体のリグが作られます。

KK_MakeController($mode) の戻り値は、作ったリグの名前を返し、その名前を元にスナップ処理をしてます。

関数をまたぐ場合、今までならグローバル変数を使ってました。

しかし、それだと記述が多くなるし、もっとスマートな方法はないかと考えたとき、プログラムの原点にたどり着きましたね。

みっつ

関数の答えを取得すればいいじゃなか!って…

まぁゴリゴリのプログラマーから言わせたら、当たり前じゃんって感じですが…

戻り値ってあんまり理解してなくて、うまく使えてなかったですが、今回のように使えばコードを簡略化できるっていうのを学べました。

関数に戻り値がある場合は、型を指定する必要がある

//==================================
//=== 戻り値の記述例 ====================

global proc string KK_MakeController(string $TYPE )

//====================================
//====================================

melは戻り値を返す場合、変数の型を指定しないといけないってのも勉強になりました。

Pythonならそんなことせずとも、戻り値は返せるので、その感覚でやってたら落とし穴にはまります…

この辺も知れたのは良い経験でした。

switchのcaseに文字列渡すときの書き方

//=============================
//==== リグを作る関数 ==============

global proc string KK_MakeController(string $TYPE ){
    string $cv;
    switch($TYPE){
        
    case "KK_CUBE":
    $cv = `curve -d 1 -p 0.5 0.5 0.5 -p 0.5 0.5 -0.5 -p -0.5 0.5 -0.5 -p -0.5 -0.5 -0.5 -p 0.5 -0.5 -0.5 
            -p 0.5 0.5 -0.5 -p -0.5 0.5 -0.5 -p -0.5 0.5 0.5 -p 0.5 0.5 0.5 -p 0.5 -0.5 0.5 -p 0.5 -0.5 -0.5 
            -p -0.5 -0.5 -0.5 -p -0.5 -0.5 0.5 -p 0.5 -0.5 0.5 -p -0.5 -0.5 0.5 -p -0.5 0.5 0.5 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 
            -n "controller1"` ;
    break;

//==== 省略 ==================
//==========================

}

//=============================
//====リグを作ってスナップ処理する関数 ==

global proc main_KK_MakeController(string $mode){
    //選択したやつの位置情報をとってくる
    float $pos[];
    float $rot[];
    int $i;
    string $node[],$ctrName;
    
    $node = `ls -sl`;
    
    //選択してるノードがあるかを判定
    if(0 == size($node)){
        $ctrName = `KK_MakeController($mode)`;//コントローラーを作りつつ、コントローラーの名前を取得

//=============================
//=============================

iconTextButtoncommand フラグに、switch文の分岐条件をそのまま書いてます。

iconTextButton -c "main_KK_MakeController KK_CUBE" と書けば、 KK_CUBE を引数と認識してくれるので、そのままメインの関数に渡してます。

こんな書き方ができるのは知らなったので、汎用性が高いテクニックだと感じました。

みっつ

言われてみたら納得なんですが、意外と思いつかなかったですね…

【今後の改善】UIの見直しとPythonで書き直し

  • main部分のUI調整
  • Pythonで書き直し

作り終わって感じたことは以上の2点です。

順番に解説していきます。

main部分のUIが不細工なので、調整する方法を考える

グリッドレイアウトで作ってる弊害なのか、ウィンドサイズがサブメニューの大きさに依存するようになってます。

このままでも使えないことはないのですが、この隙間はどうも不格好ですね…

今考えてるのは、プルダウンメニューの採用ですかね。

タブで分けるのではなく、プルダウンで折りたためるようにした方が良いのかな~って考えてます。

そもそもPythonで作り直す

そもそもですが、melではなくPythonで作り直そうかと考えてます(今更…)

理由はリグの追加に対応するためです。

リグの形は curvepoint フラグを使い、CVを動かして整えてます。

// ======================
// ======================

curve -d 1 -p 0.5 0.5 0.5 -p 0.5 0.5 -0.5 -p -0.5 0.5 -0.5;

// ======================
// ======================

ご覧の通り、 -point ってフラグをCVの数だけ書かないといけないんですよ…

しかし、Pythonなら、

# ======================
# ======================

cmds.curve(d=1,p=([0.5,0.5,0.5],[0.5,0.5,-0.5],[-0.5,0.5,-0.5]))

# ======================
# ======================

このような感じで、 point をまとめて書く仕様になってます。

この記述が肝です。

作りたい形のCVを取得する方法

例えば、画像のような球状の形をスクリプトで作ろうとする場合。

■melの場合

// === getAttrでCVのポジションを取得 ==========
// ====================================


string $nodeList[];
string $ctrName;
$nodeList =`ls -sl`;
$ctrName = $nodeList[0] + ".cv[*]";
getAttr $ctrName;

// 結果: 0 0 1 0 0.5 0.866025 0 0.866025 0.5 0 1 0 0 0.866025 -0.5 0 0.5 -0.866025 0 0 -1 0 -0.5 -0.866025 0 -0.866025 -0.5 0 -1 0 0 -0.866025 0.5 0 -0.5 0.866025 0 0 1 0.707107 0 0.707107 1 0 0 0.707107 0 -0.707107 0 0 -1 -0.707107 0 -0.707107 -1 0 0 -0.866025 0.5 0 -0.5 0.866025 0 0 1 0 0.5 0.866025 0 0.866025 0.5 0 1 0 0 0.866025 -0.5 0 0.5 -0.866025 0 0 -1 0 -0.5 -0.866025 0 -0.866025 -0.5 0 -1 0 0 -0.707107 0 0.707107 0 0 1 //

// ====================================
// ====================================

■Python

# === getAttrでCVのポジションを取得 ======
# =================================

cmds.getAttr((cmds.ls(sl=1)[0])+".cv[*]")

#結果: [(0.0, 0.0, 1.0), (0.0, 0.5, 0.866025), (0.0, 0.866025, 0.5), (0.0, 1.0, 0.0), (0.0, 0.866025, -0.5), (0.0, 0.5, -0.866025), (0.0, 0.0, -1.0), (0.0, -0.5, -0.866025), (0.0, -0.866025, -0.5), (0.0, -1.0, 0.0), (0.0, -0.866025, 0.5), (0.0, -0.5, 0.866025), (0.0, 0.0, 1.0), (0.707107, 0.0, 0.707107), (1.0, 0.0, 0.0), (0.707107, 0.0, -0.707107), (0.0, 0.0, -1.0), (-0.707107, 0.0, -0.707107), (-1.0, 0.0, 0.0), (-0.866025, 0.5, 0.0), (-0.5, 0.866025, 0.0), (0.0, 1.0, 0.0), (0.5, 0.866025, 0.0), (0.866025, 0.5, 0.0), (1.0, 0.0, 0.0), (0.866025, -0.5, 0.0), (0.5, -0.866025, 0.0), (0.0, -1.0, 0.0), (-0.5, -0.866025, 0.0), (-0.866025, -0.5, 0.0), (-1.0, 0.0, 0.0), (-0.707107, 0.0, 0.707107), (0.0, 0.0, 1.0)] #

# =================================
# =================================

取得した結果、

melは0 0 1…のようにただの配列で返ってきますが、

Pythonなら、[(0.0,0.0,0.1),(0.0,0.5,0.886025)…]のようタプルで返ってきます。

カーブのスクリプトを書く場合、Pythonならこの結果をコピーするだけでOKです。

melだったら、わざわざ間に-p書いて、、、

ってとんでもない工数が発生しますからね…

みっつ

拡張性、保守性、そういう意味でもPythonで記述するべきかと、今更ながらに思います…

コントローラーツールまとめ【シンプルisBEST】

コントローラーツールまとめ
  • UIは直感的に分かるようにする
  • 戻り値や引数を活用しコードを簡略化する
  • 拡張性・保守性を考えるとPythonで書いた方が良い

ツールにしろリグにしろ、ユーザーが使いやすいのが正解かと思います。

視覚的に分かりやすい作りにして、迷ってる時間を1秒でもなくせたら、その分コスト削減になるのではないでしょうか。

また、melは変数の宣言やセミコロンが必須とか…

色々と面倒だなぁと、改めて感じました。

ツール開発後の取り回しを考えると、Pythonで書いた方が良いと思います。

ソースコードの紹介

ソースコードを紹介します。

改編・再配布は構いませんが、全て自己責任でお願いします。

データが消えても責任は取れないので悪しからず…

※ボタンのアイコン画像は自分で用意してください。

global proc string KK_MakeController(string $TYPE ){
    string $cv;
    switch($TYPE){
        
    case "KK_CUBE":
    $cv = `curve -d 1 -p 0.5 0.5 0.5 -p 0.5 0.5 -0.5 -p -0.5 0.5 -0.5 -p -0.5 -0.5 -0.5 -p 0.5 -0.5 -0.5 
            -p 0.5 0.5 -0.5 -p -0.5 0.5 -0.5 -p -0.5 0.5 0.5 -p 0.5 0.5 0.5 -p 0.5 -0.5 0.5 -p 0.5 -0.5 -0.5 
            -p -0.5 -0.5 -0.5 -p -0.5 -0.5 0.5 -p 0.5 -0.5 0.5 -p -0.5 -0.5 0.5 -p -0.5 0.5 0.5 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 
            -n "controller1"` ;
    break;
    
    case "KK_CONE":
    $cv = `curve -d 1 -p 0.5 0 0.866025 -p -0.5 0 0.866025 -p 0 2 0 -p 0.5 0 0.866025 
            -p 1 0 0 -p 0 2 0 -p 0.5 0 -0.866025 -p 1 0 0 -p 0 2 0 -p -0.5 0 -0.866026 
            -p 0.5 0 -0.866025 -p 0 2 0 -p -1 0 -1.5885e-007 -p -0.5 0 -0.866026 -p 0 2 0 -p -0.5 0 0.866025 
            -p -1 0 -1.5885e-007 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 
            -n "controller1"`;
    break;
    
    case "KK_Ball" :
    $cv = `curve -d 1 -p 0 0 1 -p 0 0.5 0.866025 -p 0 0.866025 0.5 -p 0 1 0 
            -p 0 0.866025 -0.5 -p 0 0.5 -0.866025 -p 0 0 -1 -p 0 -0.5 -0.866025 
            -p 0 -0.866025 -0.5 -p 0 -1 0 -p 0 -0.866025 0.5 -p 0 -0.5 0.866025 
            -p 0 0 1 -p 0.707107 0 0.707107 -p 1 0 0 -p 0.707107 0 -0.707107 -p 0 0 -1 
            -p -0.707107 0 -0.707107 -p -1 0 0 -p -0.866025 0.5 0 -p -0.5 0.866025 0 
            -p 0 1 0 -p 0.5 0.866025 0 -p 0.866025 0.5 0 -p 1 0 0 -p 0.866025 -0.5 0 
            -p 0.5 -0.866025 0 -p 0 -1 0 -p -0.5 -0.866025 0 -p -0.866025 -0.5 0 
            -p -1 0 0 -p -0.707107 0 0.707107 -p 0 0 1 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 
            -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 
            -k 24 -k 25 -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 
            -n "controller1"`;
    break ;
    
    case "KK_FourArrow" :
    $cv = `curve -d 1 -p 0 0 -1.1025 -p -0.33 0 -0.6075 -p -0.165 0 -0.6075 -p -0.165 0 -0.165 
            -p -0.6075 0 -0.165 -p -0.6075 0 -0.33 -p -1.1025 0 0 -p -0.6075 0 0.33 
            -p -0.6075 0 0.165 -p -0.165 0 0.165 -p -0.165 0 0.6075 -p -0.33 0 0.6075 
            -p 0 0 1.1025 -p 0.33 0 0.6075 -p 0.165 0 0.6075 -p 0.165 0 0.165 -p 0.6075 0 0.165 
            -p 0.6075 0 0.33 -p 1.1025 0 0 -p 0.6075 0 -0.33 -p 0.6075 0 -0.165 -p 0.165 0 -0.165 
            -p 0.165 0 -0.6075 -p 0.33 0 -0.6075 -p 0 0 -1.1025 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 
            -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 -k 24 
            -n "controller1"`;
    break ;
    
    case "KK_ArrowSingle" :
    $cv = `curve -d 1 -p 0 0 -1.32 -p -0.99 0 0 -p -0.33 0 0 -p -0.33 0 0.99 -p 0.33 0 0.99 
            -p 0.33 0 0 -p 0.99 0 0 -p 0 0 -1.32 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 
            -n "controller1"`;
    break ;

    
    case "KK_Square" :
    $cv = `curve -d 1 -p 1 0 -1 -p -1 0 -1 -p -1 0 1 -p 1 0 1 -p 1 0 -1 
            -k 0 -k 1 -k 2 -k 3 -k 4 
            -n "controller1"`;
    break ;
    //----------mainここまで------------------//
    
    case "KK_Circle":
    string $circle[] = `circle -ch on -o on -nr 0 1 0 -r 1 
            -n "controller1"`;
    $cv = $circle[0];
     break ; 
        
    case "KK_Triangle":
    $cv = `curve -d 1 -p 1 0 -0.6 -p 0 0 1.132 -p -1 0 -0.6 -p 1 0 -0.6 
            -k 0 -k 1 -k 2 -k 3 
            -n "controller1"`;
	break ;
    
    case "KK_Cross" :
    $cv = `curve -d 1 -p -0.5 0 0.5 -p -2 0 0.5 -p -2 0 -0.5 -p -0.5 0 -0.5 
            -p -0.5 0 -2 -p 0.5 0 -2 -p 0.5 0 -0.5 -p 2 0 -0.5 -p 2 0 0.5 
            -p 0.5 0 0.5 -p 0.5 0 2 -p -0.5 0 2 -p -0.5 0 0.5 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 
            -k 11 -k 12  
            -n "controller1"`;
    break ;
    
    
    case "KK_Pentagon" :      
    $cv = `curve-d 1 -p 0.00495679 0 -0.850034 -p 0.807952 0 -0.259136 
            -p 0.499049 0 0.687543 -p -0.498432 0 0.687681 -p -0.807449 0 -0.263375 
            -p 0.00495679 0 -0.850034 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 
            -n "controller1"`;
    break ; 

    case "KK_Hexagon" :
    $cv = `curve -d 1 -p -1 0 0 -p -0.5 0 -0.866025 -p 0.5 0 -0.866025 -p 1 0 0 
            -p 0.5 0 0.866025 -p -0.5 0 0.866025 -p -1 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 
            -n "controller1"`;
    break ;
    
    case "KK_Triangular" :
    $cv = `curve -d 1 -p 0 1 0 -p 1 0 -1 -p -1 0 -1 -p 0 1 0 -p -1 0 1 -p 1 0 1 -p 0 1 0 
            -p 1 0 -1 -p 1 0 1 -p -1 0 1 -p -1 0 -1 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 
            -n "controller1"`;
    break ;
    
    case "KK_Spear" :
    $cv = `curve -d 1 -p 0 2 0 -p 0 0 2 -p 0 -2 0 -p 0 0 -2 -p 0 2 0 -p 0 -2 0 -p 0 0 0 
            -p 0 0 2 -p 0 0 -2 -p 2 0 0 -p 0 0 2 -p -2 0 0 -p 0 0 -2 -p 0 0 2 -p 0 0 0 
            -p -2 0 0 -p 2 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 
            -k 14 -k 15 -k 16 
            -n "controller1"`;
    break ;
    
    case "KK_Hexagon2" :
    $cv = `curve -d 1 -p -0.5 1 0.866025 -p 0.5 1 0.866025 -p 0.5 -1 0.866025 -p 1 -1 0 -p 1 1 0 
            -p 0.5 1 -0.866025 -p 0.5 -1 -0.866025 -p -0.5 -1 -0.866026 -p -0.5 1 -0.866026 
            -p -1 1 -1.5885e-007 -p -1 -1 -1.5885e-007 -p -0.5 -1 0.866025 -p -0.5 1 0.866025 
            -p -1 1 -1.5885e-007 -p -0.5 1 -0.866026 -p 0.5 1 -0.866025 -p 1 1 0 -p 0.5 1 0.866025 
            -p 0.5 -1 0.866025 -p -0.5 -1 0.866025 -p -1 -1 -1.5885e-007 -p -0.5 -1 -0.866026 
            -p 0.5 -1 -0.866025 -p 1 -1 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 
            -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 
            -n "controller1"`;
    break ;
    
    case "KK_001Dia" :
    $cv = `curve -d 1 -p 0 1 0 -p 1 0 0 -p 0 0 1 -p -1 0 0 -p 0 0 -1 -p 0 1 0 -p 0 0 1 -p 0 -1 0 -p 0 0 -1 
            -p 1 0 0 -p 0 1 0 -p -1 0 0 -p 0 -1 0 -p 1 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 
            -n "controller1"`;
    break ;
    
    //-------矢印系----------//
    case "KK_DirSingleThin" :
    $cv = `curve -d 1 -p 0 0 1 -p 0 0 -1 -p -1 0 0 -p 0 0 -1 -p 1 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 
            -n "controller1"`;
    break ;
    
    case "KK_DirDoubleThin" :
    $cv = `curve -d 1 -p 1 0 1 -p 0 0 2 -p -1 0 1 -p 0 0 2 -p 0 0 -2 -p -1 0 -1 -p 0 0 -2 -p 1 0 -1 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 
            -n "controller1"`;
    break ;
    
    case "KK_DirDoubleFat" :
    $cv = `curve -d 1 -p 0 0 -1.35 -p -0.66 0 -0.36 -p -0.33 0 -0.36 -p -0.33 0 0.36 -p -0.66 0 0.36 -p 0 0 1.35 
            -p 0.66 0 0.36 -p 0.33 0 0.36 -p 0.33 0 -0.36 -p 0.66 0 -0.36 -p 0 0 -1.35 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 
            -n "controller1"`;
    break ;
    
    
    case "KK_DirFourThin" :
    $cv = `curve -d 1 -p 1.25 0 -0.5 -p 1.75 0 0 -p 1.25 0 0.5 -p 1.75 0 0 -p -1.75 0 0 -p -1.25 0 -0.5 -p -1.75 0 0 
            -p -1.25 0 0.5 -p -1.75 0 0 -p 0 0 0 -p 0 0 1.75 -p -0.5 0 1.25 -p 0 0 1.75 -p 0.5 0 1.25 -p 0 0 1.75 
            -p 0 0 -1.75 -p 0.5 0 -1.25 -p 0 0 -1.75 -p -0.5 0 -1.25 -p 0 0 -1.75 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 
            -k 18 -k 19 
            -n "controller1"`;
    break ;
    
    case "KK_DirFourFat" :
    $cv = `curve -d 1 -p 0 0 -1.1025 -p -0.33 0 -0.6075 -p -0.165 0 -0.6075 -p -0.165 0 -0.165 -p -0.6075 0 -0.165 -p -0.6075 0 -0.33 
            -p -1.1025 0 0 -p -0.6075 0 0.33 -p -0.6075 0 0.165 -p -0.165 0 0.165 -p -0.165 0 0.6075 -p -0.33 0 0.6075 
            -p 0 0 1.1025 -p 0.33 0 0.6075 -p 0.165 0 0.6075 -p 0.165 0 0.165 -p 0.6075 0 0.165 -p 0.6075 0 0.33 -p 1.1025 0 0 
            -p 0.6075 0 -0.33 -p 0.6075 0 -0.165 -p 0.165 0 -0.165 -p 0.165 0 -0.6075 -p 0.33 0 -0.6075 -p 0 0 -1.1025 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 
            -k 21 -k 22 -k 23 -k 24 
            -n "controller1"`;
    break ;
    
    
    case "KK_DirEight" :
    $cv = `curve -d 1 -p -1.8975 0 0 -p -1.4025 0 0.37125 -p -1.4025 0 0.12375 -p -0.380966 0 0.157801 -p -1.079222 0 0.904213 
            -p -1.254231 0 0.729204 -p -1.341735 0 1.341735 -p -0.729204 0 1.254231 -p -0.904213 0 1.079222 -p -0.157801 0 0.380966 
            -p -0.12375 0 1.4025 -p -0.37125 0 1.4025 -p 0 0 1.8975 -p 0.37125 0 1.4025 -p 0.12375 0 1.4025 -p 0.157801 0 0.380966 
            -p 0.904213 0 1.079222 -p 0.729204 0 1.254231 -p 1.341735 0 1.341735 -p 1.254231 0 0.729204 -p 1.079222 0 0.904213 
            -p 0.380966 0 0.157801 -p 1.4025 0 0.12375 -p 1.4025 0 0.37125 -p 1.8975 0 0 -p 1.4025 0 -0.37125 -p 1.4025 0 -0.12375 
            -p 0.380966 0 -0.157801 -p 1.079222 0 -0.904213 -p 1.254231 0 -0.729204 -p 1.341735 0 -1.341735 -p 0.729204 0 -1.254231 
            -p 0.904213 0 -1.079222 -p 0.157801 0 -0.380966 -p 0.12375 0 -1.4025 -p 0.37125 0 -1.4025 -p 0 0 -1.8975 -p -0.37125 0 -1.4025 
            -p -0.12375 0 -1.4025 -p -0.157801 0 -0.380966 -p -0.904213 0 -1.079222 -p -0.729204 0 -1.254231 -p -1.341735 0 -1.341735 
            -p -1.254231 0 -0.729204 -p -1.079222 0 -0.904213 -p -0.380966 0 -0.157801 -p -1.4025 0 -0.12375 -p -1.4025 0 -0.37125 -p -1.8975 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 
            -k 24 -k 25 -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 -k 33 -k 34 -k 35 -k 36 -k 37 -k 38 -k 39 -k 40 -k 41 -k 42 -k 43 -k 44 -k 45 
            -k 46 -k 47 -k 48 
            -n "controller1"`;
    break ;
    
    case "KK_Rot90Thin" :
    $cv = `curve -d 1 -p -1.026019 0 0 -p -0.947961 0 0.392646 -p -0.725413 0 0.725516 -p -0.393028 0 0.947932 -p -0.13006 0 1 
            -p 0.0107043 0 1.001418 -p -0.339542 0 0.5442 -p 0.0107043 0 1.001418 -p -0.446514 0 1.351664 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 
            -n "controller1"`;
    break ;

    case "KK_Rot90Fat" :
    $cv = `curve -d 1 -p -0.923366 0 0 -p -1.128672 0 0 -p -1.042702 0 0.431934 -p -0.798049 0 0.798033 -p -0.560906 0 0.946236 
            -p -0.975917 0 1.036319 -p -0.124602 0 1.096506 -p -0.537718 0 0.349716 -p -0.440781 0 0.788659 -p -0.652776 0 0.652998 
            -p -0.853221 0 0.353358 -p -0.923366 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 
            -n "controller1"`;
    break ;

    case "KK_Rot180Thin" :
    $cv = `curve -d 1 -p -0.446514 0 -1.351664 -p 0.0107043 0 -1.001418 -p -0.339542 0 -0.5442 -p 0.0107043 0 -1.001418 -p -0.13006 0 -1 
            -p -0.393028 0 -0.947932 -p -0.725413 0 -0.725516 -p -0.947961 0 -0.392646 -p -1.026019 0 0 -p -0.947961 0 0.392646 
            -p -0.725413 0 0.725516 -p -0.393028 0 0.947932 -p -0.13006 0 1 -p 0 0 1 -p -0.339542 0 0.5442 -p 0 0 1 
            -p -0.446514 0 1.351664 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 
            -n "controller1"`;
    break ;

    case "KK_Rot180Fat" :
    $cv = `curve -d 1 -p -0.124602 0 -1.096506 -p -0.975917 0 -1.036319 -p -0.559059 0 -0.944259 -p -0.798049 0 -0.798033 -p -1.042702 0 -0.431934 
            -p -1.128672 0 0 -p -1.042702 0 0.431934 -p -0.798049 0 0.798033 -p -0.560906 0 0.946236 -p -0.975917 0 1.036319 
            -p -0.124602 0 1.096506 -p -0.537718 0 0.349716 -p -0.440781 0 0.788659 -p -0.652776 0 0.652998 -p -0.853221 0 0.353358 
            -p -0.923366 0 0 -p -0.853221 0 -0.353358 -p -0.652776 0 -0.652998 -p -0.439199 0 -0.785581 -p -0.537718 0 -0.349716 
            -p -0.124602 0 -1.096506 -k 0 
            -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 
            -n "controller1"`;
    break ;
    
    case "KK_ArrowsOnBall" :
    $cv = `curve -d 1 -p 0 0.35 -1.001567 -p -0.336638 0.677886 -0.751175 -p -0.0959835 0.677886 -0.751175 -p -0.0959835 0.850458 -0.500783 
            -p -0.0959835 0.954001 -0.0987656 -p -0.500783 0.850458 -0.0987656 -p -0.751175 0.677886 -0.0987656 -p -0.751175 0.677886 -0.336638 
            -p -1.001567 0.35 0 -p -0.751175 0.677886 0.336638 -p -0.751175 0.677886 0.0987656 -p -0.500783 0.850458 0.0987656 -p -0.0959835 0.954001 0.0987656 
            -p -0.0959835 0.850458 0.500783 -p -0.0959835 0.677886 0.751175 -p -0.336638 0.677886 0.751175 -p 0 0.35 1.001567 -p 0.336638 0.677886 0.751175 
            -p 0.0959835 0.677886 0.751175 -p 0.0959835 0.850458 0.500783 -p 0.0959835 0.954001 0.0987656 -p 0.500783 0.850458 0.0987656 -p 0.751175 0.677886 0.0987656 
            -p 0.751175 0.677886 0.336638 -p 1.001567 0.35 0 -p 0.751175 0.677886 -0.336638 -p 0.751175 0.677886 -0.0987656 -p 0.500783 0.850458 -0.0987656 
            -p 0.0959835 0.954001 -0.0987656 -p 0.0959835 0.850458 -0.500783 -p 0.0959835 0.677886 -0.751175 -p 0.336638 0.677886 -0.751175 -p 0 0.35 -1.001567 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 -k 24 -k 25 
            -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 
            -n "controller1"`;
    break ;
      
    case "KK_Cog":
    $cv=`curve -d 3 -p 7.06316e-009 0 -1 -p 0.104714 0 -0.990425 -p 0.314142 0 -0.971274 -p 0.597534 0 -0.821244 -p 0.822435 0 -0.597853 
            -p 0.96683 0 -0.314057 -p 1.016585 0 -2.28604e-005 -p 0.96683 0 0.314148 -p 0.822435 0 0.597532 -p 0.597534 0 0.822435 -p 0.314142 0 0.96683 
            -p 1.22886e-008 0 1.016585 -p -0.314142 0 0.96683 -p -0.597534 0 0.822435 -p -0.822435 0 0.597532 -p -0.96683 0 0.314148 -p -1.016585 0 -2.29279e-005 
            -p -0.96683 0 -0.314057 -p -0.822435 0 -0.597853 -p -0.597534 0 -0.821244 -p -0.314142 0 -0.971274 -p -0.104714 0 -0.990425 -p 7.06316e-009 0 -1 
            -k 0 -k 0 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 20 -k 20 
            -n controller1`; 
    string $Cog[] = `ls -sl`; 
    select -r $cv.ep $cv.ep $cv.ep[5] $cv.ep[7] $cv.ep[9] $cv.ep[11] $cv.ep[13] $cv.ep[15] $cv.ep[17] $cv.ep[19];
    scale -r -p 0cm 0cm 0cm 0.732056 0.732056 0.732056 ;
    select -r $Cog;       
    break ;
    
    case "KK_Pin" :
    $cv = `curve -d 1 -p 0 0 0 -p -2 0 0 -p -2.29289 0 0.70711 -p -3 0 1 -p -3.70711 0 0.70711 -p -4 0 0 -p -3.70711 0 -0.70711 
            -p -3 0 -1 -p -2.29289 0 -0.70711 -p -2 0 0 -p -2.292893 0 0.707107 -p -3.707107 0 -0.707107 -p -4 0 0 
            -p -3.707107 0 0.707107 -p -2.292893 0 -0.707107 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 
            -n "controller1"`;
    break ;
    
    case "KK_doublePin" :
    $cv = `curve -d 1 -p 0 0 0 -p -2 0 0 -p -2.292893 0 -0.707107 -p -3 0 -1 -p -3.707107 0 -0.707107 -p -4 0 0 -p -3.707107 0 0.707107 
            -p -3 0 1 -p -2.292893 0 0.707107 -p -2 0 0 -p -2.292893 0 0.707107 -p -3.707107 0 -0.707107 -p -3 0 -1 
            -p -2.292893 0 -0.707107 -p -3.707107 0 0.707107 -p -3 0 1 -p -2.292893 0 0.707107 -p -2 0 0 -p 0 0 0 -p 2 0 0 
            -p 2.292893 0 -0.707107 -p 3 0 -1 -p 3.707107 0 -0.707107 -p 4 0 0 -p 3.707107 0 0.707107 -p 3 0 1 -p 2.292893 0 0.707107 
            -p 2 0 0 -p 2.292893 0 0.707107 -p 3.707107 0 -0.707107 -p 3 0 -1 -p 2.292893 0 -0.707107 -p 3.707107 0 0.707107 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 
            -k 22 -k 23 -k 24 -k 25 -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 
            -n "controller1"`;
    break ;
    
    case "KK_fourPin" :
    $cv = `curve -d 1 -p -2 0 0 -p -2.292893 0 -0.707107 -p -3 0 -1 -p -3.707107 0 -0.707107 -p -4 0 0 -p -3.707107 0 0.707107 -p -3 0 1 -p -2.292893 0 0.707107 
            -p -2 0 0 -p -2.292893 0 0.707107 -p -3.707107 0 -0.707107 -p -4 0 0 -p -3.707107 0 0.707107 -p -2.292893 0 -0.707107 -p -2 0 0 -p 0 0 0 
            -p 2 0 0 -p 2.292893 0 0.707107 -p 3 0 1 -p 3.707107 0 0.707107 -p 4 0 0 -p 3.707107 0 -0.707107 -p 3 0 -1 -p 2.292893 0 -0.707107 -p 2 0 0 
            -p 2.292893 0 0.707107 -p 3.707107 0 -0.707107 -p 4 0 0 -p 3.707107 0 0.707107 -p 2.292893 0 -0.707107 -p 2 0 0 -p 0 0 0 -p 0 0 2 
            -p -0.707107 0 2.292893 -p -1 0 3 -p -0.707107 0 3.707107 -p 0 0 4 -p 0.707107 0 3.707107 -p 1 0 3 -p 0.707107 0 2.292893 -p 0 0 2 
            -p 0.707107 0 2.292893 -p -0.707107 0 3.707107 -p 0 0 4 -p 0.707107 0 3.707107 -p -0.707107 0 2.292893 -p 0 0 2 -p 0 0 -2 
            -p -0.707107 0 -2.292893 -p -1 0 -3 -p -0.707107 0 -3.707107 -p 0 0 -4 -p 0.707107 0 -3.707107 -p 1 0 -3 -p 0.707107 0 -2.292893 
            -p 0 0 -2 -p 0.707107 0 -2.292893 -p -0.707107 0 -3.707107 -p 0 0 -4 -p 0.707107 0 -3.707107 -p -0.707107 0 -2.292893 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 -k 24 
            -k 25 -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 -k 33 -k 34 -k 35 -k 36 -k 37 -k 38 -k 39 -k 40 -k 41 -k 42 -k 43 -k 44 -k 45 -k 46 -k 47 
            -k 48 -k 49 -k 50 -k 51 -k 52 -k 53 -k 54 -k 55 -k 56 -k 57 -k 58 -k 59 -k 60 
            -n "controller1"`;
    break ;
    
    case "KK_Dumbell":
    $cv = `curve -d 1 -p -0.5 0 0 -p -0.58 -0.202763 0 -p -0.786335 -0.28675 0 -p -0.989098 -0.202763 0 -p -1.073085 0 0 -p -0.989098 0.202763 0 
            -p -0.786335 0.28675 0 -p -0.5835722 0.202763 0 -p -0.5 0 0 -p 0.5 0 0 -p 0.580579 0.202763 0 -p 0.783342 0.28675 0 -p 0.986105 0.202763 0 
            -p 1.070092 0 0 -p 0.986105 -0.202763 0 -p 0.783342 -0.28675 0 -p 0.580579 -0.202763 0 -p 0.5 0 0 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 
            -n "controller1"`;
    break;
    
    case "KK_Aim":
    $cv = `curve -d 1 -p 0 0 1 -p 0 0 -1 -p 0 2 0 -p 0 -2 0 -p 0 0 -1 -p 2 0 0 -p -2 0 0 -p 0 0 -1 
            -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 
            -n "controller1"`;
    break;
    }
    return $cv;//作ったコントローラーの名前を返す
}

global proc main_KK_MakeController(string $mode){
    //選択したノードの位置情報をとってくる
    float $pos[];
    float $rot[];
    int $i;
    string $node[],$ctrName;
    
    $node = `ls -sl`;
    
    //選択してるノードがあるかを判定
    if(0 == size($node)){
        $ctrName = `KK_MakeController($mode)`;//コントローラーを作りつつ、コントローラーの名前を取得
    }
    else{
        for($i=0;$i<size($node);$i++){
            $ctrName = `KK_MakeController($mode)`;
        
            $pos = `xform  -q -t -ws $node[$i]`;
            $rot = `xform -q -ro -ws $node[$i]`;//トランスとロットは別で取得しないといけんのね
            
            xform -t $pos[0] $pos $pos $ctrName;//コントローラーの名前を参照して、選択したノードの場所へスナップ
            rotate $rot[0] $rot $rot $ctrName;   
        } 
    }
}

global proc KK_ControllerUI()
{
if (`window -ex KK_Window`) deleteUI KK_Window ;
    window
    -wh 500 200
    -title "KK_Controller"
    -rtf 1 
    -s 1
  KK_Window;

string $tabs = `tabLayout -innerMarginWidth 1 -innerMarginHeight 1`;
string $grid_01 = `gridLayout -numberOfColumns 6 -cellWidthHeight 50 50`;

    iconTextButton 
    -style "iconOnly"
    -image1 "KKController_Square.png" 
    -c "main_KK_MakeController KK_CUBE";
    
     iconTextButton 
    -style "iconOnly"
    -image1 "KKController_Cone.png"
    -c "main_KK_MakeController KK_CONE";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KKController_ball.png"
    -c "main_KK_MakeController KK_Ball";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KKController_ForeArrow.png"
    -c "main_KK_MakeController KK_FourArrow";

    iconTextButton 
    -style "iconOnly"
    -image1 "KKController_SingleArrow.png"
    -c "main_KK_MakeController KK_ArrowSingle";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KKController_Square01.png"
    -c "main_KK_MakeController KK_Square";
	setParent ..;
	
string $grid_02 = `gridLayout -numberOfColumns 6 -cellWidthHeight 50 50`;
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Circle.png" 
    -c "main_KK_MakeController KK_Circle";
    
     iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Cross.png"
    -c "main_KK_MakeController KK_Cross";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Pentagon.png"
    -c "main_KK_MakeController KK_Pentagon";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Hexagon.png"
    -c "main_KK_MakeController KK_Hexagon";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Triangular.png"
    -c "main_KK_MakeController KK_Triangular";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Spear.png"
    -c "main_KK_MakeController KK_Spear";//
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_KK_Hexagon2.png" 
    -c "main_KK_MakeController KK_Hexagon2";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Dia.png"
    -c "main_KK_MakeController KK_001Dia";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_DirSingleThin.png"
    -c "main_KK_MakeController KK_DirSingleThin";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_DirDoubleThin.png"
    -c "main_KK_MakeController KK_DirDoubleThin";

    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_DirDoubleFat.png"
    -c "main_KK_MakeController KK_DirDoubleFat";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_DirFourThin.png"
    -c "main_KK_MakeController KK_DirFourThin";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_DirEight.png"
    -c "main_KK_MakeController KK_DirEight";//******--
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Rot90Thin"
    -c "main_KK_MakeController KK_Rot90Thin";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Rot90Fat.png"
    -c "main_KK_MakeController KK_Rot90Fat";

    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Rot180Thin.png"
    -c "main_KK_MakeController KK_Rot180Thin";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Rot180Fat"
    -c "main_KK_MakeController KK_Rot180Fat";//**************
	
	 iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_ArrowsOnBall.png" 
    -c "main_KK_MakeController KK_ArrowsOnBall";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Cog.png"
    -c "main_KK_MakeController KK_Cog";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_pin.png"
    -c "main_KK_MakeController KK_Pin";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_doublePin.png"
    -c "main_KK_MakeController KK_doublePin";

    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_fourPin.png"
    -c "main_KK_MakeController KK_fourPin";
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Dumbell.png"
    -c "main_KK_MakeController KK_Dumbell";//*-/-*
    
    iconTextButton 
    -style "iconOnly"
    -image1 "KK_Controller_Aim.png"
    -c "main_KK_MakeController KK_Aim";
    
	setParent ..;
	
tabLayout -e -tabLabel $grid_01 "main" -tabLabel $grid_02 "sub01" $tabs;
  showWindow KK_Window;
}
ABOUT ME
みっつ
CGアニメーター/リガー テクニカルアーティスト(TA)目指して精進中です 都内でゲーム作ってます。