Edited at

[超初心者向け]やっと納得、Unityを初めて触ると出てくるC#の何だあれの答え

More than 1 year has passed since last update.

Unityを使ってゲーム開発をする人が多いですが、「Unityなら簡単だ」と言われても、実際にやってみると、サンプル通りに作るのは出来ても中身が分からないために応用が出来ない人が多くいます。「簡単さ」を強調するために説明が足りなく、特に開発ツールがUnityが初めてで、C#などのプログラミング経験が無い場合、誰かのコピーやAssetをimportし続けておかしなことになるのが多く見受けられます。そうした場合に、役立つであろう情報を載せます。

以下のソースコードを例に取ります。


ScoreText.CS

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はこの名前のメソッドクラスが生成された直後に実行する仕組みになっています。こうした特別な意味を持ったメソッド名が幾つかあります。


void Update () {

クラス内で、Update()メソッドを宣言しています。これも上のstart()と同様、この名前のメソッドがあると特定のパターンで呼び出されます。

Update()メソッドは、Unityが画面を更新するごとに呼び出されます。通常、プログラムは以下を無限に繰り返しています。


  1. 入力

  2. 画面の生成(次に描画する画面で何が何処にあるのかを演算し画面を生成する)

  3. 画面の表示

この流れで一回、呼び出されるものです。


まとめ


  • 他の部分はこのプログラムなりのものですが、適宜、検索すると分かります。既定されている部分は欠落するとエラーが出てビルド出来なかったり、予想しない動作に繋がりますから、触らないようにしましょう。

  • 既定の部分はC#で固有のもの、System.Collectionsに在るもの、UnityEngineに在るものに大別されます。それぞれについて分けて理解すると、今後の応用がしやすくなります。まず、C#をきちんと理解したうえでUnityを進めたほうが、近道になります。