はじめてのUnity②

# チュートリアル実践memo
## 1.どのチュートリアルをやるのか？
Unity LeanというUnityの公式学習サイトで沢山のチュートリアルが用意されています。
今回私が試したのはこちら。初めて触る自分にとって基礎を学ぶには最適でした。

[Unity入門チュートリアル 「玉転がし」(Roll-a-Ball) Bolt版](https://learn.unity.com/project/bolt-roll-a-ball-tutorial?courseId=606c107eedbc2a0afb98ea50)

追伸
当時はありませんでしたが、現在はBolt版とVisual Scripting版がそれぞれ公開されているようです。
[Unity入門チュートリアル 「玉転がし」(Roll-a-Ball) ビジュアルスクリプティング版](https://learn.unity.com/project/roll-a-ball-visual-scripting-jp)


## 2.いざ実践
基本的にはガイドの通り進めていきます。以下、備忘録。

### プロジェクト作成
始めてみると、いきなりガイダンスに掲載されている画面となんか違う。
チュートリアルのバージョンがUnity2019.4、私の環境はUnity Hub3.1.2となっており、バージョン差異によるもの。ここはなんとなく「新しいプロジェクト」ボタンからプロジェクトが作成できた。

### エディタのレイアウトを統一する
プロジェクト作成が完了すると、エディタが開きます。
レイアウトはいくつか選べるみたいですね。好みでしょうか。
GameタブのAspectは4:3は選べず。16:9で進めます。

### インターフェースの使い方
エディタの画面構成を学習することができました。私の中の理解を端的にまとめました。

- シーン(Scene)ビュー
作成したオブジェクトを視覚的に確認・操作ができる画面。

- ゲーム(Game)ビュー
利用者からみた画面。UI。

- ヒエラルキー(Hierarchy)ビュー
新規オブジェクトの作成と、作成したオブジェクトの一覧表示。

- インスペクター(Inspector)ビュー
作成したオブジェクトやアセットのパラメータの参照・変更。

- プロジェクト(Project)ビュー
プロジェクト内のファイル情報。構成はOS上の階層構造を踏襲。

### Sceneビューの移動方法

最初は戸惑いましたが慣れですかね。
普段PCゲームをする人なら操作感は違和感ないのでしょうか。

- マウスホイール：Sceneビューの拡大・縮小
- 右クリックを押しながらドラッグ：視点を回転 
- 真ん中クリックを押しながらドラッグ：Sceneビューの平行移動
- オブジェクトをダブルクリック：指定のオブジェクトにフォーカス

### Boltのインストール

Bolotはビジュアルスクリプティング機能（コーディングせずにGUIでスクリプトが作成できる）を用いる為のアセットですが、Visual　Scriptingの機能はUnity2021.1以降は標準でパッケージとしてインストールされています。理解する前にBoltインストールしちゃいましたが、後になって不要だったと知りました。

### オブジェクトの作成・変更

- 3DオブジェクトはHierarchyビューから作成実施
    - 地面：Plane
    - 壁：Cube
    - ボール：Sphere (今回のPlayer)
- 色の変更はProjectビューからMaterialファイルを作成
    - InspectorのAlbedoから色を変更
    - MaterialをHierarchyのオブジェクトにドラッグ＆ドロップで色が反映される
    
### ボールを落とす・転がす・演算機能の追加

PleyaerのInspectorビューからAdd Component→Rgidbodyを追加するだけでボールが自由落下する。初めて動きが出た。感動。
入力機能の設定はBoltを使った手順になっているが、Visual Scriptingでも同様の操作になるので、難なく設定ができました。

- Update Event ユニットは、後続処理を毎フレーム更新時に呼び出す。
- FixedUpdate Event ユニット は、物理演算でキャラクターが動く度に、後続処理を呼び出す。
- Input.GetAxis ユニットは、キーボード入力を受け取ることができる。 
- Rigidbody.AddForceユニットは、取得したキー入力を元に力を加える。今回はInput.GetAxis ユニットの入力をrigidbodyに力を加えている。
- Multiply ユニットは力を増幅させることができる。今回は10倍に増幅。
- インスペクタビューの Variables で定義した変数（今回はSpeed)はVisiual Scripting上にドラッグ＆ドロップするとGet Variable ユニットが生成される。Multiply ユニットの入力とすることで、増幅する値を変数にすることができる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/00aa8b96-9fe5-b2e7-a4bf-3a3eb1d47995.png)

### カメラを動かす

- Playerの子にMain Cameraを配置するだけで、オブジェクトを追随してくれる（親オブジェクトとの相対座標を保持）
- ボールが回転するため、ただ追随するとカメラも回転してしまう。Visiual Scripting（グラフ）でカメラを制御する。やっていることはこんな感じ。
1\. PlayerとCameraの初期位置を設定
2\. PlayerとCameraの初期位置の差分を計算して、相対距離を求め、offset変数に入れる
3\. 現在のPlayerの位置を取得し、求めたoffsetの分加算してcameraの位置を設定する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/8cf607f2-7156-db0a-ff37-e98aae62f5a6.png)

### アイテムの作成

カプセル(Capsule)オブジェクトをアイテムとして作っていく。同じオブジェクトを複製するには、prefabとして書き出すと便利。以下はVisiual Scriptingでの制御
- Capsule ColliderのIs Triggerをon（チェック）することで、接触したことを検知できるようになる
- OnTriggerEnter Event ユニット上の接触対象タグが"Player"であれば、オブジェクトを削除するフローを作る(Playerオブジェクトにタグ「Player」の設定も必要）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/c4634703-adc9-d758-967a-3068eb3cf135.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/751d4f30-851f-ed40-d6ce-b6145e8b3507.png)

### 残アイテム数の表示

- UIの表示はCanvasオブジェクトが必要。今回は数値をTextオブジェクトで表示
- Canvas Scalerの設定によって表示のされ方が異なる
    - Constant Pixel Size：画面サイズによらず、サイズが固定（ピクセル基準）
    - Constant Physical Size：画面サイズによらず、サイズが固定（実単位基準）
    - Scale With Screen Size：画面サイズ（解像度）によって拡大・縮小される。画面内でのGUIバランスが保たれる。今回はコレ。横幅と縦幅どちら/または両方を基準に拡大・縮小するかなども設定する。
- Item数をカウントするためにItemタグを作成し、ItemオブジェクトにItemタグを設定。
- GameControllerオブジェクトを作成し、ITemタグをカウントし、表示先のScoreLabelにテキスト表示させるグラフを作成![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/f1441ab9-48f9-c6f1-7073-8bb66ca42c8c.png)

### クリア時のUIの表示

- WinnderLabelを作成し、クリア時に表示するテキストを設定（非表示設定）
- Itemsタグを参照し、0になったらWinddnerLabelを表示させるグラフを作成![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/cff07c5d-e20c-98e9-eabb-a38d116c103f.png)

### ぶつかってはいけない壁の作成

- Material内Emissionにチェックを入れると発光するオブジェクトが作成できる。ちなみに、「Post Processing」パッケージを入れるとより自然な発光を表現できるそう。（光が滲む感じ）
　参考：[【Unity】Post Processing(ポストプロセス) を使って画面演出をリッチにする](https://www.midnightunity.net/unity-post-processing/#Post_Processing_%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95)
- Inspectorビューのstaticにチェックを入れると、動かないオブジェクトとして処理が最適化される。
　参考：[静的ゲームオブジェクト](https://docs.unity3d.com/ja/2018.4/Manual/StaticObjects.html)
- ライト（太陽光）の輝度はInspectorビューのIntensityで変更できる
- ヒエラルキービューでBox ColliderのIs Triggerをon（チェック）することで、接触したことを検知できるようになる
- グラフを作成。アイテム取得と同様に、On Trigger EnterユニットでPlayerとの接触を検知。現在のシーンを再読み込みするのもそれに応じたユニットが存在（SceneManagerユニット) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/06457053-e4d8-7ad2-5a89-dc4e011ac8ed.png)

以上で完成。
結構楽しめました。