ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2012年10月9日火曜日

Unity WIki Tips - メッセージ通知センター

たくさんの敵キャラを作成して、衝突するつどにSendMessageを使ったコーディングをしていると、後々でコードのメンテナンスが面倒になることがある。

Unity Wikiでこれを解決するNotificationCenterという良い方法があったので翻訳を紹介したい。

C#スクリプトはリンク先の一番下に直に記載されているためコピーしておくと良い。

http://wiki.unity3d.com/index.php?title=CSharpNotificationCenter



用法
これは自動でインスタンス化されるシングルトンクラス。オブジェクトにアタッチする必要はなく、プロジェクトのアセットに入れてDefaultCenterに呼び出しを行うのみ。 このstaticメソッドの呼び出しにより:ゲームオブジェクト作成、NotificationCenterコンポーネント追加、コンポーネント参照作成が自動的に行われる。

PostNotification()により通知を投稿(Post)することが出来る:
NotificationCenter.DefaultCenter.PostNotification(this, "OnBumperCollision");
NotificationCenter.DefaultCenter.PostNotification(this, "OnBumperCollision", anyObject);
NotificationCenter.DefaultCenter.PostNotification(new Notification(this, "OnBumperCollision"));
NotificationCenter.DefaultCenter.PostNotification(new Notification(this, "OnBumperCollision", anyObject));

PostNotification()メソッドは、いくつかの呼び出し方法がある。 必須のパラメータは2つのみ(送信者、通知名)。 オプションでデータオブジェクトもパラメータとして受取りが出来るものであり、送受信されるものでさえあれば何であっても良い。 例えば、OnBumperCollision通知がCollisionに関する情報を送信しても良いし、Collisionオブジェクト自体を送ることも出来る。 多くの場合では、データオブジェクトはハッシュテーブルとして使用され、データオブジキーと一対で様々な情報を格納できるようにする。
留意点として、PostNotification()は個々のパラメータを渡すことも出来るし、Notificationオブジェクトを渡すことも出来る。 通知オブジェクトは、サブクラス化することができる(通知データのセットを作る場合など)。さらにNotificationオブジェクトは、必須のパラメータは2つのみ(送信者、通知名)でありオプションでデータオブジェクトもパラメータとして受取りが出来る。

addObserverメソッドを呼び出すことで通知を受け取るよう登録できる:
NotificationCenter.DefaultCenter.AddObserver(this, "OnBumperCollision");
DefaultCenter()は、デフォルトのNotificationCenterのインスタンスを返すstaticメソッドであり、存在しない場合は、自動でインスタンス化される。 AddObserver()通知は2つのパラメータが必要である(受信したいオブジェクト名、登録する通知名)。 登録する通知名は、イベントで実行する関数名である。

RemoveObserver()メソッドでオブザーバを削除できる:
NotificationCenter.DefaultCenter.RemoveObserver(this, "OnBumperCollision");
RemoveObserver()は指定された通知イベントのオブザーバのリストからオブジェクトを削除する。

通知を受信するには、通知名を持つメソッドを実装する:
using UnityEngine;
using System.Collections;
 
public class Test : MonoBehaviour {
 
   // Use this for initialization
   void Start ()
   {
      NotificationCenter.DefaultCenter.AddObserver(this, "OnBumperCollision");
   }
 
   void OnBumperCollision ()
   {
      // do something...
   }
}
------
実際にNotification Centerの考え方を応用したゲーム開発を推奨しているサイトはみつかった。しかし、多くのコンテンツが有料になっているため、詳細確認までは出来なかったのが残念なところだ:
http://www.digitaltutors.com/11/training.php?vid=12512&autoplay=1

色々な考え方をUnity Wikiから取り入れてゲームで有効活用しよう!

2012年9月28日金曜日

Unityプログラミング応用(エディタ編集)~その3

前回に引き続きプログラミング応用編として、Unityエディタの編集に関して学習していきたい。
リンク先のウェブサイトの記載と併せ、ポイント解説の翻訳を見比べてほしい:

http://catlikecoding.com/unity/tutorials/star

GUILayoutボタンはどのような働きをする?
メソッドのGUILayout.Buttonはボタンを表示し、かつクリックされたかどうか値を返す。普段使用するときはif構文のなかで呼び出しを行いそのコードブロックの中で必要な処理を行うようにする。
GUIメソッドのなかで実際に起きる流れであるが、デモのケースではOnInspectorGUIが一度ならず呼び出しが行われる。レイアウト処理、再描画、有効なGUIイベントの発生(よくあるケース)、等の際に呼び出しされる。マウスクリックイベントがボタン上で発生したときのみtrueを返す。
理解を深めるためにはDebug.Log(Event.current);をOnInspectorGUIメソッドの最後に追加するなど、テストすると良い。
通常は心配する必要がないが、テキスト生成など重い処理の際には認識する必要がある。必要性もないのに1秒あたりに何度も発生させたい処理ではない。

新しい配列要素は何が入る?
SerializedPropertyを通して新しい配列要素を挿入した場合、新しい配列要素はその一つ手前の要素の複製になる。もし最初の要素である場合はデフォルト値が入る。

ValidateCommandって何?
GUIイベントのひとつであるValidateCommandは特別のアクション(元に戻す、やり直し等)の発生を示す。ExecuteCommandに近い印象があるが、このコマンドタイプは別にあり、意味がわずかに違いつつ全く同じ目的で使用することになる。残念ながらどこでチェックをして、GUI設計の内容によってどちらかのイベントだけが発生して両方ともには発生してくれない。正直どうしてなのかは分からない。
そうすると安全に対処する方法は両方ともチェックすることだ。この場合にかぎっていえばValidateコマンドをチェックすることで要件は満たせているようだ。

breakって何? キーワードbreakを使ってループから抜け出すことが出来る。複雑な条件があって早い段階でループを抜け出したい場合に便利だ。
for(int i = 0; i < 100; i++) { if(i == 5) { break; } DoStuff(); }
と同じ結果になるのは:
for(int i = 0; i < 5; i++) { DoStuff(); }

foreachって何?
forループの便利な代替手段がforeachだ。通常のforループに比べてオーバーヘッドがあるので自分はゲームコードでは絶対使わない。だけどエディタコードで反復する整数が不要な場合は気にせず使用する。
foreach(Star s in targets) { s.UpdateStar(); }
と同じ結果になるのは:
for(int i = 0; i < targets.Length; i++) { Star s = (Star)targets[i]; s.UpdateStar(); }

OnSceneGUIはどうしてtarget引数が必要?
下位互換のためとおもわれる。マルチオブジェクトのエディットはUnity3.5から導入された。その前のバージョンはtargetしか変数がなかった。

ワールド座標にどうやって変換する?
ローカル座標をワールド座標に変換するためにはオブジェクト階層のTransformマトリクスを適用する。Unityはシーンのレンダリングで自動処理してくれるが、自ら行う必要があるケースが存在する。この場合はTransform.TransformPointメソッドを使う。

ローカル座標にどうやって変換する?
ワールド座標に変換する場合とまったく逆のステップをまったく逆順序で行う。Tranform.InverseTranformPointメソッドを使う。注意点としてワールド座標の場合はさきに回転(rotate)してそれからtranformを行ったが、元に戻すためには順序を逆にしてtransformを先に行って逆変換(invert transform)をローカル座標で行う必要がある。

スナップショットって何?
もし元に戻すステップを各々のGUIイベントに用意すると、ハンドルをドラッグする操作は何十もの修正ステップに対する元に戻す操作履歴が必要になってしまう。だから代わりにハンドルはオブジェクトのコピー、すなわちスナップショットを作成してして操作に対するひとつだけの元に戻す操作履歴ををその動作が終了したタイミングで登録する。SetSnapshotTargetはどのオブジェクトを用意すればよいかを取得できる。
すべてのUnityエディタGUI要素は本質的にこれと同じで、ハンドルのドラッグ、数値スライド、テキスト入力、あるいはその他の要素であれ同様である。
-----------

Unityエディタ編集は覚えることを面倒くさがらず、うまく使いこなすと結果的に生産性があげられる、というのがポイントだとおもう。

一人でも多くUnityのエディタ編集をマスターしよう!

2012年9月27日木曜日

Unityプログラミング応用(エディタ編集)~その2

前回に引き続きプログラミング応用編として、Unityエディタの編集に関して学習していきたい。
リンク先のウェブサイトの記載と併せ、ポイント解説の翻訳を見比べてほしい:

http://catlikecoding.com/unity/tutorials/star

構造体(struct)を使用しないのはなんで?
Star.Pointが軽量でありデータは常に全てが必要であるため、構造体にすることでオブジェクトのオーバーヘッドを回避することは意味があるといえる。しかしUnityはカスタムの構造体の型をサポートしていない。だから格納したいものには、データをバンドルするクラスを使用せざるを得ない。
オブジェクトのオーバーヘッドやNullエラーの可能性が気になるのであればオフセットおよび色データを別の配列に保存することは可能である。しかし、その場合にはこれらの配列が同期していることを保証する必要がある。それも実現可能ではあるが、クラスにするアプローチがより簡単である。このデモで使用した理由はそのためである。

オーバーライド(override)は何をする?
オーバーライドは親クラスのメソッドを上書きするときに用いる手法。virtual定義されたメソッドのみオーバーライドできる。このデモのケースにおいてはUnityが型を正確に知らなくてもエディタのOnInspectorGUIメソッド呼び出しを行うことが出来る。
だとするとUnityのStartやUpdateイベントめせっどはoverideキーワードが必要なのだろうか。答えはNoでUnityは自らのイベントメソッドを機能させるためには別のアプローチをとっているためである。
じゃあOnInspectorGUIがUnityのイベントメソッドではないのはなんでだろうか?答えは分からないが何かが整合性ご取れていないかレガシーのコードなのであろう。

SerializedObjectって何?
クラスのSerializedObjectはUnityオブジェクトのラッパー(wrapper)あるいはプロキシとして機能する。ブラックボックスのように何が入っているか分からずともデータをオブジェクトから抽出するのに使用することが出来る。Unityインスペクタが自身で作成した何かに対してもデフォルトのインスペクタを表示できるのはこのためである。元に戻す機能も無償で付属する。

EditorGUILayout?って何?
クラスのEditorGUILayoutはUnityエディタで表示するための便利ユーティリティである。さまざまな描画を行うメソッドが含まれ、デモのケースではSerializedPropertyを描画するためのみにしようしている。
EditorGUIクラスも似たような便利ユーティリティであるが、この場合は自らGUIレイアウトを処理する必要が出てくる。

GUIContentって何?
GUIContentはラッパー(wrapper)オブジェクトでありテキスト、テクスチャ、ツールチップ(ToolTip)などラベルに使用するものが対象。

GUILayoutをEditorGUILayoutの代わりに使用するのはなんで?
ゲーム開発に普段使っているUnity GUIを使用するので問題ない。GUILayoutは基本的なラベルやボタンの機能を提供する一方でEditorGUILayoutはエディタ特有の入力フィールドなど保持している。
-----------

次回はいよいよ最後のまとめ!プログラミングのポイントを押さえて、Editorを使いたおそう!

2012年9月23日日曜日

Unity C#とJavascriptの主な違い

Unity WikiにてUnity C#とJavascriptの違いを整理しているので紹介したい。

なおリンク先では各々の違いの詳細説明もついているため興味ある方は併せて確認いただくと、さらに勉強になるとおもう。


http://wiki.unity3d.com/index.php/Csharp_Differences_from_JS
17 August 2012, at 11:59

Unity C#とJavascriptの主な違い
  • 関数定義
function Start () { /* stuff. */ } // JS
void Start() { /* stuff. */ } // C#
string MyFunc() { return "hello, world"; } // C#
  • C#ジェネリック
//JS
function Start(){  var someScript : ExampleScript = GetComponent(ExampleScript);  someScript.DoSomething();}
//C#
void Start(){  var someScript = GetComponent<ExampleScript>();  // Or a more verbose version of the line above: 
var someScript = (ExampleScript) GetComponent(typeof(ExampleScript)); 
someScript.DoSomething();}
  • foreachキーワード
for(var x in someList){ // JS
  x.someVar = true;}
foreach(var x in someList) { // C#
  x.someVar = true;}
  • newキーワード
var foo = Vector3(0, 0, 0); // JS
var foo = new Vector3(0, 0, 0); // C#
Instantiate(someObj, new Vector3(0, 0, 0), someRotation); // C#
  • 型キャスト
var foo : GameObject = Instantiate(someObj...); // JS
var foo = Instantiate(someObj...) as GameObject; // JS
var foo = (GameObject) Instantiate(someObj...); // C#
var foo = Instantiate(someObj...) as GameObject; // C#
  • Getter/Setterプロパティ
C#では変数であるかのようにアクセスできる特別な関数が定義することができる。たとえばfoo.somVar="testing";と記述して裏ではget/set関数を準備してこの引数"testing"を内部に保持するようにすることはできる。しかし他のあらゆる処理(例 一文字目は大文字とする、等)も行うことは可能である。つまり変数割当てだけでなく、関数呼び出しにて変数の値セットを行い、その他もあらゆる処理を加えることが出来る。

考察
このリストを作成するきっかけとなったのはUnityチュートリアルにJavascriptが多いためにC#でなくJavascriptを勉強しようと計画した人がいたためだ。それには一定のメリットがあり、特にプログラミングが初めてだという場合にチュートリアルからコピー&ペーストが出来るという側面がある。しかし、長い目でみるとそれは言語を選択する正しい理由にはならない。

事実はC#およびJavascriptが90%の部分でソックリである。ほとんどの場合、JavascriptをC#に変更するための箇所はわずかだ。そこで、差がわずかだとするならC#をなぜ選択するとしたらその根拠がポイントとなる。まあ、この議論を始めると宗教的な論争になりかねないのでここでどちらかに優劣をつけるつもりはない。

でも断言できることとしてC#を私が選択した理由はエディタの優位性だ。

MicrosoftはVisual C# Expressのフリー版があり、Unityと良く連携できている。Intellisenseの自動補完機能がありtooltipヘルプも関数パラメータが含まれる。強力なエディタはコーディングの生産性をあげる。現時点ではJavascriptで同等の機能をもったフリーのエディタはみたことがない。
--------

はて・・・、違いの点については理解できたつもりが、最後のVisual C# Expressの一文で飛躍したのでちょっと分からなくなってしまった。

以下のUnity Wikiでも設定方法はあるが、はたしてMonoDevelopの自動補完よりはるか優れているとのことなのだろうか?そのあたりは今後で検証してみたい。

http://wiki.unity3d.com/index.php?title=Setting_up_Visual_Studio_for_Unity#Using_Visual_C.23_Express_As_the_code_editor

Unityでどうせ覚えるならやはりC#でOK!

2012年9月19日水曜日

Unityプログラミング応用(エディタ編集)~その1

UnityのInspectorは他の開発環境にない便利さを提供してくれる。リアルタイムで変数を変更したり、オブジェクトをドラッグしたり、さまざまな機能がありゲーム開発を効率的に作業できるようになっている。

このエディタをさらにカスタマイズすることが出来る。ただしそのための作法(プログラミング方法)を学ぶ必要がある。

なぜそこまで手を入れる必要があるのか?答えは簡単で、「さらに楽をするため」である。Inspector上でスクリプトがおもいのままに変数をリアルタイム編集できると、何度もプログラムを実行する必要がなくなる。

プログラミング応用編として、過去に紹介したウェブサイトの内容が非常に優れており、そこに書かれているポイント箇所を翻訳する形で学習を進めていきたい。併せてリンク先を参照いただきながらみていってほしい:

http://catlikecoding.com/unity/tutorials/star
メッシュ(Mesh)って何?
概念的にはメッシュはグラフィックスのハードウェアにより用いられる構造体であり複雑な描画に活用される。三次元空間の点の集合と三角形(基本的な二次元形状)から定義される。三角形はメッシュが表現しようとしている物体の表面を構成する。物体そのものはリアルに描かれるため実際には三角形の集合をみていることに気づかないほどだ。

クラスの属性って何?
クラスの属性はクラスにつけられるタグのようなもので、Unityがクラスをどう扱うか変更することができる。デモのケースではUnityに必要なコンポーネントがあるか確認させていて、このコンポーネントを追加するゲームオブジェクトに必要なコンポーネントが揃っていることを保証する。

typeofはどう使う?
演算子typeofによりクラス等の型オブジェクトを取得する。変数に対して使用することはできず、明示的な型名でしか使用できない。
クラス名をそのまま使用しない理由は明確でコンパイルエラーになってしまうためだ。あえてクラス名をそのまま使用しないのは型を変数に変換する必要があるためだ。

forループの変則的な使用法は?
for構文のなかで、複数のステートメントを反復宣言に入れて増分させることが可能。変則的な点はコンマで反復、増分それぞれの箇所に記入する必要がある点だ。
for(int iA = 0, iB = 0; iA < 10; iA++, iB++) { DoStuff(iA, iB); }
と同等の記入方法は
int iA = 0, iB = 0; while(iA < 10) { DoStuff(iA, iB); iA++; iB++ }

CGPROGRAMは何をする?
Unityエンジンからグラフィックカードにデータフローがあり、頂点ごとに処理される。次に頂点間の補間データが個々の頂点から個別のピクセルの描画までのデータフローの処理がある。デモのケースではポジションおよび色データのデータフローが処理される。このケースではさらに、頂点のポジションをワールド座標からスクリーン座標に変換するという点が追加処理となる。
CGPROGRAM文の上にある構文はデフォルトのライティング、Zバッファともにオフにする命令文である。カリングもオフにしているため三角形の両面(正面のみならず)を見ることが出来る。Blend SrcAlpha OneMinusSrcAlphaはデフォルトのアルファブレンドであり、透明を扱うことが出来る。

固定機能シェーダがないのはなんで?
固定機能シェーダは現在では使用されていない。またCGPROGRAMを使うことでUnityのスクリーンピクセルの変換が明示的になる。

Nullとサイズの両方をチェックするのはなんで?
新規作成されたとき、スターのコンポーネントはまだ配列がない。技術的にも配列を後でNullに設定することも可能である。エラーを未然に防ぐためにもその点は良く注意しておく必要がある。配列が存在する場合だけサイズをチェックする必要がある。
--------

繰り返しになるがリンク先ではエディタのプログラミングがより詳細が書かれており、ステップごとに丁寧に画面操作が一から書かれているので時間ある際に必ず併せて見てほしい。

次回も引き続きエディタのプログラミングについてみていきます!

2012年8月28日火曜日

Unityプログラミング応用(グラフ作成) ~その3


Unityプログラミング応用(グラフ作成)の続編です。

http://catlikecoding.com/unity/tutorials/graphs/



Mathfとは?
Mathfは構造体であり、便利な数学的な処理を行うことが出来るstaticメソッドや変数の集合体である。関数ライブラリである。

列挙型(enum)とは?
enumという型(列挙型)を用いて名前を順番に列挙した集合である列挙体を定義することが出来る。この型の変数は名前をこの変数のひとつとして持つことが出来る。これらの名前はデフォルト0から始まる数字と対応している。

限られた選択肢を提供した場合に便利である。

デレゲートとは?
値およびオブジェクト参照を変数に格納できるのであればメソッド参照も格納が可能できるだろうか。答えはイエスで、それがまさにデレゲートである。

デレゲートの型はメソッドを作成するのと同様に定義することが出来て、違いはコードの本文(body)がないことだけである。その後はこの型をしようしてデレゲート変数を作成し、型に合うメソッドを割り当てることが出来る。
その後はこの変数をメソッドであるかのように扱うことが出来る。

デレゲートはより複雑なものもあり、リストのように動作してより複雑なイベント処理も可能であるが本講座では割愛する。

メソッド名を2回用いているのは何故?
文章により言葉の文脈における意味がまったく異なる、と同じことを意識する必要がある。

FunctionOption列挙体の中を覗いてみると、ただの単語の一覧であることが分かる。メソッド名と同じ名前であるのは今回たまたま同じ名前の設計にしただけであって同じである必要性はない。

functionDelegates配列の宣言を覗いてみると、メソッドへの実参照であり、この場合は同じ名前でないと機能しない。

記号のはどのように用いる?
記号の?のを記号の:と組み合わせることで、if文を省略(インライン化した記載)出来る。例えば:
int y; if(x > 1) { y = 10; } else { y = 20; }を省略するとint y = x > 1 ? 10 : 20;
-------
Unityプログラミング応用のその1、その2をマスター出来ていると自信がある場合はリンク先の英語サイトのコードを参照下さい。

デレゲートなど私自身はうる覚えだということを確信しましたが(汗)、具体例があるので理解が深まります。プログラミングも応用することでゲーム開発に生かすぞ!

2012年8月27日月曜日

Unityプログラミング応用(グラフ作成) ~その2

Unityプログラミング応用(グラフ作成)の続編です:
http://catlikecoding.com/unity/tutorials/graphs/

newはどのように用いる?
newキーワードは、オブジェクトの新しいインスタンスや構造体の値をコンストラクトする場合に用いる。コンストラクタと呼ばれる特別なメソッドを直後に記載する必要があり、コンストラクタは所属するクラスあるいは構造体と同じ名前をつける。

チュートリアルでposition.yに値セットしないのは何故?
ポジションがオブジェクト参照であれば正しく動くが、実際には構造体の値である。

一意のオブジェクトインスタンスはひとつのみ存在することが出来るが、複数の変数から参照することが可能である。値に対してインスタンスをアサインすることと複製することは別のことである。
たとえて言うならば皆でAさんの名前を一斉に呼んで指示するようなものである。他の人がAさんの名前を聞いたからといってAさんが二人になるわけではない。

整数や構造体のインスタンスは先のオブジェクトインスタンスとは異なる動きをする。もし構造体の値を呼び出しした場合は、複製がそこで行われて独立に保持される。Aさんの名前の例でいうと、
今度は名前を呼んでも複製なので今度は当人から返事をもらうことが出来ない。

すなわちある地点のポジション(position)を呼び出ししても複製が行われる。今回のチュートリアルではこの複製された値に何かセットしても、もとの地点そのものを更新しないと何も値の変更は行われない。

returnはどのように用いる?
returnキーワードを用いることでメソッド終了後の戻り値を知らせることが出来る。戻り値はメソッドと型を合わせる必要があり、voidである場合には戻り値が存在しない。

returnステートメントはvoid、コンストラクタの場合を除いて必ず戻り値をセットするように記載する必要がある。

また、複数の戻り値をセットすることが出来る。その場合、複数の出口が存在することになり、どのreturnが用いられるかはifステートメントで分岐させる。

チュートリアルでstaticである必要性は?
チュートリアル記載のケースはstaticでなうとも良い。ただし、これらのメソッドは後にstatic配列に用いられる予定であり、これらもstaticである必要性はない。

多くのケースでstaticである必要性はないが、オブジェクトインスタンスと独立して値やメソッドが存在することが出来る場合にstaticにするように私自身はしている。
--------

第3回に続きます。

Unityプログラミング応用を自分のものにするぞ!

2012年8月26日日曜日

Unityプログラミング応用(グラフ作成) ~その1


今回はUnityプログラミングの応用編として優良なプログラミングチュートリアルのポイント解説部分の翻訳を行う:


http://catlikecoding.com/unity/tutorials/graphs/

チュートリアルを進めながらC#を応用してより複雑なグラフ作成を行う。
・グラフ作成を行い、線の作成から体積の表現まで行う
・パーティクルシステムを制御する
・数学的な関数を作成する
・実行中に動作変更を行う
・StartおよびUpdateのUnityイベントメソッドを用いる
・ループをネストされた場合とそうでない場合で用いる
・配列、列挙体、デレゲートを用いる

ポイント解説
Startはどのタイミングで呼び出しされる?

コンポーネントが作成され、アクティブとなり、Updateが初回の動作を行う前にStartは呼び出しされる?

配列はどのように用いる?
配列は固定長のオブジェクトであり、複数の連続した変数を取り扱う。変数宣言をする際に[]を後に記載することでその型での配列を表す。たとえばint myVariable;は整数を表しint[] myVariableは整数の配列を表す。

実際に配列のある変数にアクセスするためにはインデックス(何番目かではなく)を[]の中に記載する。たとえばmyVariable[0]で配列の最初のエントリを取得することが出来、myVariable[1]で二つ目のエントリ、といった要領で取得する。

実際に配列を作成し変数を割り当てる場合はmyVariable = new in[10];といったように記載し、10個のエントリからなる新しい配列が作成される。別の方法としてmyVariable = {1, 2, 3};というように初期値をあらかじめ設定することも出来る。

ParticleSystem.Particleとは?
ParticleSystem.Particleとはパーティクルのデータを保持する構造体である。型の中にドットがあるためネストされていることが分かる。パーティクル(Particle)型はParticleSystem型の中で定義されているためParticleSystem.Particleとしてアクセスする。

注意すべき点としてParticleSystemの中にないParticleも存在するが、その場合の型はShurikenパーティクルシステムが使用できない。

forループはどのように用いる?
forループにより繰り返しの動きを記載できる。この場合では整数iを反復する変数として用いる。第1部分で変数を宣言し、第2部分でループのクリア条件をチェックし、第3部分で変数をインクリメントする。

whileループを用いてまったく同じ結果を得ることはできるが記載方法として{}で括る範囲が異なる。

for(int i = 0; i < 10; i++) { DoStuff(i); }
と同じ記載をするためには:
int i = 0; while(i < 10) { DoStuff(i); i++; }

i++はどのような働きをする?
++演算子により変数は1つだけインクリメントされる。++表現を先に記載することで保持する値をあらかじめインクリメントすることが出来る。例として:

int x = 0; int y = 10 + x++; →xが1, yが10となる
int x = 0; int y = 10 + ++x; →xが1, yが11となる

--は減算する場合に同様に用いることが出来る。

-----

第2回ではポイント解説の続きを翻訳します。

プログラミングを応用することでゲームに磨きをかけるぞ!!

2012年8月22日水曜日

Unityプログラミング基礎(時計の作成) ~その2


「Unityプログラミングの基礎」の続編です。

まとめ部分(後半)の翻訳です:



http://catlikecoding.com/unity/tutorials/clock/


クラスとは?

クラスとはオブジェクトを自身のコンピュータメモリ上で展開するうえでの設計図である。設計図によりこれらオブジェクトがどのようなデータが含まれているかとその振る舞いが定義される。

MonoBehaviourとは?

UnityEngine名前空間に含まれるクラスである。Unityコンポーネントとしてクラスを作成する場合はMonoBehaviourから継承する。便利な機能が標準で組み込まれており、例をあげるとフレームごとの更新処理ができるUpdate()など含まれる。

変数とは?

変数とは加工できる値である。オブジェクト、整数など参照させることが出来る。変数はあらかじめ使用前に型宣言が必要である。

また変数はあらかじめ定義された有効範囲でのみ使用することが出来る。デフォルトではクラス内が 有効範囲である。さらにそのクラスからインスタンス化されたオブジェクトはインスタンス毎にローカルな値を持つ。しかしstatic宣言することで、全てのインスタンスから同じ値を参照する。もし変数がメソッド内で宣言された場合はそのメソッド呼び出しが行われた時のみ存在する。

メソッドとは?

メソッドはクラスに定義された一連の動作である。入力値を処理して出力値に変換する。メソッド定義の際に入力値を持たない場合は、「メソッド名()」と記載する。出力値を持たないメソッドはvoidと記載する。

デフォルトでメソッドは通常オブジェクトに対する動作を定義するが、オブジェクトを必要としない動作を定義することも出来る。その場合はメソッドそのものをstatic宣言して記載する。

const(定数)の特徴は?

constと記載すると実行中に値が変わることのない定数であることを明示することになる。値はコンパイル時に計算され、参照されればその値が渡される。

コンパイル時に全ての定数はあらかじめ計算されるため、たとえば(1+1)と記載することと2と記載することは全く同じことを意味する。

struct(構造体)とは?

struct(構造体)とはクラス同様に設計図のようなものにあたる。違いはstructとして作成される場合はオブジェクト型ではなく値型(整数、等)である。
すなわちオブジェクトのような何かの概念を表現する性質は持たず単純な値をあらわす場合に用いる。

プロパティとは?

プロパティとは変数に見せかけたメソッドである。読み取り/書き込み専用とすることが出来る。

クォータニオンとは?

クォータニオンは複雑な数字から算出され、三次元回転をあらわす。単純な三次元ベクトルより理解することが難しいが便利な特性がいくつか存在する。Quaternion構造体はUnityEngine名前空間に存在する。

rotationをでなくlocalRotationを使用するのはどんな場合?

localRotationは配置(Tranform)の実際の回転を表し、親オブジェクトの回転とは独立している。たとえば時計オブジェクトを回転する場合には針はそれに沿って回転する。

rorationは配置(Transform)の最終的な回転を表し、親オブジェクトの回転と依存している。たとえば時計全体を回転させた場合に針はそのままの状態で維持される。

型キャスト(casting)とは?

型キャストをすることで変数の型を明示的に変換することが出来る。型キャストを記載する場合は値の前に型を()の前に記載する。型キャストを単純な変数に対して行うと、たとえば浮動小数を整数にすると小数点以下が切り捨てられる。

オブジェクト参照で型キャストした場合はオブジェクトは変換されず、参照の扱い方のみが異なる。オブジェクトの型がはっきりと分かっている場合のみに用いることになる。
---------

抽象的な概念ばかりでしたが、Unityプログラミング基礎のその1、その2をマスター出来ていると自信がある場合はリンク先の英語サイトのコードを参照下さい。

「このコードが何故ここで使われる必要があるのか?」の具体例があるので力がつきます。またプログラミングはどうしても英語が用いられれますが、苦手意識が減ります。

また筆者自身はUnityにおけるC#について概念を勉強する場合は以下のリンク先が最強と考えています:
http://www.slideshare.net/lucifuges/unityc

プログラミングも基礎をしっかり覚えることで実力がつくぞ!

2012年8月21日火曜日

Unityプログラミング基礎(時計の作成) ~その1

最近Unityプログラミングの基礎について書かれている英語サイトを探したところ、実にすぐれたものがあることが分かった。

あいかわらず英語でのみ書かれているため、まとめ部分を翻訳をしてみた:



http://catlikecoding.com/unity/tutorials/clock/


チュートリアルを進めながらC#の基本用語を押さえる。作成するものは簡単な時計である。
・オブジェクト階層を作成する
・スクリプトを作成しアタッチする
・名前空間にアクセスする
・Updateメソッドで更新する
・時間の進行にともない針の動きに反映させる

用語

ゲームオブジェクトとは?
シーンに含まれるすべてが原則ゲームオブジェクトである。名前、タグ、レイヤー、位置(Transform)コンポーネントをもっておりこれらはスクリプトのなかでエディタ編集できる。
単独では使用できず空のコンテナである。コンポーネントをアタッチすることや、オブジェクトを含めることで有用に使用することが出来る。

子オブジェクトとは?
あるオブジェクトを別のオブジェクトとして含める(つまり階層ビューであるオブジェクト上にドラッグ&ドロップすることで)ことで子オブジェクトの扱いとなる。
親オブジェクトの位置(Transform)は子オブジェクトにより継承されて最初に反映される。すなわち子オブジェクトの位置(Tranform position)が(10,0,0)であり、
親の位置が(2,1,0)であった場合は子オブジェクトの配置は(12,1,0)になる。しかし、親の回転位置(Tranform rotation)が(0,0,90)であった場合は子オブジェクトの
回転位置は(0,0,90)となって親オブジェクトを中心にして回転されることで(2,11,0)が配置になる。拡大(Scale)は同様に親オブジェクトより反映される。

名前空間とは?
コーディングのいてウェブサイトのドメインに相当するもの。たとえばMonoBehaviourはUnityEngine名前空間の中に定義されアドレスはUnityEngine.MonogBehaviourである。

ドメインと全く同様に名前空間はネストすることが出来る。大きな違いは記載順番が逆であり、forum.unity3d.comではなくcom.unity3d.forumと記載する。たとえばArrayListタイプがCollections名前空間に存在し、さらにSystem名前空間に存在する場合、アクセスするためにはSystem.Collections.ArrayListと記載する必要がある。

using句で何が出来る?
名前空間をusing句であらかじめ宣言することで、その後記載を省略できる。すなわちusing UnityEngineと記載することでUnityEngine.MonoBehaviourはMonoBehaviourとだけ
書くことが出来る。
---------

第2回も続けて用語の翻訳をします。

Unityプログラミングもこういう翻訳がもっとある方が良いとおもう方はポチっとね♪ ↓
このエントリーをはてなブックマークに追加


プログラミングも基礎からきっちりと身につけるべし!

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿