[超初心者向け]UnityでのC#の基礎(2)class

Unityは「ゲームを簡単に作れるようにする」ソフトですが、他のプログラミング経験がないままで利用するとScriptが分からなくてつまずいてしまいます。ここでは、Unityで利用するC#に絞って、Scriptの仕組みを解説します。
Scriptのエディタで出てくる簡単な解説は以下で記していますので、一度読んでからこちらを参考にして下さい。

[[超初心者向け]やっと納得、Unityを初めて触ると出てくるC#の何だあれの答え](http://qiita.com/JunShimura/items/3c2e23bb77cc9085bfda)

これだけでは「なんとなく分かる」程度なので、制作するには更に知識が必要です。
ここでは最低限の知識を書きます、学習の糸口として利用してください。

この記事は以下でシリーズしていますので、適宜、参照してください。
[UnityでのC#の基礎]
(http://qiita.com/JunShimura/items/f87c599b3738b804f605#unity%E3%81%A7%E3%81%AEc%E3%81%AE%E5%9F%BA%E7%A4%8E)

#束ねてまとめる`class`

リファレンスを見ていくと、ほとんどのページに`class`か`struct`が書いてあります。これは使い方が違いますが、「データとメソッド（処理をする部分）をまとめる」ものです。関連するものをまとめていると、便利なものを、Unityでは予めまとめて作っています。

#<i class="fa fa-cubes"></i>`class`の基本
例えば、`Transform`を見てみると、以下のように書いてあります。

>Transform
>class in UnityEngine/継承元:Component


引用元:[http://docs.unity3d.com/ja/current/ScriptReference/Transform.html](http://docs.unity3d.com/ja/current/ScriptReference/Transform.html)

これは、`Transform`という名前の`class`をUnityで用意してますよ、という宣言です。「継承元」とは、classは継承という形で、元にあるものから別のものを定義する機能があります。`Component`と書いてあるので、この`Transform`は`Component`の内容を継承し、更に何かを付け加えたものであることが判ります。実際には、UnityEngineの中では以下のように書いてある筈です。

```csharp
class Transform : Component{

//このクラスの中身がここに入る

};
```
- `class`はC#の予約語で、この後に在る識別子がclass名です。
- その後ろに在る`:`と、それに続く識別子が`派生する元のclass名(基底クラス)です。
- `{`と`}`に囲まれた部分に在るものを「ブロック」と呼び、このclassの中身を定義しています。

自分でScriptコンポーネントを追加した場合、以下のようなソースコードが出来上がります。これも同じです。

```csharp:Hogehoge.CS
using UnityEngine;
using System.Collections;

public class Hogehoge : MonoBehaviour {

    // Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	}
}
```



##<i class="fa fa-cube"></i>継承とは

特定の属性などで共通化できる部分をまとめて作ったclassを基底クラスにして、派生する`class`をつくることで、効率のよく質のいいプログラミングができます。`Component`は、UnityエディタでScene内にある`GameObject`にくっついているものです。Unityのエディタでは、メニューの`Component`から色々なものを追加すると、Inspectorで並びます。あたり判定を処理する`Collider`や色などを保持する`Renderer`なども同じように`Component`を基底クラスにしています。

>Renderer
>class in UnityEngine/継承元:Component

引用元:[http://docs.unity3d.com/ja/current/ScriptReference/Renderer.html](http://docs.unity3d.com/ja/current/ScriptReference/Renderer.html)

##<i class="fa fa-cube"></i>メンバーの種類
クラスの`{`と`}`の間に囲まれているブロックの中に、メンバーを定義します。ここに入るもので主なものは、データを記憶するフィールドと、何らかの処理をするメソッドです。

###<i class="fa fa-cube"></i>フィールド

* Unityのリファレンスでは「変数」と記されています。
* 変数などの値の記憶する部分を作ります。これは値を得られたり、代入する対象です。

例えば、`Transform.childCount`の説明をみると、

```csharp
public int childCount;
```
引用元:[http://docs.unity3d.com/jp/current/ScriptReference/Transform-childCount.html]
(http://docs.unity3d.com/jp/current/ScriptReference/Transform-childCount.html)

と書いてあります。この`childCount`は、

|`public` |`int` |`childCount`|
|:--------|:-----|:-----------|
|外部から参照可能|整数型|変数名がchildCount|

と定義されています。これを参照する場合、以下のようになります。

```csharp
using UnityEngine;
using System.Collections;

public class Hogehoge : MonoBehaviour {


    public Transform playerTransform;

    // Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        int count = transform.childCount;
        if(prayerTransform.childCount==count)
        {
          //プレイヤーの子の数と自分の子の数が同じ場合の処理
　　
	}
}
````
自分のClassの外に在るものを覗き見る場合は、外部のクラス名とドット演算子「`.`」で結んで指定すれば可能です。

単純な変数型で無い場合もあります。例えば、`Transform.position`は以下のようになります。

```csharp:Transform.position
public Vector3 position;
```

この場合は、更に`Vector3`という型を調べると、構造体(`struct`)であることが判ります。

参考：[http://docs.unity3d.com/jp/current/ScriptReference/Vector3.html](http://docs.unity3d.com/jp/current/ScriptReference/Vector3.html)

この構造体はまたメンバを持っています。そのx座標は以下のようになっています。

```csharp:Vector3.x
public float x;
```
引用元:[http://docs.unity3d.com/jp/current/ScriptReference/Vector3-x.html](http://docs.unity3d.com/jp/current/ScriptReference/Vector3-x.html)

これにアクセスしたい場合は、ドット演算子「`.`」で結んで指定します。

```csharp:sample
float xTemp = transform.position.x;
```
このように型が何かを調べて適宜、値を参照しましょう。

C#の基本仕様はこちらが参考になります。
[https://msdn.microsoft.com/ja-jp/library/ms173118.aspx]
(https://msdn.microsoft.com/ja-jp/library/ms173118.aspx)

###<i class="fa fa-cube"></i>メソッド

* `class`のメンバで、何らかの処理をするメンバーを「メソッド」と呼びます。
* フィールドとの記述の違いは、名前の後ろに`()`が在るか否かです。
* 「メンバ関数」とよぶ場合も在ります。
* Unityリファレンスでは「Public 関数」「Static関数」を示しています。

#### Public関数
* 関数には`Public`では無い`private`の関数も存在しますが、UnityEngineで定義されたclassを用いる場合、利用できるのは`Public`のみになります。

`Transforam`では、以下を例に取ります。

```csharp:Transform.Translate
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);
```
引用元：[http://docs.unity3d.com/jp/current/ScriptReference/Transform.Translate.html](http://docs.unity3d.com/jp/current/ScriptReference/Transform.Translate.html)

このPublic関数は指定したベクトルによってTransformを移動させる処理を実行します。

|`public` |`void` |`Translate(`|`Vector3 translation`|`Space relativeTo = Space.Self`|`);`|
|:--------|:-----|:-----------|:-----------|:-----------|:-----------|
|外部から参照可能|戻り未指定|メソッド名がTranslate|一つ目引数がVector3型|相対指定（未指定は自分)|終わり|


2種類が在るのは、同じ名前で引数（渡すパラメータ）を複数の種類、用意している「オーバーロード」という仕組みです。一つ目の場合は`Vector3`を用いて、以下のように記します。

```csharp:サンプル(1)Transform.Translate
Vector3 v = new Vector3(10.0f, 2.5f, -5.0f);
transform.Translate(v);
```

これを同じ処理が以下の形でも可能です。

```csharp:サンプル(2)Transform.Translate
transform.Translate(10.0f, 2.5f, -5.0f);
```

使い分けは、どちらの形で使いたいかによります。


#### static関数

* クラスごとに唯一つの実体を持ち、すべてのインスタンス(classをコンポーネントなどで実体化したもの)の間で共有されます。
* classを破棄する`
Destroy`のように、同じ処理しかしないもの、一つあれば構わないものに向いています。
* Staticの場合、クラスに属するメソッドになるので、`GameObject.Destroy( this );`というようにclass名に続けて指定します。


---
この記事は以下でシリーズしていますので、適宜、参照してください。
[UnityでのC#の基礎]
(http://qiita.com/JunShimura/items/f87c599b3738b804f605#unity%E3%81%A7%E3%81%AEc%E3%81%AE%E5%9F%BA%E7%A4%8E)