Unityを使ってゲーム開発をする人が多いですが、「Unityなら簡単だ」と言われても、実際にやってみると、サンプル通りに作るのは出来ても中身が分からないために応用が出来ない人が多くいます。「簡単さ」を強調するために説明が足りなく、特に開発ツールがUnityが初めてで、C#などのプログラミング経験が無い場合、誰かのコピーやAssetをimportし続けておかしなことになるのが多く見受けられます。そうした場合に、役立つであろう情報を載せます。
以下のソースコードを例に取ります。
using UnityEngine;
using System.Collections;
using UnityEngine.UI; ////ここを追加////
public class ScoreText : MonoBehaviour {
//点数を格納する変数
public int score = 0;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
this.GetComponent<Text>().text = "点数" + score.toString() + "点";
}
}
このScriptは、「点数159点」とかを画面に出す処理をしています。これを例にとって、書いてあるものの意味を説明します。
#using UnityEngine;
いきなり一行目から謎です。これが何なのか、何故に要るのかを説明します。
##using
これは、後に続いているUnityEngine
の中身に書いてあるものを、このソースコードで簡単に書けるようにする、というものです。ソースコード(.CSのファイル)は、その中で使えるオブジェクト(使えるプログラムの部品)がその中ですべてが明らかになっている必要があります。
C#の基本的な考え方に、以下があります。
定義されたオブジェクトのみ使用できる
適当な名前でいろいろ書いてると、自分で考え出したものなのか、予め用意されているものなのか分からなくなります。それを防いで、何かのオブジェクトを使うときに明確な「何なのか」を示すものをカタログにしているのが、UnityEngine
の部分です。このカタログのことを__名前空間(namespace)__と呼びます。ためしにこの行を消してみると、下の行の色が変わります。これは、予め在ると認識していない時に起こります。
##UnityEngine
Unityで標準装備されているC#の部品のカタログが、この中に入っています。名前空間には色々あって、例えば、画面に文字やボタンを配置するのに使う部品の名前空間は、UnityEngine.UI
になっています。そのときはこれも追加します。
##;
;
はC#の文法で定められている、命令の区切りです。命令を区切るのは、多くの場合は行ごとにすると見やすいので、行末に付いている場合が殆どです。
これが欠けているとエラーになります。
##System.Collections
C#で定義されいてる標準的なもので、Unityに依存しない名前空間です。ゲーム以外の開発でも使います。くわしくはこちらに書いてあります。
https://msdn.microsoft.com/ja-jp/library/system.collections.generic.aspx
#public class HogeHoge : MonoBehaviour {
これは、HogeHoge
という名前のclass
を作っている(宣言している)という行になります。サンプルのコードではScoreText
という、自分で考えたオリジナルを作っています。
##public
この単語はC#で独特の機能を持つ、__予約語__と呼ばれる単語です。予約語は、プログラミングで必要なもので、エディタで色が変わります。この名前でのオリジナルのオブジェクトは作れません。
このpublic
の意味は、「他のクラスから見えるようにする」という事を宣言します。これが無いと、Unityエディタで使えなかったり、他のクラスから中身が見えない状態になります。逆に、隠すことを明示する場合はprivate
を使います。
##class
これもC#の予約語です。class
とは、処理するデータとそれを処理する命令部分(メソッド)をひとつにまとめています。一まとめで取り扱うことが便利なものを、class
にします。
HogeHoge
は__クラス名__です。クラス名は、他から見たときにこの名前で指定します。Unityではpublicで指定してあり、同じ名前が複数で存在すると、エラーでビルド出来なくなります。また、Unityのルールで__ひとつの.csファイルで、ファイル名と同じクラスをひとつだけ宣言する__と定めてあるので、それを守らないとエラーになるので注意しましょう。
##:
この:
は、この後にあるクラスから派生していることを示しています。クラスは属性を持っていて、それを共通で使いたいものが複数あると、派生することで効率よく作り出せます。例えば、「生き物」クラスで呼吸するシステムを作り、それから「植物」「動物」に派生して光合成や移動能力を追加し、更に「動物」から「卵生類」,「哺乳類」,「昆虫」等と展開できます。
##MonoBehaviour
Unityで扱うオブジェクトは全て、MonoBehaviour
から自動的に派生するようにUnityエディタが作り出します。MonoBehaviour
は、Unityで作られるゲーム中で出てくる物体などの動作のきっかけ(イベント)で動かす処理のかたまり(メソッド)等をつなぐ役割をしています。
くわしくはここに書いてあります。
http://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.html
##{
これはC#で定義されている特殊な意味を持つ記号で、予約語と同じです。これと}
で囲まれた部分を__ブロック__と呼びます。C#のプログラミングでは命令がどこのブロックに入っているかが明確になっていないと、エラーになります。そのため、ブロック始めの{
とブロックを閉じる}
の数が一致しないとエラーになり、また、不用意に}
の数を合わせたりすると、エラーが消えていも予期しない動作をすることがありますので、注意して扱いましょう。
##//ほげほげ
C#の文法で定義された、__コメント__です。//
の後ろに書いた文字は、プログラミングの命令として認識されず、メモ書きとして機能します。誰が書いたかや、何のオブジェクトかの説明、一時的に命令を無効化したい場合などに用います。
#public int score = 0;
この行は、整数型オブジェクト"score"を外から見えるように初期値0で宣言しています。細かく見ると、こうなります。
public |
int |
score |
= |
0 |
; |
---|---|---|---|---|---|
外から見えるようにする | 整数型のオブジェクトを宣言 | 名前は"score" | 代入する | 整数の0 | 命令終わり |
-
int
はC#の予約語で、整数型を示します。値は小数点以下を格納できません。 -
=
は代入する演算で、__右辺の値を左辺へ代入__します。__右辺と左辺の型が不一致の場合、エラーになったり予期しない動作になる場合もある__ので、注意しましょう。 -
0
は整数値の0を示します。ここに数式を置いても構いません。
#void Start () {
クラス内で、startメソッドを宣言しています。メソッドとは、何かの処理をする命令群をひとつにまとめて、呼び出すと使えます。
void |
start |
() |
{ |
---|---|---|---|
返す型 | メソッドの名前 | メソッドで渡すオブジェクト | ブロックの開始 |
指定しない | startメソッド | 何も受け取らない |
__返す型__は、何かの演算結果などを返す関数に指定します。以下は、変数nの値を与えると、その1から絶対値nまでの和を返します。
int sum( int n){
int s=n*(n+1)/2;
return s;
}
int sum1to100=sum(100);//1から100までの和を求める
このstart()
メソッドは、派生元のMonoBehaviourから派生した先で定義されたかを探し、見つかったものを呼び出しています。Startはこの名前のメソッドクラスが生成された直後に実行する仕組みになっています。こうした特別な意味を持ったメソッド名が幾つかあります。
- [MonoBehaviour.Start()の説明
http://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.Start.html]
(http://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.Start.html)
#void Update () {
クラス内で、Update()
メソッドを宣言しています。これも上のstart()
と同様、この名前のメソッドがあると特定のパターンで呼び出されます。
- [MonoBehaviour.Update()の説明http://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.Update.html]
(http://docs.unity3d.com/jp/current/ScriptReference/MonoBehaviour.Update.html)
Update()
メソッドは、Unityが画面を更新するごとに呼び出されます。通常、プログラムは以下を無限に繰り返しています。
- 入力
- 画面の生成(次に描画する画面で何が何処にあるのかを演算し画面を生成する)
- 画面の表示
この流れで一回、呼び出されるものです。
#まとめ
- 他の部分はこのプログラムなりのものですが、適宜、検索すると分かります。既定されている部分は欠落するとエラーが出てビルド出来なかったり、予想しない動作に繋がりますから、触らないようにしましょう。
- 既定の部分はC#で固有のもの、
System.Collections
に在るもの、UnityEngine
に在るものに大別されます。それぞれについて分けて理解すると、今後の応用がしやすくなります。まず、C#をきちんと理解したうえでUnityを進めたほうが、近道になります。