UnityとC#まとめ

UnityとC＃についてまとめました
https://qiita.com/MtBigYashi/items/dc0a6d970266a56d507e

# クラスについて　
C#の説明
```.cs

using System;
public class Example {
    public static void Main()
    {
        Calc cal1 = new Calc();
        int c1
        c1 = cal1.ADD();
        Console.Write(c1);
    }
}
class Calc{
    private int prinum1;
    public int pubnum1; 
    public Calc(){//コンストラクタ
        prinum1 = 2;
        pubnum1 = 3;
    }
    public int ADD(){
        return prinum + pubnum;
    }
}
// 出力5
```
クラスCalcを宣言しクラスCalcで変数名cal1をインスタンス
cal1内のADD関数にアクセスし返り血をもらい標準出力
public Calc()はコンストラクタで変数の初期化を行う

unityの説明
unity では　クラスとしてテキストやゲームオブジェクトなどがある
例えばゲームオブジェクトクラスには変数、コンストラクタ、public関数、static関数がある
Transform（変数）やFind（関数）など　公式からいろいろ見れる
https://docs.unity3d.com/ja/2018.4/ScriptReference/GameObject.html

# GetSetについて
変数はprivateのまま、他のクラスから読み書きがしたいときに用いる
public 関数をクラスとprivate変数の間に挟むことでアクセスできるようになる
間違えてcal1.num = 1000;と直接変更ができないようになる


```.cs

using System;
public class Example {
    public static void Main()
    {
        Calc cal1 = new Calc();
        int c1
        cal1.Top = 4;
        Console.Write(cal.Top);
    }
}
class Calc{
    private int num1,num2;
    public Calc(){//コンストラクタ
        num = 2;
    }
    public int Top{
        set{num = value;}
        get{return num;}
    }
}
// 出力4
```

メモ　
static のスコープはクラス内

# 継承
Monobehaber を継承しているよ
protected 使い方
```.cs
using System;
public class Example {
    public static void Main()
    {
        Calc cal1 = new Calc();
        Calc cal2 = new Calculation();
        int c1;
        cal2.Move();
        //Console.Write(cal1.Top);
        Console.Write(cal2.num2);
    }
}
class Calc{
    public  int num2;
    public Calc(){//コンストラクタ
        num2 = 2;
    }
    public int Move(){
        return 0;
    }

}
class Calculation : Calc{//派生クラス名　:　基本クラス名
    public int b;
    public Calculation(){
        b = 20;
    }
    public void Move(){
        num2 = b;
    }
}
//出力２
```
Calc cal2 = new Calculation();によって派生クラスのオブジェクトを基本クラスのオブジェクトとして扱う場合基本クラスのメンバが呼び出される。
ここではCalcクラスのMove関数が呼び出されるため、num２の代入処理はされない。
ここで必要になるのがvirtualとoverride

```.cs
using System;
public class Example {
    public static void Main()
    {
        Calc cal1 = new Calc();
        Calc cal2 = new Calculation();
        int c1;
        cal2.Move();
        //Console.Write(cal1.Top);
        Console.Write(cal2.num2);
    }
}
class Calc{
    public  int num2;
    public Calc(){//コンストラクタ
        num2 = 2;
    }
    public virtual int Move(){//同じ名前で再定義される可能性のあるメンバ
        return 0;
    }

}
class Calculation : Calc{
    public int b;
    public Calculation(){
        b = 20;
    }
    public override int Move(){//同じ名前で定義するメンバ
        num2 = b;
        return 0;
    }
}
//出力20
```
派生クラスからアクセスできるアクセス演算子としてprotectedを利用する。

# 抽象クラス　と　インターフェース
抽象クラス
関数の名前を提供し、派生クラスのオブジェクトをまとめて扱うことを目的として設計されるもの
オブジェクト作成はできないので抽象クラスを継承したクラスでオブジェクトを作成するのが基本
```.cs
abstract class クラス名 {
    virtual メソッド名(引数リスト){
        処理；
    }
}

```
インターフェース　
メソッドの内容を定義できないようにした抽象クラス
```.cs
interface class クラス名 {
    virtual メソッド名(引数リスト);
}
```


# unity でのクラス例
Transformコンポーネントについて
ゲームオブジェクトはコンポーネントの入れ物という考え方ができる
ゲームオブジェクトには初めからgameobjectコンポーネントアタッチされている
以下にコンポーネントにアクセスするGetComponent関数の使い方を記載
```.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class renshuu : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        Transform myTransform = this.gameObject.GetComponent<Transform>();
        //Transform mytransform = this.transform;と省略できる
        mytransform.position = new Vector3 (1,1,2);
    }
}
```
他のクラスを取りたいときGetComponent<クラス名>();で取れる
gameobjectクラスの中にTransform がある
transform クラスの中にvector3型変数　positionがある。
アクセスできない変数もある　例transform.position.x 
GetComponent<>();関数でほかのクラスを参照するのが良い

rigidbodyの場合
Unityの画面右下からAddComponentよりRigitbodyを追加

同様にGetComponent関数で値を取得できる
変数としてmass、publicな関数としてAddForce関数がある。
参照元　https://docs.unity3d.com/ja/2018.4/ScriptReference/Rigidbody.html

```.cs
void Start () 
{
    Rigidbody rb = GetComponent<Rigidbody>();
    // オブジェクトのリジッドボディの質量を変更する
    rb.mass = 10f;
    // リジッドボディに力を加える
    rb.AddForce(Vector3.up * 10f);
}
```


他に取り方は？






```.cs


```
```.cs


```