UnityをC#で超入門してみる #1 Unity入門の章

![uni.png](https://qiita-image-store.s3.amazonaws.com/0/26030/b2e6c7f0-32e5-4753-f226-4d964101575b.png)
http://japan.unity3d.com/unity/

#はじめに
！注意！
この記事郡が最初に投稿されたのは、2014/01/02です。
Unity4時に作成されたものですから、情報が古い場合があります！

14/12/18記
リンク先アドレスを更新しました。

ゲームの作り方についてはまずこちらをご覧ください！
「ゲーム　作り方」テラシュールウェア
http://tsubakit1.hateblo.jp/entry/20140218/1392651856

全体的に編集中箇所多いです。
ご指摘いただけると助かります。


##参照サイト
この記事群は公式リファレンスと
以下のサイトを参考にさせて頂いております。
どれもとても参考になる素晴らしいUnity及びC#コンテンツです。
まずはこちらをご訪問ください。

・ActionScript入門Wiki@rsakane氏 Unity
　　http://www40.atwiki.jp/spellbound/pages/1303.html
・ドットインストール Unity入門
　　http://dotinstall.com/lessons/basic_unity
・WisdomSoft@赤坂玲音氏 Unity入門
　　http://www.wisdomsoft.jp/35.html
　　　→本を出版されたようです! →[こちら](http://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEUnity%E5%AE%9F%E8%B7%B5%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%EF%BD%9E-%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%99%E3%81%90%E3%81%AB%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%85%A5%E9%96%80-%E8%B5%A4%E5%9D%82-%E7%8E%B2%E9%9F%B3/dp/4774173037/ref=sr_1_4?ie=UTF8&qid=1429668426&sr=8-4&keywords=unity+%E5%85%A5%E9%96%80)


・ゲームクリエーター特訓@尾形薫氏
　　http://www.ws.ic.kanagawa-it.ac.jp/GameCreator/ogata/
・GClue Unity blog
　　http://unitygclue.blogspot.jp/

・窓を視ればアマグラマ > C# 階梯　@長尾氏
　　http://www.wgag.net/csharp/index.html#flow
・C# によるプログラミング入門　@岩永信之氏
　　http://ufcpp.net/study/csharp/#index-intro


##筆者のQiita記事でUnityと関係ありそうなもの

よく使いそうな関数をまとめました。
・Unity使いそうな関数まとめメモ
　　http://qiita.com/hiroyuki_hon/items/4c3bd290c795b2481ebd

UnityへのMMDモデルの取り入れについてはこちらを御覧ください。
・MMD4Mecanimを使用してMMDモデルにUnityで踊って頂いてみた。
　　http://qiita.com/hiroyuki_hon/items/931c79164b0ffe19517f

・C#私的超入門#1
　　http://qiita.com/hiroyuki_hon/items/9ce9709b4a6f8c797a43

安価で没入度の高いヘッドマウントディスプレイ、Oculus Riftに関する記事です。
・Oculus Rift を手に入れたらこれを遊ぼう！
　　Oculus Rift とはヘッドマウントディスプレイの名称です。
　　安価(300$)で視野が広く、Unityと簡単に連動させることができます。
　　http://qiita.com/hiroyuki_hon/items/d8b240d1e4e327fc6b48

・Oculus Rifter はこれを見よう！
　　http://qiita.com/hiroyuki_hon/items/de2b8194d5a6703fd83a

・Unity/Oculus関連素敵記事等まとめ
　　http://qiita.com/hiroyuki_hon/items/8917ff250bd0452e7e05

また筆者の投稿記事のまとめはこちらです。
　　http://qiita.com/hiroyuki_hon/items/00dbac79351137509149


#UnityをC#で超入門してみる
##UnityをC#で超入門してみる #0　超目次
目次詳細
　　http://qiita.com/hiroyuki_hon/items/c4da01e1c94bbba2c071


### #1.Unity入門の章
・はじめに
・変数
・メソッド
・クラス

### #2.ゲームオブジェクトの章
・カメラ
・ゲームオブジェクト
　　http://qiita.com/hiroyuki_hon/items/5211a1853647eee38d51

### #3.計算の章
・C#の文法
・mathfクラス
　　http://qiita.com/hiroyuki_hon/items/3326206dcedb4e5013d4

### #4.GUIの章
・GUI
・シーン遷移
　　http://qiita.com/hiroyuki_hon/items/af0a52c1cb9e856f32b2

### #5.時間と入力の章
・時間
・入力
　　http://qiita.com/hiroyuki_hon/items/17e573842faf39bb3d21


# #1　Unity入門の章　目次
　はじめに・変数・メソッド・クラス

####はじめに
　Unityの入門書籍について
　Unityでスクリプトを書いてみよう　Hello World!
　コメントアウトをしよう

####変数
　変数を使ってみよう
　コンポーネントを変数の型として使おう
　Inspectorを使って変数を操作してみよう(1)(2)

####メソッド
　メソッドを使ってみよう
　メソッドの引数を取ろう
　メソッドの呼び出し時にウェイトをかけてみよう

####クラス
　クラスを作ってみよう
　ある時に呼ばれる、呼ばれ続ける関数達を知ろう(オーバーライド関数)
　void Updateを使って継続的にプログラムを再生しよう
　衝突判定をみてみよう
　トリガーを処理しよう
  
　VisualStudioを用いたC＃の入門について

#Unityの入門書籍について(14/01/07 記)

[Unity本まとめメモ　2015/4/15時点](http://qiita.com/hiroyuki_hon/items/6781cd3e7dbca66d8fda)を作成しました。ご参考まで


###筆者のおすすめライン結論
1.Unity4入門
2.Unityで作るスマートフォン3Dゲーム開発講座
3.Unityライブラリ辞典＆ゲームの作り方 Unityで覚える遊びのアルゴリズム

###おすすめUnity系書籍
筆者の読んだUnity系書籍でお勧めのものを紹介します。
Unityの入門書はいくつか出版されているので、自分の肌に合うものがよいと思います。
私がまったくの初心者の方にUnity4系を始めるのにあたってお勧めの書籍は、
以下です。

#####■Unity4入門 最新開発環境による簡単3Dゲーム製作
＠浅野 祐一氏, 荒川 巧也氏, 森 信虎氏

次に、上記の書籍から一歩進みたい時にお勧めなのが以下です。

#####■Unityで作るスマートフォン3Dゲーム開発講座 Unity4対応
＠夏木 雅規氏, 寺園 聖文氏

#####■Unity 4マスターブック―3Dゲームエンジンを使いこなす
＠和泉 信生氏

注意点：3Dゲーム開発講座内のソースコードの商用利用は、
株式会社翔泳社様への一報が必要となります。

次に読む書籍はライブラリ辞典がおすすめです。

#####■Unityライブラリ辞典 ランタイム編
＠安藤 圭吾氏 

値段が入門系の書籍類と比べると高く、
読みにくそうな印象を受けるかもしれません。
ですが、もし続けてUnityを触るならば是非購入を検討してください。

まずは、55ページにあるDestroyを写経したり、
例えば451ページのTimeを以下のように使ってみたりして
この本を使うコツを掴みましょう。

```csharp
	public float i;
	public float j;
	
	void Update ()
　　　　　{
		i = Time.time;
		print ( i );

		j += (Time.deltaTime);
		print ( j );
	}
```

また、サンプルコードが非常に豊富な書籍として

#####■ゲームの作り方 Unityで覚える遊びのアルゴリズム
＠加藤 政樹氏

があります。
ソースコードを自由に使わせていただくことが出来ます。
アセットは不可です。
様々なゲームのアルゴリズムを学ぶ事ができます。
この書籍をランタイム辞典を片手に引くことで、
ゲーム制作するに必要な多くのことが学べるかもしれません。

これ以降は他のUnity本や、Unityで作成したいプログラムの
ジャンルに応じた書籍を読んでいく事になると思います。
例・子供用ゲームが作りたい→児童書、教育系書籍等。

###Unity系書籍の言語の混在について
書籍によって使用する言語がC#とJavaScriptで混在しますが、
気にしないで進むのが良いです。
理由はどちらの言語で書いても（プロジェクト内で混在させても）スクリプトは動くということと、
理解が進めばどちらかの言語で自分で書き直せば良いからです。
参考：多くのUnityユーザはC#に落ち着くようです。


#Unityでスクリプトを書いてみよう　Hello World!

まずレイアウトを2by3にします。（任意です。）
最初は何もないのでこうなります。
![スクリーンショット 2014-01-02 14.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/26030/134eed99-6ed4-b260-bc3d-1fd2f8e45b2f.png)

おもむろに
Project > Create > C# Script　を選択し
NewBehaviourScriptを作成します。
![スクリーンショット 2014-01-02 13.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/26030/32caffe2-e1d6-16ee-4205-a6eeb2f68c9f.png)


メニューバーから
GameObject > CreateEmpty で空のゲームオブジェクトを作成します。
空のゲームオブジェクトにスクリプトをドラッグ＆ドロップします。
こうなります。
![スクリーンショット 2014-01-02 14.03.17.png](https://qiita-image-store.s3.amazonaws.com/0/26030/57006c12-560a-751a-9fc9-e5e93125a060.png)

NewBehaviourScriptをダブルクリックすると、
以下の様な文字列が出てきます。
画像のエディタはSublimeText(http://www.sublimetext.com) です。
![スクリーンショット 2014-01-02 14.08.56.png](https://qiita-image-store.s3.amazonaws.com/0/26030/998f6342-d89f-7a11-ad1e-a4941a5227fb.png)

Unity標準のエディタはMonoDevelopです。
通常はMonoDevelopで問題ありません。
標準エディタの変更は、
メニューバーからUnity > Preferences を選択、
External Tools > External Script Editor で行えます。

では、NewBehaviourScriptを編集します。
void Start () {}の{}の中に書きます
こう書きます。
Debug.Log("Hello World!");

![スクリーンショット 2014-01-02 14.23.55.png](https://qiita-image-store.s3.amazonaws.com/0/26030/c836ac4f-c3c3-9cbb-ccae-83c1c49d3bb4.png)

再生するとコンソールにこう出ます。
コンソールの表示方法は Window > Console です。
![スクリーンショット 2014-01-02 14.27.42.png](https://qiita-image-store.s3.amazonaws.com/0/26030/1491bbca-7b5a-f354-a44c-6a0ffb78a939.png)

""の中を書き換えることで表示する文字列を変更出来ます。
![スクリーンショット 2014-01-02 14.33.17.png](https://qiita-image-store.s3.amazonaws.com/0/26030/f71d6653-9297-64df-2505-72f8c7c9820b.png)
![スクリーンショット 2014-01-02 14.33.53.png](https://qiita-image-store.s3.amazonaws.com/0/26030/e4d12cc4-2cd7-504a-dbb5-7fbb51563d1d.png)


#コメントアウトについて
C#のコメントアウトは
//　行末までのコメント 
と
/* コメント */　になります。



##変数

#変数を使ってみよう
こう書くと
![スクリーンショット 2014-01-02 14.46.05.png](https://qiita-image-store.s3.amazonaws.com/0/26030/07d9bdcf-8566-6918-d94d-0fca92fdfb62.png)
こう出ます。
![スクリーンショット 2014-01-02 14.47.14.png](https://qiita-image-store.s3.amazonaws.com/0/26030/41180d53-de23-bdf9-440d-c44d6611c273.png)
int が型、valueが変数名ですね。

```csharp
	int    i  = 10;   //整数型
	double d  = 1.0;  //実数型
	bool   b  = true; //論理値型
	string s = "str"; //文字列型

void Start () {
		print(i); //出力:10
		print(d); //出力:1
		print(b); //出力:True
		print(s); //出力:str
	}
```

#コンポーネントを変数の型として使おう
コンポーネントは変数の型としても使用することが出来ます。

```csharp
Transform trans;
Rigidbody rigid;
Audio audio;
Camera camera;
```

コンポーネントを型に取り、publicにすることで
容易にTargetとして利用出来るようになります。
エディタ上でターゲットとしたいオブジェクトをD&Dします。

```csharp
public Transform target1;
public GUIText target2;
```

#Inspectorを使って変数を操作してみよう
public Transform trans; と書き、
Debug.Log(trans.position); と書きます。

trans は変数名ですので書き換えが可能です。
.position が変数に指定したもののポジションを出すとする何かです。
すなわち　変数名.position のように書きます。

![スクリーンショット 2014-01-02 15.04.50.png](https://qiita-image-store.s3.amazonaws.com/0/26030/11c56805-5a78-7560-215a-8a24822963ce.png)
InspectorにTransと書かれた箱が出てきます。
public Transform trans; と書いたためです。
![スクリーンショット 2014-01-02 15.08.33.png](https://qiita-image-store.s3.amazonaws.com/0/26030/dd45e1d4-5bfa-682f-18f4-2c153165aeed.png)
この箱に、MainCameraをドラッグ＆ドロップで入れてみます。
![スクリーンショット 2014-01-02 15.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/26030/002c5122-43e1-88d1-8ffc-a196f77853d7.png)

再生してみると、なんとコンソールにMainCameraのポジション情報が出ます。
![スクリーンショット 2014-01-02 15.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/26030/03084ae2-e316-61bf-cc45-9540296899a1.png)

変数名は名前なので書き換えが出来ます。
例えばtransをtfに書き換えます。
![スクリーンショット 2014-01-02 15.37.05.png](https://qiita-image-store.s3.amazonaws.com/0/26030/40ffa5df-a497-2e79-af54-247c8dc2799e.png)
するとInspectorに表示される名前が変わります。
![スクリーンショット 2014-01-02 15.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/26030/1e05de75-d607-df51-c523-608a3817c826.png)
ただし、Debug.Log(trans.position); は、transの変数名が無くなったので実行が出きなくなります。
ここを、Debug.Log(tf.position); 　 に書き換える必要があります。

#Inspectorを使って変数を操作してみよう（2）
int型の変数を表示してみます。
public int value;　と書いて、
Debug.Log(value);　と書いてみます。

![スクリーンショット 2014-01-02 15.52.16.png](https://qiita-image-store.s3.amazonaws.com/0/26030/90f23d84-0283-3f3b-0bc8-3b6ae94aecde.png)

すると、Valueが出ます。
![スクリーンショット 2014-01-02 15.55.29.png](https://qiita-image-store.s3.amazonaws.com/0/26030/af0f1d39-fd63-09e0-029b-49d301b34501.png)

というわけで、おもむろに10000と入れて再生してみると、
コンソールにも10000と出ます。
![スクリーンショット 2014-01-02 15.56.26.png](https://qiita-image-store.s3.amazonaws.com/0/26030/c92820c7-ded0-4933-a1bd-1c72e2e5dbe0.png)



##メソッド

#メソッドを使ってみよう

```csharp
//helloWorld()メソッド
void helloWorld()
{
　Debug.Log("HelloWorld");
}


void Start ()
{
//helloWorld()メソッドの呼び出し
　helloWorld();
}

//出力：HelloWorld
```

##メソッドの引数を取ろう

```csharp
int test(int j){
	if ( j == 0){
		return 0;
	}
	else{
		return 1;
	}
}
	// Use this for initialization
	void Start () {
			int k1;
			k1 = test(1);
			print(k1);
	//出力：1

			int k2;
			k2 = test(0);
			print(k2);
	//出力：0
	}
```

#メソッドの呼び出し時にウェイトをかけてみよう
Invokeを使用します。
設定したメソッドを1度だけ呼び出します。

```csharp
	void Start () {
		Invoke("Hello",3);
	}
	
	void Hello (){
		print("Hello!");
	}

```

#クラスを作ってみよう
class bookを作成して使ってみます。

```csharp
public class NewBehaviourScript : MonoBehaviour 
{
	void Start ()
	{
		Book book1  = new Book();
		book1.title = "タイトル";
		book1.name  = "山田太郎";
		book1.lent  = false;

		print(book1.title); //出力:タイトル
		print(book1.name);  //出力:山田太郎
		print(book1.lent);  //出力:false
	}
}

class Book
{
	public string title;
	public string name = "山田";
	public bool   lent = true; 
}

```

#ある時に呼ばれる、呼ばれ続ける関数達を知ろう(オーバーライド関数)
ある時に呼んだり、呼び続けたりする関数である
オーバーライド関数は便利です。
いつ、何回呼びだすかに注目すると理解が進みます。

デフォルトのスクリプトの中に書かれている
Start() と Update() は、オーバーライド関数です。

```csharp
void Start(){
//ここに処理を書く
}
```

Start()　はじめに一度だけ呼び出します。
((いつ)はじめに、（何回）一度だけ）

Update() 毎フレーム呼び出します。
（いつ）Start()の後に(何回)毎フレーム)


主なオーバーライド関数
Invoke() 設定したメソッドを、　設定した秒数後に、一度だけ呼び出します。
Awake() スクリプトが読み込まれるときに、一度だけ呼びだします。

On系
OnMouse◯◯()系　マウスが乗った時等に呼び出します。
OnTrigger◯◯()系　トリガー状態のオブジェクトとの衝突状態によって呼び出します。
OnCollision◯◯()系　オブジェクトの衝突状態によって呼び出します。
OnControllerColliderHit() キャラクターコントローラーの衝突の際に呼び出します。
OnEnable() オブジェクトが有効状態になった時に一度呼び出します。
OnDestroy() オブジェクトが破棄される直前に呼び出します。
OnApplicationQuit() アプリの終了直前に呼び出します。

OnGUI()  GUIの描画やイベントを処理する関数です。
以下のようにして使います。

```csharp
	void OnGUI(){
		GUILayout.Label("Label");
	}
```



#void Updateを使って継続的にプログラムを再生しよう
これまではvoid Startの中に書いてきました。
オーバーライド関数 Start() は、
名前の通りのスタート時に一度だけプログラムを実行します。
プログラムを継続的に実行したい場合は、
オーバーライド関数 Update() の中に書きます。

オーバーライド関数 Start() は、
オーバーライド関数 Update() の前に一度だけ呼び出されます。

こうです。
![スクリーンショット 2014-01-02 15.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/26030/ba78acd0-744f-4c9a-8fdc-bf9b7d76565c.png)
この状態で再生してみます。
こうなります。
連続してポジションが取られているのが分かります。
![スクリーンショット 2014-01-02 15.26.42.png](https://qiita-image-store.s3.amazonaws.com/0/26030/ef4fd14d-5ab0-c40f-4a4f-80296e27499e.png)
カメラの位置を変えてみます。
適当にMainCameraを選択して矢印を引っ張ります。
![スクリーンショット 2014-01-02 15.28.38.png](https://qiita-image-store.s3.amazonaws.com/0/26030/974bdb00-ad7f-bda2-0bac-5e8eebb72123.png)
めでたくコンソールに表示されるポジションの情報が変わりました。
![スクリーンショット 2014-01-02 15.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/26030/5067dece-a4d7-0feb-4ba1-0cf54947709d.png)


#衝突判定をみてみよう
以下のようにして衝突したら破壊してみよう。
オーバーライド関数 OnCollisionEnter()　は、
衝突判定があった時に呼び出されます。

```csharp
void OnCollisionEnter(Collision collision) {
     Destroy(collision.gameObject);
}
```

破壊するオブジェクトをタグで選別してみよう。
オブジェクトのTagからAdd tagでタグを生成します。
switch文を用いて "testtag": タグを選択すれば、
このタグが選択されているオブジェクトのみを破壊します。

```csharp
void OnCollisionEnter(Collision collision) {

	switch(collision.gameObject.tag) {
		case "testtag": Destroy(collision.gameObject);
		break;
```

ただしキャラクターコントローラーの衝突判定については
別に専用のものがあるので注意が必要です。
オーバーライド関数 OnControllerColliderHit() を用います。

```csharp
void OnControllerColliderHit(ControllerColliderHit hit) {
// 衝突した時の処理を書く
}
```

#トリガーを処理しよう
トリガーを設定するとすり抜けられるようになります。
イベントの発生する場所の設定などにつかえます。
オーバーライド関数 OnCollisionEnter()を用います。

```csharp
function OnCollisionEnter(Collision collision)
{
//トリガーの処理を書く
}
```


#ここは内容が古いです！！現在はUnityVSを用いましょう！

##普通にMicrosoft Visual Studio Express 2013 でC#を始める
Microsoft Visual Studio Express 2013 for Windows Desktop をDL
登録が必要、規約に同意してインストール、起動。
http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop
新しいプロジェクト＞C#＞コンソールアプリケーション

        static void Main(string[] args)
        {
            Console.WriteLine("HelloWorld!");
        }

で開始で出る。

~~##VisualStudioを用いたC＃の入門について~~

VisualStudioを用いたC＃の入門動画については
・【C#】魔理沙が計算機の魔法に挑戦　導入編【流体力学】
http://www.nicovideo.jp/watch/sm22224128
の”プログラム編”がオススメです。

上記動画のコードを書き起こさせていただく形で記事を書きました。
・C#プログラミング入門してみる、ただし忍者を実際基軸に、いいね？
http://qiita.com/hiroyuki_hon/items/02ea13ed48cac96129bd


//以下は参考まで、初めての方は、ここを抜いて次の章に移動してください。

UnityでC#を使うにあたりVSを用いるなら、以下の記事を参考にすると良いです。
http://naichilab.blogspot.jp/2013/05/unityvisual-studio-express-2012.html
Unityインストール先のEditorフォルダに Start "" %1 とだけ書いた .bat　ファイルを作成し、
Unityのprefarenceから呼び出すだし、Assets→Sync MonoDevelop ProjectでOKです。

（プロジェクト名-csharp.sln っていうソリューションファイルをあらかじめ開いておくことでインテリセンスが効く）

Sublimeで行うなら、まずパッケージコントロールをここを参考にDLします
https://sublime.wbond.net/installation#st3
終了したら再起動し、Ctrl+Shift+P　で　installと打ち、
Package Controll: Install Package

Unity Snippets and Completes　は自動での補完が可能となります。
こちらをご参考下さい。
http://qiita.com/mikamikuh@github/items/22a760a679025166c9f1

個人的に　Settings-Userで
"font_face": "Consolas",　を足します。



#つづきます
UnityをC#で超入門してみる #2　ゲームオブジェクトの章
http://qiita.com/hiroyuki_hon/items/5211a1853647eee38d51