以前、MAXにはUIをスクリプト上で作ることは出来ないと言った
http://www.sakaiden.com/?p=4902
理由は明快で
Maxスクリプトの場合は
UIとは事前に宣言されていなければならない
つまり、情報として約束されていないと成り立たない
MayaのMEL場合
UIもオブジェクトなので
UI内にボタンであるオブジェクトが増えるのは当然の話だな
そもそも、UIを作るって事自体が
オブジェクト化されてるって、言っていいのかな?
(んー、独学なので知らん・・・)
まぁ、簡単なはなし、Maxはムリ、MayaOK
ちなみに、SIはその辺り柔軟だからOKだと思う
SIって使用者が少ないだけで
Maya以上にポテンシャルが高いと思うよ
では、本題、
MaxでUIを作るには
ここで、古典的な方法を思いついた
作れないのなら事前に作っておけばいい
正味、ごまかしと言って良いが
見えなければ良い
ので
不便するとすれば、作った数に限界があったり
動作に制限があるところだろうな
と、偉ぶってもたいしたことはしていない
単に作ったUIの位置を移動しているだけだ
子供だまし
これがスクリプトだ
[as3]
/*******************************************************
System J Tools
********************************************************
Name:makeFakeUI
Created By:CaptainHansode
WEB:www.sakaiden.com
E-Mail:sakaiden@live.jp
Max version 2010JP more
*******************************************************/
–スクリプトエディタで開いたらctrl+Eのショートカットで実行してね
(
———————————————————————————————————–
— グローバル周り
———————————————————————————————————–
–ロールアウト用
global makeFakeUI_rol
–Version etc
Local nameAndVersion = “UIをつくる”
Local lastUpDateStr = “2011.10.16”
–ボタンが何個作られているのか?
Local howManyBt = 0;
———————————————————————————————————–
— ロールアウト周り
———————————————————————————————————–
try(cui.FloatDialogBar makeFakeUI_rol)catch()
try(cui.unRegisterDialogBar makeFakeUI_rol)catch()
try(closeRolloutFloater makeFakeUI_rol) catch()
try(destroydialog makeFakeUI_rol)catch()
———————————————————————————————————–
–メニュー
———————————————————————————————————–
–////////////////////////////////////////////////
–メニュー
–////////////////////////////////////////////////
rcMenu hiderMenuBar
(
subMenu “ヘルプ”
(
menuItem helpMi “ヘルプ”
menuItem aboutMi “About”
menuItem emailMi “E-Mail”
)–end
–////////////////////////////////////////////////
–アクション
–////////////////////////////////////////////////
on closeMi picked do
(
try(cui.unRegisterDialogBar makeFakeUI_rol)catch()
try(closeRolloutFloater makeFakeUI_rol) catch()
try(destroydialog makeFakeUI_rol)catch()
)
on savePoseFileMi picked do makeFakeUI_rol.save_Fn makeFakeUI_rol.faceListActiveX
on loadPoseFileMi picked do makeFakeUI_rol.load_Fn makeFakeUI_rol.faceListActiveX
on helpMi picked do shellLaunch “http://www.sakaiden.com/?page_id=1031” “”
on aboutMi picked do messageBox (makeFakeUI_rol.about_Fn()) title:”About”
on emailMi picked do shellLaunch “mailTo:sakaiden@live.jp” “”
–メニューを開くたびに実行されるアップデート
on hiderMenuBar update do
(
)–end
);–rcMenu end
———————————————————————————————————–
— メイン Rollout
———————————————————————————————————–
rollout makeFakeUI_rol nameAndVersion width:144 height:320;
(
button makeUIBt “ボタンを作成” pos:[8,8] width:88 height:24;
button delUIBt “ボタンを削除” pos:[8,272] width:88 height:24;
–見えないところに大量にボタンを作っておく
button btn01 “Button01” pos:[-50,-50] width:88 height:24
button btn02 “Button02” pos:[-50,-50] width:88 height:24
button btn03 “Button03” pos:[-50,-50] width:88 height:24
button btn04 “Button04” pos:[-50,-50] width:88 height:24
button btn05 “Button05” pos:[-50,-50] width:88 height:24
button btn06 “Button06” pos:[-50,-50] width:88 height:24
button btn07 “Button07” pos:[-50,-50] width:88 height:24
button btn08 “Button08” pos:[-50,-50] width:88 height:24
button btn09 “Button09” pos:[-50,-50] width:88 height:24
———————————————————————————————————–
— アクション
———————————————————————————————————–
–////////////////////////////////////////////////
–編集
–////////////////////////////////////////////////
on makeUIBt pressed do
(
–押すたびに見えないところのボタンを移動する
–作った数が9個を超えているか?
if (howManyBt < 8) then
(
if (howManyBt == 0) do btn01.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 1) do btn02.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 2) do btn03.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 3) do btn04.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 4) do btn05.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 5) do btn06.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 6) do btn07.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 7) do btn08.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 8) do btn09.pos = [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
–最後にカウントを増やしておく
howManyBt += 1;
);
);–on end
on delUIBt pressed do
(
if (howManyBt == 1) do btn01.pos = [-50,-50];
if (howManyBt == 2) do btn02.pos = [-50,-50];
if (howManyBt == 3) do btn03.pos = [-50,-50];
if (howManyBt == 4) do btn04.pos = [-50,-50];
if (howManyBt == 5) do btn05.pos = [-50,-50];
if (howManyBt == 6) do btn06.pos = [-50,-50];
if (howManyBt == 7) do btn07.pos = [-50,-50];
if (howManyBt == 8) do btn08.pos = [-50,-50];
if (howManyBt == 9) do btn09.pos = [-50,-50];
if (howManyBt > -1) then
(
howManyBt -= 1
)
);–on end
);–rollout end
createDialog makeFakeUI_rol menu:hiderMenuBar /*bgColor:[0,0,0]*/ style:#(#style_border, #style_titlebar, #style_sysmenu) menu:CanvasMenu;
);–end macroscript
[/as3]
詳しい説明はしなくてもいいと思うけど
howManyの変数で作った数をみたりしている
まぁ、フラグのようなもんだな・・・
結局今回は
単純に、howManyBtというフラグを立てて
その数値に従ってifで動作する用にしてみたが
もっと良い方法があるはずだ
これはもうチョット考えてみたいところだ
ひとまず、ボタンをつくったかのように見せたり
逆に削除するような見せ方はこれで十分ではないだろうか?
ボタンの名所は、もちろん***.caption でプロパティを持っているので
アクセス可能だ
位置に関しても、アル程度ロジック的なスクリプトを組めば
もっと自在な変化を起こせるだろう
本当に、今回はシンプルな手を使ったので
まだまだやりようはあるはずだ
ではではいつも通り
サンプルでもどうぞ