2012年08月27日

うにばな(pragmaってなんですか)




”#pragma strict” のキーワードで検索が多かったので 説明しますね。


Unityは

UnityScript(拡張Javascript アクションスクリプトにちょっと似てる)、
C#(オリジナルとちょっと作法が違う)、
Boo(Pythonぽい でもなんかちがう)

などのスクリプトで記述できますが
#pragma文は 主にUnityScriptのスクリプト文中の先頭で宣言します。
UnityScript(Java)は変数の型をコンパイル時に自動的に判別する 推論型の型付けを行なってくれます。
これは 型を気にせずにざっくりとスクリプトを書くことが出来るため スクリプトにあまり馴染みのない人などが
記述するときに多少助けになることがあると思います。
ですが その便利さに反して実行スピードが若干犠牲になるため 本格的にゲームを作る場合には
的確に型宣言および型指定をしてやる必要があります。

”#pragma"には『strict』のほかに『implicit』『downcast』といった仲間があります。


■”#pragma strict”を宣言した場合。
例)


#pragma strict

foo = 5; // これは X



#pragma strict

var foo = 5; // これは ○

➀は型宣言で”var”が記述されていません Javaの場合 変数名=数値 の形で書くだけで
型宣言なしのローカルな変数が認められています。 
”#pragma strict”を指定すると あいまいな型はコンパイルエラーがでるので きちんと型宣言しないといけません。

■”#pragma implicit”を宣言した場合。

例)

#pragma strict
#pragma implicit

foo = 5;


// ”#pragma implicit” を指定した場合”#pragma strict”の記述をしていても 変数を宣言なしで使用することが出来ます。


■#pragma strict だけを記述した場合 代入先の変数の型に型変換(キャスト)で正確に値を渡さない場合エラーが帰ります。


#pragma strict

var go : GameObject ;

var clone : GameObject = Instantiate (go);

// キャスト(型変換)をしないとInstanciate関数はObject型を返しますのでGameObject型の”clone"に代入された時点でエラーになります



#pragma strict

var go : GameObject ;

var clone : GameObject = Instantiate (go) as GameObject ;

// 型変換"as”を指定することでInstanciate関数はGameObject型に型付けされました これはエラーになりません。


”#pragma downcast”を使用すると ”#pragma strict”を使用していた場合でも 値の代入時の型の相違でエラーを返しません

#pragma strict
#pragma downcast

var go : GameObject ;

var clone : GameObject = Instantiate (go); // これはOk





例文は以下のサイトを参考にしました
http://forum.unity3d.com/threads/63114-What-is-pragma-implicit-and-pragma-downcast


補足ですが プロジェクトが巨大になるとごくまれに、どうしてもキャストがコンパイルで通らないような場合があります。
特に外部スクリプトから変数を参照する場合などに発生することがあるようです。
そういう場合には他の箇所をデバッグ後に #pragma strict をはずしてみてください。
コンパイラの自動判別で何型かに適当に割りつけて実行してくれると思います。
ゲームの中で数回実行される程度の箇所であれば 修正に時間をさくのは無駄です。




追記:

技術文書などでよく目にする文字列に『foo』や『bar』 今回のサンプルにも使用されていますが

日本語で例えると 『なんとか』や『ほにゃらら』といった その箇所に好きな名前を当てはめて使用してください
という『仮の名前(単語)』を意味しています。

これを メタ構文変数(Metasyntactic variable) と情報処理の世界では呼んでいます。

ほかにも
 foo, bar, baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud 

などのようなバリエーションがあります。この順番はABC‥に相当するので入れ替えないで使用してください。

日本語圏にも同様のメタ変数があります。

「hoge」「fuga」「piyo」

などです 日本語のスクリプトを解説するサイトを巡ると目にすることがあるかと思います。

それから よく関数の内部で ”do something” という文例が出てくることがありますが
これは直訳して『何か実行する』 つまり 『好きなようにスクリプトを書いてください』ということを意味しています。
そういう名前のコマンドがあるわけではないので勘違いしないようにしてください。


これらが検索でとても多いので 一応メモ的に書いておきました。

長くプログラムを書いている人や 情報の専門の人にはあたりまえのことかもですけど
はじめてゲーム作りたい人にはわかんないですよねw



うにばな 今後の予定ですが

シェーダーの記事をとりあえずやっつけます。
その後 エネミーAIの考察、 ネットワーク関連、 モーションまわりのTips なんていう予定をたてています。
その合間に自作ゲームの記事を挟む感じでしょうか

ただし 今回その時期と場所は指定しないので その気になれば10年後 20(ry

いや 場所はここなんですけどね
過度な期待はしないでください(みなみけの4期 程度の期待感でおまちください)



それでは また

akinow at 16:16│Comments(2)TrackBack(0) Clip to Evernote Unity3d 

トラックバックURL

この記事へのコメント

1. Posted by cyah   2012年09月02日 23:04
「ひだまりスケッチ 4期」は確定のようですが、そこまで期待してはいけないのでしょうか?(笑
型宣言文か・・・昔そんなのもいじった気がするけれど、すでに忘却の彼方へ・・・。
2. Posted by ぶぎょう   2012年09月03日 10:53
cyahさん>コメントありがとうございます。
あれ『ひだまり』って書きましたっけ 『みなみけ』なら冬樹くん再登場に期待してますけどw
だれもが子供時代にならう お型付けです。 (何気に意味は合っている

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔