コンソールに「Hello, World.」を出力
古来より、最初に書くプログラムは画面に「Hello, World.」と表示するもの決まっている。
本章では、ゲームシーンではなく、Unity エディタのコンソールウィンドウに「Hello, World.」と表示するスクリプトを書いてみる。
まずは、下図のように、プロジェクトの「Create▼」を押して表示されるメニューから「C# Script」を選ぶ。
そうすると、アセットに「NewBehaviourScript」という名前のスクリプトが生成される。
名前の部分が選択状態になっているので、ここで「HelloWorld」などのように適切な名前に変更しよう。
名前の変更が終わったら、「Enter」を押す。
名前の変更は F2 を押すことで後でもできなくはないが、クラス名も変更する必要があり面倒なので、Enter を押す前に変更することを強く薦める。
そうすると、画面が下図のようになるはずだ。
右側のインスペクタに自動生成されたスクリプトの内容が表示される
ここで、インスペクタ右上の【Open...】を押すと、スクリプトを編集するためのエディタが立ち上がる。
筆者の環境は Windows で Visual Studio 2015 をインストールしているので、それが立ち上がるが、
環境によっては Unity が用意しているエディタが立ち上がるかもしれない。
で、本章の肝である、「Hello, World.」表示だが、下図のように Start() 関数の中で、
Debug.Log(文字列) を使って表示する。
ちなみに、Start() はその名の通り、スクリプトが実行開始されたとき、最初に実行されるメンバ関数だ。
この例では文字列を表示するだけだが、メンバ変数の初期化や、必要な関数コールを記述することができる。
Update() の方は毎フレーム(60FPS または 30FPS)コールされる関数で、今回は何も記述しない。
スクリプトの中身が気になる人もいるとは思うが、最初から細部にこだわると先に進めなくなるので、 今は Start() の中にそう書くものだと無条件に覚えてほしい。
スクリプトの入力が終わったら、F7 を押してビルドし、コンパイルエラーが無いことを確認しておくといいだろう。
スクリプトができたら、Unity エディタに戻り、スクリプトが実行されるよう、なんらかのゲームオブジェクトにアタッチする必要がある。
その操作は簡単で、下図のように、アセットの中のスクリプトアイコンをドラッグし、ヒエラルキーの Main Camera にドロップするだけだ。
これで、プレイを実行すると、メインカメラの初期化が行われ、アタッチされているスクリプトの Start() が呼ばれる、という仕組みだ。
で、Unity エディタ上部中央の三角のプレイボタンを押すか、Ctrl + P を押下することで、シーンをプレイすると、 下図のように、コンソールに無事「Hello, World.」が表示される。
※ もし、コンソールビューが表示されていない場合は、 Window > Console メニュー または Ctrl + Shift + C で コンソールビューを表示できるぞ。
流れをおさらいすると、以下のようになる。
- スクリプトを作成する
- Start() に「Hello, World.」表示コードを記述する
- メインカメラにそのスクリプトをアタッチする
- シーンを実行する
スクリプトは何らかのゲームオブジェクトにアタッチしないと実行されない、ってのがポイントだ。
演習問題:
- Start() の中ではなく、Update() の中に「Debug.Log(文字列)」を書くと何が起こるか、予想し、実際に確かめてみなさい。
GUI.TextArea に「Hello, World.」を表示
次は、下図のように、画面上部にテキストエリア(GUI.TextArea)を設置し、そこに「Hello, World.」を表示してみよう。
そのためのコードは非常に簡単で、以下のメンバ関数を追加するだけだ。
void OnGUI() { GUI.TextArea (new Rect (5, 5, Screen.width-10, 50), "Hello, World."); }
OnGUI() は、画面にGUIのためのウィジットを配置し、処理するためのものだ。
テキストエリアを配置し、文字列を表示する場合は、GUI.TextArea(矩形位置, 文字列); と記述するだけだ。
ね、簡単でしょ。
矩形の生成は new Rect(x位置, y位置, 横幅, 高さ) で指定している。座標原点は左上にある。
Screen はゲーム画面を表すオブジェクトで、Screen.width で画面幅を取得しているんだぞ。
ちなみに、OnGUI() は毎フレーム呼ばれるようなので、テキストを動的に変更したい場合は、 メンバ変数として string m_text; とかを宣言しておき、GUI.TextArea(矩形位置, m_text); と記述しておけば、 update() 等で m_text を修正すると、それが画面にすぐに反映されるぞ。
さらに補足しておくと、C/C++ 使いの人は new した Rect を delete しなくていいのか?と不安になるかもしれないが、 C# にはガベージコレクションという機構があり、適切なタイミングで自動的に delete してくれるので、明示的に delete しなくてもいいんだぞ。
もうひとつ補足しておくと、OnGUI() を OnGui() などのように間違って定義してしまうと、OnGUI() が定義されず、OnGui() は誰からも呼ばれないので、 何も起こらず、エラーが何も出ないので注意しよう。
※ 実はこの OnGUI() で UIオブジェクトを配置する方法は古い方法で、最近は Unity 4.6 で導入された UI クラスを使うのが推奨されている。
が、こちらの方が導入としては簡単なので、本章ではあえて古い方法を説明した。
新しい方法は、いずれどこかで説明する予定だ。
演習問題:
- 画面上部ではなく、画面下部に TextArea を生成し、そこに「Hello, World.」を表示しなさい。
※ 画面をリサイズしても、正しく画面下部に表示されることを確認してね。
void OnGUI() { GUI.TextArea (new Rect (5, Screen.height-55, Screen.width-10, 50), "Hello, World."); }
キューブで「Hello, World.」を表示
コンソールやテキストエリアに文字を出力しても、3Dが得意な Unity らしくない。
なので、この章では、下図のように、スクリプトでキューブをつみあげて「Hello, World.」を表示してみる。
ソースコードは以下のようになる。
string[] hello = { "*...* ..... *. .*. ..... ..... *...* ..... .... *. ....* ..... ", "*...* ..... *. .*. ..... ..... *.*.* ..... .... *. ....* ..... ", "*...* .***. *. .*. .***. ..... *.*.* .***. *.** *. ....* ..... ", "***** *...* *. .*. *...* ..... *.*.* *...* **.. *. .**** ..... ", "*...* ***** *. .*. *...* ..... *.*.* *...* *... *. *...* ..... ", "*...* *.... *. .*. *...* **... *.*.* *...* *... *. *...* **... ", "*...* .***. ** .** .***. **... .*.*. .***. *... ** .**** **... ", "..... ..... .. ... ..... .*... ..... ..... .... .. ..... ..... ", }; // Use this for initialization void Start () { float py = 5; for(int i = 0; i != hello.Length; ++i,py-=1f) { float px = -6*6; var s = hello[i]; for (int k = 0; k != s.Length; ++k,px+=1f) { if( s[k] == '*' ) { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = new Vector3(px, py, 0); } } } }
最初の文字列テーブルは、キューブの表示位置を示すもの。
for文で回して、'*' がある位置にキューブを生成する。
キューブの生成は GameObject.CreatePrimitive(PrimitiveType.Cube) で行なう。
生成されるキューブの位置はデフォルト(0, 0, 0)なので、transform.position に Vector3 で表示する位置を設定する。
※ Vector3 は3次元座標を保持するクラス。x, y, z メンバ変数を持つ。
プレイすると、キューブが Hello, World. 状に生成されるはずだ。
ただし、カメラがそれらを捉えていないとゲームビューでちゃんと表示されないので、シーンビューでカメラの位置・方向を適切に設定しよう。
演習問題:
- 「Hello, World.」ではなく「Hello, Unity.」と表示されるよう、コードを修正しなさい。
- 20x20程度の迷路を自動生成し、壁をキューブで表示しなさい。迷路自動生成方法はググッて調べなさい。
まとめ
コンソール、GUI.TextArea、キューブを積んで「Hello, World.」を表示するスクリプトを紹介した。
本稿で Unity の C# スクリプトの書き方の基礎を理解していただけたと思う。