Unity

Unity 忘備録
環境:Windows8.1
ver:Unity 5.2.2
<エディタ>
よく使うビュー
①Sceneビュー
⇒オブジェクト等を配置してゲームの1シーンを作成
Cameraオブジェクトがシーンを映す
②Gameビュー
⇒実際にゲームを確認できる
③Hierarchyビュー
⇒Sceneビューに存在するオブジェクトの一覧
④Projectビュー
⇒ファイルや素材を管理する
⇒プロジェクトの保存先の「Asset」フォルダと同じ
⑤Inspectorビュー
⇒選択したオブジェクトやファイルの詳細を表示
他のビューを表示する時は、メニューの
「Window」から表示することができる
Animation⇒アニメーションの作成
Profiler⇒パフォーマンスの確認
Audio Mixer⇒ミキサー表示
Asset Store⇒アセットストアの表示
Animator⇒Animatorコントローラの表示
Animator Parameter⇒Animatorコントローラの
パラメータ表示
Sprite Packer⇒複数のスプライトを1枚のスプライト
にまとめてくれる(らしい)
左から、Sceneビュー内の移動、オブジェクトの移動、回転、拡大縮小、
uGUIの操作、ギズモ(モデルの位置や向きを示すアイコン)の表示の
切り替え
左から、プレイ、ポーズ、ステップ
左から、Servicesビューの表示、アカウント管理、
Sceneビューに表示されるレイヤーの選択、画面レイアウトの切り替え
<Game Object>
Unityでは、Scene上にGame Objectを配置し、Game Object1つ1つに
命令を与えて、ゲームやアプリケーションを作成する.
プレイヤーやステージ、エフェクトなどがGame Objectという単位で扱われる.
~基本オブジェクトの生成の仕方~
①「Hierarchy」⇒「Create」
②メニュー⇒「Game Object」
③Hierarchyビューで右クリック
のどれでも作成できる.
Game Objectは階層関係(親子関係)にすることができる.
~階層関係の仕方~
子にしたいGame Objectを、親にしたいGame Objectに
ドラッグ&ドロップ
⇒
Cube2はCube1の子となる.
また、Scene上のGameObjectをProjectビューにドラッグすることで、Prefabという
ものできる.
Prefabとは、再利用可能なGameObjectのこと.
PrefabをScene上に追加することで、そのPrefabのインスタンスが生成される.
Prefabを変更すると、そのインスタンスも全て変更される.
⇒クラスとインスタンスの関係と似ている?
PrefabはProjectビューのAssets上で右クリック→「Create」→「Prefab」でも
作成可能.
<LayerとTag>
GameObjectは、LayerとTagという属性を持っている.
LayerはCameraのCulling Maskで使用したり、Colliderの当たり判定の制御に
使用する.
TagはGame Objectの判別に使用する.
LayerとTagは自分で好きに追加できる
~Layer Collision MatrixによるLayerの当たり判定制御~
Edit→Project Settings→PhysicsでLayer同士のColliderの当たり判定を制御できる.
チェックを外すことで、それらのLayerの当たり判定を無効にできる.
<コンポーネント>
Inspectorビューに表示されている
TransformやBox Colliderなどを
コンポーネント(Component ,部品)と
呼ぶ.
Game ObjectにComponentを与える
ことでGame Objectをコントロールし、
ゲームやアプリを作成していく.
代表的なコンポーネント(スクリプトを除く)
・Transform:Game Objectの位置や角度、大きさを管理
・Collider:当たり判定を取得するのに必要
例:Box Collider , Sphere Collider , Box Collider2D …
・Rigidbody:Game Objectを剛体にするのに必要
・Animator:Mecanimを使用するのに必要
・Renderer:描画するために必要
例: Mesh Renderer , Sprite Renderer , Trail Renderer …
・Audio Source:音源を設定するために必要
~Colliderコンポーネント~
衝突判定(当たり判定)を処理させる場合に
必要. 右図の緑色の線がColliderを表している.
(2Dの場合、Collider2Dコンポーネント)
~パラメータ~
・Is trigger:物理エンジンの影響を受けさせないかどうか
・Material:物理マテリアルの設定
・Center:Colliderの中心座標(ローカル座標)
・Size:Colliderのサイズ
~Rigidbodyコンポーネント~
重力や加速度を使用する処理をさせる場合に必要.
当たり判定させるオブジェクトにも必要.
(2Dの場合、Rigidbody2Dコンポーネント)
~パラメータ~
・Mass:オブジェクトの質量(単位はkg)
・Drag:力により動く際のオブジェクトに影響する空気抵抗の量
・Angular Drag:回転する際のオブジェクトに影響する空気抵抗の量
・Use Gravity:重力の影響を受けるかどうか
・Is Kinematic:物理エンジンによる影響をなくすかどうか
・Interpolate:Rigidbodyの動きがおかしい時に使うオプション
・Collision Detection:高速で動くオブジェクトのすり抜け防止のオプション
・Constraints:Rigidbodyの動きに制限をかける
~Sprite Rendererコンポーネント~
スプライトを描画するために必要.
~パラメータ~
・Sprite:描画するスプライトの選択
・Color:色の選択
・Material:マテリアルの選択
・Sorting Layer:スプライトの描画順を決めるレイヤー
・Order in Layer:同じSorting Layerの描画順を設定
~Sorting LayerとOrder in Layerについて~
2Dゲームの作成する場合、スプライトの管理が必要になる.
スプライトの描画順はSorting LayerとOrder in Layerにより決定する.
Z値でも管理できるが、当たり判定が取れなくなるのでオススメしない.
Sorting LayerをLayerやTagと同様に自分で追加する.
例:左右のUnityちゃんがDefaultで、真ん中のUnityちゃんがPlayer
Sorting Layerは下にいくほど
前に描画される.
Order in Layerは、同じSorting Layerのスプライトをさらに詳細に設定する場合に
使用する.
Order in Layerの値が大きいほど同じSorting Layerでも前に描画されるようになる.
例:全て同じSorting Layerで、真ん中のUnityちゃんだけOrder in Layerの値が1で、
左右のUnityちゃんのOrder in Layerの値は0の場合
<座標系>
Unityでは左手座標系で表されている.
①Game Objectが子を持たない場合
⇒Transformコンポーネントに表示される
座標は、ワールド座標で表される.
②Game Objectが子を持つ場合
⇒親はワールド座標で表されるが、
子は、親を基準としたローカル座標で
表される.
<C#>
基本的な文法はJavaと同じなので省略. クラスや継承などの復習だけ.
UnityでC#スクリプトを作成した時のひな型(メソッドの書き方もJavaと同じ)
using ~ ⇒ 使用するライブラリの宣言
class (クラス名) ⇒クラス宣言
class (クラス名) : 継承クラス ⇒ 継承の宣言(extendsは使わない)
~コンストラクタ / デストラクタについて~
UnityではMonoBehaviorを継承したクラスがコンストラクタを実装することを
推奨していないらしいので、AwakeやStart関数を使う.
また、オブジェクトの明示的な破棄を行うデストラクタも、特に意識して書く必要
はないらしい. ガベージコレクション(小さく分断された空きメモリを集めて、
大きな空きメモリに結合して整理する処理)が動いているらしいからだとか.
※ガベージコレクションはいつ発生するか分からず、発生すると一瞬処理が
止まるらしいので、ゲームプレイ中とかにガベージコレクションを発生させたく
なければ明示的にガベージコレクションを発生させる必要がある.
ガベージコレクションはSystem.GC.Collect();で発生させることができる.
画面の遷移後すぐに発生させるとか、ゲームに直接関係ないところで
発生させたりする.
~修飾子~
クラス修飾子
・sealed :クラスを継承できなくさせる
メンバフィールド修飾子
・const :実行中に値が変わらない. (値型にのみ付けられる?)
・readonly:constと同じ. (参照型にも付けられる?)
メンバメソッド修飾子
・virtual:継承先で実装を書き換えて良い事を宣言
・override:継承元で宣言されているvirtualメソッドを上書きして、実装し直す
~public変数について~
Unityでは、public変数はInspector上での表示や編集が可能になる.
private変数は表示されない.
また、public変数でInspectorに表示させたくない場合は、
[System.NonSerialized]を変数宣言の前に記述することで回避できる.
~構造体(struct)~
クラスとほとんど同じ.
実体はもたない. 継承できない.
~インターフェース(interface)~
どんなメソッドやプロパティをもつかを
明示したもの. フィールドは宣言できない.
単体では動かない.
~プロパティ( get , set )~
クラスの外ではGetterやSetterメソッドのように扱えて、クラス内部では変数の
ように扱えるもの.
右図のようにgetとsetアクセサを設定
して、宣言する.
※デバッグする時は、
Debug.Log(表示させたいもの)
でコンソールに表示することができる
~列挙型(enum)~
一連の定数を列挙してまとめたもの
良く使う方法は、右図のような感じで
ゲームの状態を列挙型で宣言して、
switch文で管理する方法.
~名前空間(namespace)~
関連するオブジェクトを1つにまとめる
namespaceで宣言したクラスに
アクセスする場合は、
Namespace名.要素
でアクセスできる.
using~を使えばnamespace名は
省略できる.
~var~
型が明確なローカル変数は、varに置き換える事が可能
ローカル変数にのみ、使用可能なので、メンバ変数には使用できない.
<Unity独自のクラスや関数>
Unityエディタ上でC#スクリプトを作成した場合、全てのクラスは
MonoBehaviorクラスを継承している.
~MonoBehaviorクラスで既に定義されている関数~
・Start:スクリプトが呼び出された時に1回だけ呼び出される.
Update関数が呼ばれる直前に呼ばれる.
・Update:1フレーム毎に呼び出される.
・Awake:Start関数の前、およびインスタンス生成時に呼び出される.
・FixedUpdate:Update関数の前に呼ばれる.物理演算はこの関数内に
書くと良い.フレームレートが低い場合、フレーム間に複数回
呼び出されるが、フレームレートが高い場合は1回のみ
呼び出される.
・LateUpdate:Update関数直後に1度呼び出される.
~MonoBehaviorクラスで既に定義されている関数(続き)~
・OnCollisionEnter:別のColliderと衝突した時に1回呼ばれる.
・OnCollisionStay:別のColliderと衝突している間、毎フレーム呼び出される.
・OnCollisionExit:別のColliderから離れる瞬間に1度呼ばれる.
・OnTriggerEnter:トリガーとなっている別のColliderと衝突した瞬間に1回呼ばれる.
・OnTriggerStay:トリガーとなっている別のColliderと衝突している間、毎フレーム
呼び出される
・OnTriggerExit:トリガーとなっている別のColliderから離れる瞬間に1度呼ばれる.
・OnGUI:GUIの処理を行う関数.
2Dの場合、OnCollision~とOnTrigger~の関数の後ろに2Dを付けなければ
ならない.
例:OnCollisionEnter2D , OnTriggerStay2D , …
流れはこんな感じ
Awake → Start → FixedUpdate → Update → LateUpdate →FixedUpdateに戻る
OnCollisionEnter等は、イベントが発生した瞬間に呼ばれる.
Start関数とUpdate関数はUnity上でC#スクリプトを作成した時に、
デフォルトで記述されている.
基本的にAwake関数やStart関数で初期化等の処理を記述し、
Update関数等でキー処理や移動処理を記述すればいい(と思う)
~MonoBehaviorクラスのメンバ変数~
transform : Transformコンポーネントにアクセス
gameObject:スクリプトが追加されているGame Objectそのものにアクセス
collider:Colliderコンポーネントにアクセス
rigidbody:Rigidbodyコンポーネントにアクセス
~よく使われる型~
GameObject型:GameObjectを格納できる
Vector2型:2次元ベクトルを設定できる. 位置や移動関連の処理で多用する
Vector3型:3次元ベクトルを設定できる. 同上.
Sprite型:スプライトを扱う時に使用.
~Transformコンポーネントの(よく使われるであろう)フィールド~
・position:GameObjectのワールド座標
・rotation:GameObjectの回転値(クォータニオン)
・eulerAngles:GameObjectのワールド座標でのオイラー角(度)
・forward:GameObjectのZ軸方向のベクトル
・right , left:GameObjectのX軸方向のベクトル
・up:GameObjectのY方向のベクトル
~Transformコンポーネントの(よく使われるであろう)関数~
・Translate:GameObjectを移動
・Rotate:GameObjectを回転(度)
・RotateAround:回転軸を指定して、そこを中心として回転させる
・LookAt:目標の方向に向かせる
~Vector3とVector2クラスの(よく使われるであろう)フィールド~
・ x , y , z : x , y , zのそれぞれの値
・magnitude:ベクトルの大きさ
・normalized:正規化されたベクトル
・zero:Vector3(0,0,0)またはVector2(0,0)と同じ
・up:Vector3(0,1,0)またはVector2(0,1)と同じ
~Vector3とVector2クラスの(よく使われるであろう)関数~
・Normalize:正規化されたベクトルを返す
・Angle:2点間の角度を返す
・Distance:2点間の距離を返す
~コンポーネントの取得の仕方~
GameObjectのコンポーネントのフィールドを編集したい場合は編集したい
コンポーネントを取得しなければならない.
取得のしかたは、GetComponent<型>()で取得できる.
上図では、Animator型の変数を宣言して、Start関数で自分自身のAnimator
コンポーネントを取得しています.
~入力処理~
Inputクラスを使用
キーの割り当て(Fire1とか)は、
Edit→Project Settings→Inputから変更可能
~GameObjectの複製、破棄の仕方~
GameObjectを複製する場合は、Instantiateを使用する.
Instantiate(オブジェクト、位置、回転)で生成できる.
生成したオブジェクトにさらに処理を施したい場合は、変数をその都度用意する.
その場合は、Instantiate(…) as GameObject;とする.
破棄はDestroy関数で行える. Destroy(破棄するオブジェクト);で破棄できる.
~コルーチン~
Update内の処理を一時的に停止させたりするときに使用する.
(スレッドと同じ…?)
StartCoroutine(”コルーチン名”)でコルーチンが開始される.
yield return new WaitForSeconds(秒数)で指定した秒数停止する.
<Animator>
Unityのアニメーションは、メカ二ムというシステムを利用する.
メカ二ムはアニメーションの遷移や遷移条件の設定、トリガーの設定などが
見て分かるようなシステムのことである.
メカ二ムはAnimator ControllerとAnimation Clipが必要
~Animation Clipの作成の仕方~
アニメーションを作成したいGameObjectをHierarchyから選択して、選択した
状態で「Windows」→「Animation」を選択する→Animationビューが表示される
「Create」を押すとAnimation Clip名を付けるように促される.
Animation Clipを作成すると、Animator Controllerが自動的に作成される.
「UnityChan…」がAnimator Controller
「Walk」がAnimation Clip
AnimationビューのAdd Propertyから、選択したオブジェクトのコンポーネントを
編集できるようになる.
Spriteのみの場合、Add Property→Sprite Renderer→Spriteの右側にある+を押す
とエディタにSpriteが追加される.
あとは時間に合わせてSpriteをエディタ上にドラッグすることで追加できる.
このような感じでAnimation Clipを作成していく.
アニメーションを使用する上で注意しなければならないのが、前のページのやり方
だと、Transformコンポーネントで扱う座標系がワールド座標系となり汎用的に
アニメーションを使用することができなくなる.
もし、Transformコンポーネントをアニメーションで使用する場合は、アニメーション
させたいGame Objectの親に空のGame Objectを設定し、その親のGame Objectに
対して、前のページのやり方を適用する.
このようにすることで、Transformコンポーネントで扱う座標系がローカル座標に
なるので汎用的になります.
「アニメーションを行う子オブジェクト、座標を設定する親オブジェクト」のような
感じです.
Animation Clipを作成したら、それを管理するAnimation Controllerの設定を
行う.
Animator ControllerをダブルクリックするとAnimatorビューが出てくる.
図のWalkやIdleが、それぞれAnimation Clipである.
オレンジ色になっているAnimation Clipが
デフォルト状態のAnimation Clipである.
右クリック→「Set as Layer Default State」
からデフォルトのAnimation Clipを変更可能.
Animation ClipからAnimation Clipへ 遷移させる場合、「Make Transition」を選択
すると矢印が出てくるので、遷移先のAnimation Clipを選択することで繋ぐことが
できる.
遷移条件は、Parametersから作成することができる.
+を押すと、Float , Int , Bool , Triggerの4つの条件を選択できる.
FloatとIntは値を設定し、その値以上以下で遷移を判断させる.
Boolはtrue , falseを指定し判断させる.
Triggerは発生したら特に条件無しで遷移させる.
矢印を選択すると遷移の詳細を設定できる.
Has Exit Timeのチェックを外すと時間で強制的に遷移しなくなる.
Conditionsの+を押して遷移条件を追加する.
Animator Controllerの設定が終了したら、スクリプトで制御できるようにする.
Animatorコンポーネントを取得し、SetFloatメソッドやSetIntegerメソッド、
SetBoolメソッド、SetTriggerメソッドを実装して、遷移させる.
<シーン遷移>
いくつかのシーンを作成して、シーンを遷移させる場合、まず、
「File」→「Build Settings」を選択して、Build Settingsを表示させる.
Add Currentを押すと現在のシーンを追加することができる.
シーン遷移させる場合、この作業を行ってBuild Settingsに追加しなければ
ならない.
スクリプトの書き方は、図の通りである.
Application.LoadLevel(“シーン名”)で遷移させることができる.
非同期でロードさせる場合、Appliction.LoadLevelAsync(“シーン名”)
で、できるらしい…
参考URL:http://qiita.com/nanmo/items/eb3bbf9b547e9893d22e
ロード画面を作成したい場合は、↑のURL先のコルーチンを呼んで、
やればできるかと.
Application.LoadLevelだと、シーン遷移時に1回、Scene上のGame Objectを
破棄するらしいので、処理が重くなりやすい.
もし本格的にゲームを作成する場合は非同期でシーンのロードをするのが
オススメ.
<その他いろいろ>
~画面サイズの設定~
画面サイズを固定したい場合(PC向けにビルドする場合)、
「File」→「Build Settings」→「Player Settings」→「Resolution」
の「Default Is Full Screen」のチェックを外す.
→「Default Screen Width」と「Default Screen Height」に画面サイズを入力
→「Standalone Player Options」の「Display Resolution Dialog」を「Disable」に変更
Player Settingsで画面サイズを変更した場合、エディタの解像度を変更する必要
がある.
~1度Buildした後に解像度を変える方法~
1度Buildしてしまうと、その時の解像度やフルスクリーンの設定がレジストリに
書き込まれる.もし変更する場合はレジストリの値を削除しなければならない.
検索で「regedit」を検索する→レジストリエディタが起動される.
デフォルトだと、
HKEY_CURRENT_USER→Software→Default Company→“プロジェクト名”
に記録されている.
その中のScreenManager~と書かれているものを削除する.
~解像度とアスペクト比の対応表~
960×640
1024×728
1280×728
1920×1080
2560×1440
⇔
⇔
⇔
⇔
⇔
3:2
4:3
5:3
16:9
16:9
960×540
1280×720
1280×800
1920×1200
2560×1600
⇔
⇔
⇔
⇔
⇔
16:9
16:9
16:10
16:10
16:10
Androidの解像度をいろいろな場合に対応させたい場合は、
http://tsubakit1.hateblo.jp/entry/20140710/1405004237
のスクリプトが有能
Cameraのコンポーネントの取得でエラーが出るので、
_camera = gameObject.GetComponet<Camera>();
とすることでエラーを回避できる.
~Resourcesフォルダからファイルを読み取る~
Resourcesフォルダからテキストファイルを読み取る
AssetsフォルダにResourcesフォルダという特別なフォルダを作成することで、
スクリプトからアセットを読み込むことができる.
~Audio関係~
音を鳴らす場合、AudioSourceコンポーネントとAudioListenerコンポーネントが必要
AudioSourceコンポーネントは音を鳴らす処理
AudioListenerコンポーネントは音を聞く処理(Main Cameraにデフォルトで付いてる)
AudioSourceコンポーネントのAudio Clipに音を設定することで鳴らすことができる.
Playメソッドで音を鳴らし、loopメソッドで音をループするか設定できる
PlayOneShot(AudioClip)で1回のみ音を鳴らせる(SEとかに使う)