2011年8月22日月曜日

scriptのすすめ2 ~イコールとselection~

自分が、まずスクリプトを覚えようと思ったときに、混乱した1番最初出来事は。

「=」(イコール)の考え方です。
これは、プログラムやスクリプトを少し勉強した事ある人は遭遇すると思うのですが、
i = i + 1ってのがちょいちょい出てきますよね。
これを最初見たときは、ん?? i = i + 1ってイコールじゃないじゃん
2=1+1でしょ? 1=1+1なんてありえないジャン。
じゃんじゃん、うるさいですが、そうやって混乱して分け分からなくなったのを覚えています。

こんな事で混乱したのは自分だけかも知れませんが。。。

i = i + 1を説明すると、
=(イコール)の前と後ろの i は同じ意味では無く、始めの i は i+1の結果なんです。

って少しややこしいので、前回のスクリプトで説明します。
1行目はまずは、置いておいて

p = point()
p.pos = o.pos
o.parent = p


を日本語訳すると

p は新しいpointです。 (maxで何かオブジェクトを作るときはこの様に書きます。ボックスならbox())
pの位置は、oの位置です。
oの親は、pです。


てな感じになります。(スクリプトはプログラムと言うより、殆ど箇条書きに近いです。)

=(イコール)は算数で習った、イコールというよりも日本語の「は」と同じ意味で捉えると分かり易いかと思います。

そして、「.(ドット)」は「の」と置き換えられます。
maxscriptでは、オブジェクトが持つプロパティ(ポジション、マテリアル、モディファイヤ、コントローラーなどなど様々)の情報はドット指定していく場合が殆どです。

次に、一番大事な1行目の
for o in selection do
です。

これは、forループの1種なのですが、forループは何かと言うと
何回も同じ処理を書くのを省く為に用意されているものです。

たとえば、boxを10個作るのに、

box()
box()
box()



って10回書きませんよね。これでは、手でやってるよりシンドイので。
書き方は

for i = 1 to 10 do
(
box()
)


これで、boxが10個出来ます。(全部同じ場所に出来てしまいます。スクリプトのデフォルトそうなので)
ちなみに、i = 1 to 10と書いてありますが、この i は何の文字列もよいです。
j でも bb でも hello でも。


そして、スクリプトの基本が分かり、次に何を知りたかったか。
それは。
「複数選択したオブジェクトたちを、1発でバーっとアレコレしたい!」
でした。

それが、
for o in selection do
(
ここにアレコレしたい処理を書く。
)

これです。
これが知りたいのに、全然ヘルプに載ってない!(よく調べると載っているかも)

スクリプトやプログラムを勉強してると、if 文の使い方なんて最初方で出てきますが
if文の使い方全然知りたくないんです、知ってもあんまり意味無いというか
もっと後でいいです。if文ももう何もかも。

何故、この様に書くのか? 
最初はこれをもう呪文の様に、「そう書くんだ!」と記憶するのみで良しとします。説明すると配列やらなにやらの話になってしまうので、それはのちに説明できたらと思います。
実際、自分も最初その様に始めました。

もう一つ、oというのは選択オブジェクト(1つ)と覚えていてもらえたらと思います。
forループの中で、選択オブジェクトが順番に1つづつ
アレコレの処理がされていくと覚えてもらえたらと思います。

このoも実は、何の文字でも良いです。objでも、kkkでも。
仮に、objとして書き直すと、こんな感じです。

for obj in selection do
(
    p = point()
    p.pos = obj.pos
    obj.parent = p
)


objという、選択オブジェクト1つづつにfor以下の処理が毎回行われるという事になります。

自分自身が書く、スクリプトの殆どはこれと大差ありません。
行いたい処理を、箇条書きしてそれとforループでまわす。これが基本だと思います。


前回、拡張していくと書きましたがちょっと長くなりすぎたので、今回はこの辺で。
では、また。

2 件のコメント :

uiti さんのコメント...

私が二年前にたどった道を読んでる気がします。
i += 1 には最初とまどい。結局は慣れれてしまえばなんてことないのですが。selection の便利さには驚愕しました。

今はparticle Flow のスクリプト に悪戦苦闘してます。

杉村 昌哉 Masaya Sugimura さんのコメント...

particle Flowのスクリプトは
大分分かりずらいですねー
いつか質問するかもです。
その時はよろしくです。