Unity初心者が「はじめてのUnity」をやる時に、同時に開いておくととはかどる用語集（更新中）

## はじめに


はじめてのUnity（http://tutorial.unity3d.jp/ ）は
Unityに触ったことのない人が基礎を学んで、UnityのIDEに慣れることに非常に適したページでした。

ただ「慣れる」ことが主な目的になっていて
（むしろ目的が明確で、それはこのチュートリアルの良い点である）
理解しながら学びたい自分は、知らない単語が続出して、その調べに時間を食われたので、
同じ学習スタイルの人が現れたとき用に用語集を作ってみました。

1. 後に分からない事が出てきた時は、この用語集をF5で検索し、さくっと思いだす
3. 間違っている用語は更新する

というフローでやっていたら、チュートリアルが一通り終わった時には、
自分一人で簡単なゲームを作るのもかなりスムーズにいったので、
初心者が押さえるべき要点は押さえられたかと思っています。

※初期時にまとめた内容なので、用語の意味が間違っている所あるかもしれませんが、順次直していきます。


## 用語集


#### 基本用語

* プロジェクト
    * ゲーム全体の構成
    * 共通化するオブジェクトやマテリアルやスクリプトの部品を整理
* シーン
    * ゲームの各部を構成する各場面や各ステージ
* ゲームオブジェクト
    * シーン内に配置される全ての要素。ゲーム内の全てのオブジェクトがゲームオブジェクト
    * ゲームオブジェクトは入れ物で、これ自体は何もしない
    * キャラクターや環境や特殊効果になるには、専用のプロパティが必要
    * 目に見える3Dメッシュ、ライト（照明）、物理オブジェクト、 あるいは目に見えないサウンド、トリガーなど様々な形がある
* コンポーネント
    * ゲームオブジェクトを構成する部品
    * ゲームオブジェクトは、このコンポーネントの挙動にしたがって、自身を稼働させたり、他のオブジェクトに影響を与えたりする
* フレームレート
    * 単位はFPS（Frames Per Second）
    * 1秒間の動画で見せる静止画の数（50枚の絵を10秒間に見せる場合は5FPS）
    * FPSが大きいほど滑らかなうごきが出来るが、その分大きなネットワーク回線やデータ容量が必要になる
    * UnityではデフォルトでFPSが設定されている
* アタッチ
    * ゲームオブジェクトにコンポーネントを取り付けること



#### 画面について

* シーンビュー
    * 製作中のゲームの世界を表示
    * いろんな角度から見ることが出来る
* ゲームビュー
    * ゲーム画面。プレイヤーは基本ここを見ながらゲームをプレイ
    * UIの操作はこの画面で行う
* インスペクタービュー
    * シーンの中で選択中のオブジェクトが持つ属性を表示／編集するためのビュー
* ヒエラルキービュー
    * シーン内に存在するオブジェクトの一覧
* プロジェクトブラウザ
    * 製作中のプロジェクト（ゲーム全体）に含まれるシーン、スクリプト、グラフィックやサウンドなどのデータ、その他のリソースがファイル単位で表示
    * ここに出来合いのスクリプトセット、アートアセット、シェーダーなどを「パッケージ」単位でインポート出来る

#### インスペクター

* Pixel Per Units
    * 通常100に設定。これは100pixelが1ユニットになる
    * 1ユニットとはワールド座標における1距離に相当するスプライト画像イメージの幅/高さのピクセル数


#### ヒエラルキー

* 親子関係
    * ゲームオブジェクト同志の関係性を表す
    * 普段は並列に並ぶが、親子関係になると子のGameObjectが親のGameObjectの影響を受ける
    * 例えば親が移動/回転を行えば、子も同じように移動/回転を行う


#### マテリアル

* Albedo
    * 表面のカラー
    * https://docs.unity3d.com/jp/540/Manual/StandardShaderMaterialParameterAlbedoColor.html
* Emission
    * 光の色と強度
    * https://docs.unity3d.com/jp/540/Manual/StandardShaderMaterialParameterEmission.html


#### コンポーネント

* 重力
    * Rigidbody
        * ゲームオブジェクトを物理特性で制御出来るようになる（重量、空気抵抗）
        * https://docs.unity3d.com/ja/current/Manual/class-Rigidbody.html
    * 2DRigidBosy
        * とは
            * 2D上でのRigidBody
        * Gravity Scale
            * ゲームオブジェクトにかかる重力の度合い
            * 1で重力の影響をうけて下にいく
            * 0で何も動かない
        * Vector2
            * 2D座標の位置やベクトルで使用
            * magnitude：ベクトルの長さ（読み取り専用）
            * normalized：magnitudeを1としたベクトル
            * velocity：移動速度
            * https://docs.unity3d.com/ja/530/ScriptReference/Vector2.html
            * https://qiita.com/torano0314/items/bb094618cc8deef88d21
* MonoBehaviour
    * Strat
        * スクリプトが有効で、Updateメソッドが最初に呼び出される前のフレームで呼び出される
    * UpdateとFixedUpdate
        * Update
            * MonoVehaviourが有効の場合に、毎フレーム呼び出される
            * 1秒間に数十回呼ばれるが、1秒間に呼ばれる回数は決まっていない
            * Rigidbodyは相性が悪い。カクついて移動するように見える
        * FixedUpdate
            * 1秒間に呼ばれる回数が固定
            * Inputは相性が悪い。1秒間にきまっているのでInputのスピードに追いつかない場合が出て来る
    * OnGUI
        * レンダリングとGUIイベントのハンドリングのために呼び出される
        * OnGUIを実装した際には毎フレーム複数回（イベントごと一回）呼び出されることを意味する
    * コルーチン（Coroutine）
        * コルーチンじゃない時の課題
            * 時間のかかる処理や、何かを待機する処理は、数秒待機したり、特定の処理が終わるまで待機が可能なコルーチンを使うと良い（Updateで行うと、その処理が終わるまでゲームの進行がストップする）
            * 関数を呼び出すと戻り値を返す前に実行完了される。つまり関数で行われるアクションは一つのフレームで行われるので、関数呼び出しはプロシージャルアニメーションや時間の経過を伴う一連のイベントには使用できない
            * 例えば徐々に透過したいものをUpdateやFadeに組んでも、1フレームで0→1になって一瞬で透過する
        * コルーチンの特徴
            * コルーチンは実行を停止して、Unityへ制御を戻し、続行する時は停止したところから次のフレームで実行を継続することが出来る関数
        * IEnumerator
            * IEnumerator Updateのように書くことで、コルーチンを定義できる
        * 参考
            * https://docs.unity3d.com/jp/540/Manual/Coroutines.html
            * http://tsubakit1.hateblo.jp/entry/2015/11/16/000000
            * https://qiita.com/kwst/items/ce04abce7c1e2c72e023
* インプット
    * GetAxisとGetAxisRow
        * 戻り値がfloat型（移動速度などの変数と掛け合わせて使用する場合が多い）
        * GetAxisは入力された軸に補正をかけて-1から1の範囲をfloat型で返す。入力があってもすぐに-1や1が返らずにだんだん1や-1に近づく
        * GetAxisRawは入力された情報に補正をかけず-1か0か1をfloat型で返す
    * 参考
        * http://tech.pjin.jp/blog/2015/09/30/unity%E3%81%AE%E3%82%AD%E3%83%BC%E5%85%A5%E5%8A%9B%E3%81%BE%E3%81%A8%E3%82%81-%EF%BD%9Einput%E3%82%AF%E3%83%A9%E3%82%B9%EF%BD%9E/#03
        * https://qiita.com/asiram/items/3b2875731efdc34bc65a
* 接触判定（https://docs.unity3d.com/jp/540/Manual/CollidersOverview.html）
    * Collider
        * とは
            * 物理衝突のためのオブジェクト形状を定義
        * Trigger
            * コライダー同志は通常ぶつかり反発する。反発を必要しないものはトリガーにする
            * することでコライダー同士はすり抜ける
        * BoxCollider
            * 立方体をした基本的コライダー
        * PolygonCollider
            * Spriteグラフィックスの形状に高い精度で調整が出来る
        * OnTriggerExit2D
            * トリガー状態のオブジェクトのコライダーと別のオブジェクトのコライダーが衝突から離れた瞬間に呼び出される
    * OnTriggerEnter
        * コライダーがトリガーの領域に侵入したときに呼び出される
        * 判定のみのTriggerの接触判定
    * OnCollisionEnter
        * 物理的な反射を持つColliderとの接触判定
    * Layer
        * とは
            * カメラによりシーンの一部をレンダリングするために、またライトはシーンの一部を照らすため、というように頻繁に使用される
            * 部分的に、Coliderを無視するあるいはレイヤーベースの衝突検出を発生させるためにも仕様
        * 例えば
            * 当たり判定の制御をする
            * onTriggerEdit2Dなどで接触後のDestroyを定義すると全部のColliferで発火してしまう
        * LaymerMask.LayerToName
            * Layerの名前を取得
    * Physics2D.OverlapPoint( Vector2 point);
        * 空間上でコライダーがある地点を含むかをチェックする
        * 戻り値bool：pointがコライダーと重なっているか
* UI
    * Canvas
        * UIが配置、描画される抽象的な領域
        * 全てのUI要素はCanvasコンポーネントがアタッチされたゲームオブジェクトの子でなければならない
        * http://hiyotama.hatenablog.com/entry/2015/05/26/190621
        * https://docs.unity3d.com/jp/current/Manual/class-Canvas.html
    * Sorting Layer
        * スプライトの描画順を変更する
    * QuadとPlane
        * どちらも平面を表現し、画像や動画を表示するために用いられる
        * 画像や動画を表示するためのディスプレイとして利用したり、しんぷるな　GUIや情報を表示するために用いられる
        * QuadはXY方面、PlaneはXZ方面
    * Texture
        * とは
            * 視覚的なエフェクトを与えるためにゲームオブジェクトを覆ったり包んだりする画像やムービーファイル
        * WrapMode
            * Repeat：テクスチャ自体が繰り返す
            * Clamp：テクスチャの縁部分が伸長する
    * GetComponent
        * とは
            * オブジェクトの参照を得るためのメソッド
            * GetComponentをすることで定義したオブジェクトがコンポーネントの参照を得て、コード上で実体を持ったことになる（これをしないと何も起こらない）
            * GetComponentの効力はそのスクリプトがアタッチされているコンポーネントに限る
        * GetComponent<Renderer>().material.***
            * マテリアルの操作が行える
    * ViewPort
        * ViewportToWorldPoint
            * ビューポートをワールド座標にする
            * 画面外判定の範囲を取得する際に仕様
            * たとえばv2(0, 0)で左下、v2(1, 1)で右上
* uGUI
    * とは
        * Unity4.6から搭載されたもの
        * UI作成システム
* 音
    * 仕組み
        * ゲームで発せられる音はMain CameraでアタッチされているAudio Listenerを通して、スピーカーなどから出る
    * 3D Sound
        * 音が発した場所とAudio Lietenerの距離が考慮されて、遠ければ遠いほど音が小さくなる
* その他
    * Instantiate
        * とは
            * オブジェクトの生成
        * 参考
            * https://qiita.com/Teach/items/c28b4fe5ca8dc4c83e26
    * Transform
        * とは
            * シーン内の全てのオブジェクトがTransformを持つ
            * 位置、回転、スケールを格納し、操作するために使用
            * 空のゲームオブジェクトはTransformコンポーネントのみがアタッチされた状態を指す
        * up
            * ゲームオブジェクトが1だけ前に進む方向を示す
        * right
            * ゲームオブジェクトが1だけ右に進む方向を示す
    * RequireComponent
        * RequireComponentを使ったスクリプトをゲームオブジェクトにアタッチすると、必要なコンポーネントが自動的にそのゲームオブジェクトに加えられる
        * セットアップエラーの回避に使える。例えばあるスクリプトでRigidbodyが同じゲームオブジェクトに常に加えられる必要があるとするとき、RequireComponentを使用すると自動的にこれを実行してくれる
    * Destroy(Object obj, float t = 0.0F)
        * T秒後にobjを破壊
        * objはComponentの場合、GameObjectからコンポーネントを削除
        * objがGameObjectの場合、GameObject並びにすべてのコンポーネント、GameObjectの子である全てのオブジェクトを破壊。オブジェクトの破壊は現在のフレームのアップデート処理後に行われる
    * FindObjectOfType(Type type)
        * Objectで指定した型で見つかったオブジェクトの配列を返す
        * ただしObject型としてキャストされる
    * WaitForEndOfFrame
        * とは
            * スクリーン上のレンダリングが完了するまで待つ
        * 活用例
            * yield return nullはレンダリング前に再開したい場合に使う
            * yield return new WaitForEndOfFrameはレンダリング後に再開したい場合に使う
    * [SerializeField]
        * Privateなフィールドをインスペクタに表示してくれる
* 時間
    * Time.time
        * このフレームの開始する時間。ゲーム開始からの時間（秒）
    * Time.deltaTime
        * 最後のフレームを完了するのに要した時間
        * この関数を利用してゲームのフレームレートを独立させる
    * Time.timeSinceLevelLoad
        * フレームが開始さた時間（最後のレベルが読み込まれてからの時間）
* 計算
    * Mathf.clump
        * 与えられた最小float値と最大float値の範囲に値を制限する
* Object
    * Object
        * Unityが参照できる全てのオブジェクトの基本クラス
        * Objectから派生するオブジェクトの全てのpublic変数はインスペクター上でドラッグ可能
    * Component（ < Object）
        * とは
            * GameObjectにアタッチされる全てに対するベースのクラス
        * GetComponent
            * Componentクラスのインスタンスメソッド
            * Unity上の該当するコンポーネントがどこにあるかをオブジェクトに示すメソッド
            * GetComponentの効力は、そのスクリプトがアタッチされているコンポーネントに限る
        * 参考
            * http://unity-indie-dou.hatenablog.com/entry/2017/08/19/100000
    * Behaviour（ < Component）
        * コンポーネントを有効/無効にできる
    * MonoBehaviour
        * javascriptを利用する時、全てのスクリプトは自動的にMonoBehaviourから派生する
    * 参考
        * https://qiita.com/megane42/items/9709d696e8f2561dbb1d


#### プレハブ

* とは
    * テンプレートとして使われて、シーン内に新しいオブジェクトインスタンスを作成できる
    * プレハブアセットに加えられた全ての編集内容はすぐに生成された全てのインスタンスに反映されるが、各インスタンス別にコンポーネントをオーバーライドしたり設定したり出来る
* apply
    * インスタンス側で変更した値を元のプレハブに上書きが出来る


#### その他

* 座標
    * スクリーン座標
        * 解像度と一致（640x480の場合、左が0で右が640）
        * OnGUIはこの値が基本値
    * ワールド座標
        * 3D空間内の座標
        * pos(x:0, y:0, z:0)のような形で特定のオブジェクトを撮影するのに便利
    * ビューポート座標
        * スクリーン座標の値を0〜1にしたもの
        * マルチレゾリューション環境下で左上や右下といった座標を指定する際に便利
        * GUITexture、GUITextといった旧来のUIシステムはこれを利用
* 画像
    * マルチレゾリューション
        * 様々なデバイスの解像度に対応する機能
    * 解像度
        * 1inch辺りに何個のピクセルで構成するかの値
    * sprite画像の利用
        * Sprite ModeをMultipleにすると1枚の画像に複数のSpriteを設定できる
        * Sprite Editorで切る。画像はキリやすいように同じ領域内に画像を入れてもらう
    * spriteを画像に分割するまで
        * spriteを画像に分割
        * シーンビューに必要画像（複数）Drag&Dropをしてアニメーションを作成
        * prefabsに保存をしてシーンビューにあるものを削除
* デバイスでの検証
    * Unity Remote
    * https://docs.unity3d.com/jp/540/Manual/UnityRemote5.html
* Event
    * Event.current.type
        * 処理中のcurrentイベント
        * https://docs.unity3d.com/ja/current/ScriptReference/Event-current.html
* エラーメッセージ
    * Null Reference Exception
        * どのオブジェクトにも参照していない参照変数にアクセスしようとした時
        * https://docs.unity3d.com/ja/500/Manual/NullReferenceException.html
* AssetStore
    * 使い方（https://techacademy.jp/magazine/2222 )



## 終わりに

初心者がこれだけ入りやすいように、チュートリアルやドキュメントが整ってるのに驚きました…。
素晴らしきUnity。