Unityの使い方のメモ

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Unity

 

////////////////////////
手順

 

擬似ライトマップ:
Unityよりも精密なライトをLightwaveでやっておき、サーフェイスベイキングカメラで光の情報までベイクしておき、Unityで使う。理論上はUnityのライトでは不可能な、超精密な陰影やテクスチャの再現が可能。ただしテクスチャがあまりに大きすぎると、ゲーム時、メモリを大量消費する可能性があるので注意する。
やり方は、まず普通にLightwaveでシーンを作り、撮影する。出来上がったら、すべての物体を含んだUVマップを作成し(アトラス、相対ギャップサイズ100)、そこにサーフェイスベイキングカメラで静止画を撮る。サーフェイスベイキングカメラはオブジェクトごとに静止画を撮るので、撮影前にベイキングする物体はすべて一つのレイヤーに納めておくこと。
オブジェクトのサーフェイスをすべて一つにまとめ、そのテクスチャにこの静止画を貼り付ける。ほかのUVはすべて削除する(UnityはUVを2つまでしか認識できないらしいので)もちろんバックアップを取っておく。
Unityに読み込んだら、Self-Illumシェーダーにする。Unityではテクスチャの明るさを調整できないので、明るさはテクスチャ自信を変化させて調整する。

 

Lightwaveで普通にライトマップ:
普通にライトマップを作る方法。
やり方はだいたい上と同じだが、サーフェイスベイキングカメラで撮った映像を、フォトショップなどでグレースケールにする。これをUnityのLegacyのライトマップというシェーダーがあるので、それに入れる。
このやり方は、ライトマップのグレースケールはRGBよりも容量が3分の1で、通常のRGBテクスチャに関してはタイリングなどを使って容量を減らせる。
ただしプロシージャルテクスチャを使った場合、陰影のない状態でサーフェイスベイキングしなければならなかったり(ライトを無効にして自己発光させてサーフェイスベイキングする、しかもUnityでの再現が完璧でない)、手続きが相当煩雑であるにもかかわらず、上記の方法に比べて容量は3分の1以上は落ちない。容量に問題がなさそうなら、上記の方法でいい。

 

普通のライトマップの問題点:
Lightwaveからは2つ以上のUVをUnityに持っていけないことから、一つのオブジェクトにつき、ライトマップ用のUVが一つ、テクスチャ用のUVを一つ持っていくことになる。しかもテクスチャ用のUVはオブジェクトのすべての部分を一枚にまとめなければならず、背景など物体によってはすさまじい手間となる。Lightwave上では、すべての物質を表示し、複製物部分だけ一つにまとめてUV展開という、ものすごい手間になる。
すべてのテクスチャをRGBで1024×1024で展開しても、3×1024×1024=3M程度で、スマホのメモリは数百メガある。手間を考えると、上記の擬似ライトマップのほうがよい。

 

テクスチャアニメーション:
テクスチャをアニメーションした場合、有料でムービーを入れられるが、ほかにも方法がある。
テクスチャの透明度を調整するだけなら、その面とまったく同じ面をもう一つ重ね、Transparentなどのシェーダーで透明度をアニメーションさせればいい。
テクスチャそのものを入れ替えるときは、スプライトをアニメーションで入れ替える。マテリアルを入れ替えアニメーションもできるが、負担が重そうである。

 

板ポリゴンの使い道:
カメラが停止していさえすれば、3Dでアニメーションさせる必要はなく、あらかじめ用意した板ポリゴンにアニメーションさせたテクスチャを貼り付ければよい。ムービーテクスチャでなくても、スプライトならすばやく入れ替え可能。板をカメラに常に正面を向くように設定すればよい。
つまり、カメラが停止していさえすれば、どんな精密なアニメーションも板ポリゴンで入れることができる。

 

/////////////
プロジェクト、シーン

 

新規作成:
NewProject,Browseを押し、右クリックで新規フォルダーを作成してからそれを選んでフォルダーを適用する。

 

保存:
プロジェクトはフォルダーで保存、シーンはそのセットの中に保存される。

 

操作:
シフト+コントロール押しながらで、スナップ移動できる。スナップ量はEditのSnap設定でできる。
移動時、Vキーを押したまま頂点を選ぶと、そのまま別の頂点へその頂点をあわせるように移動できる。
alt押しながらで手のひらツールが目ツールになり、接近や回転が可能。
ヒエラルキーでオブジェクトをダブルクリックで、その物体に焦点を当てる。移動速度も物体相当になるので使いやすい。

 

ゲーム中シーン切り替え:
Application.LoadLevel ("シーン名");
という命令で切り替えができるが、そのときに使われるシーンはすべてFile->BuildSetting->AddCurrentに登録しておかなければならない。

 

表示:
Render Paths:レンダーパスの方法を色で示す。緑は deferred lighting 、黄は forward rendering 、赤は vertex lit。

 

///Game中の変更
プレイ中にシーンに変更を加えると、プレイ後にもとに戻るので注意。

 

///EditのPreferences
デフォルトのままで問題ない。一応載せておくと

 

Auto Refresh アセットが変更された時、自動でエディタがアセットをアップデートする
Always Show Project Wizard スタート時にプロジェクトウィザードを表示する(デフォルトでは、起動時にAltキーを押しっぱなしにしている時のみ表示される)
Compress Assets On Import インポート時に、アセットを自動的に圧縮する
OSX Color Picker OSXネイティブのカラーピッカーをUnity独自のものに代える
Editor Analytics エディタがUnityに情報を自動的にセンドバックすることを許可する
Show Asset Store search hits プロジェクトブラウザ中にストアの無料/有料アセットの数を表示する
Verify Saving Assets 終了時にアセットが個々にセーブされたか確認する
Skin (Pro Only) エディタで使用するカラースキームを選択する。Proユーザーはデフォルトのライトグレーの他、ダークグレーのオプションを利用できる

 

External Script Editor スクリプトファイルを開くのに使うアプリケーションを指定する
Editor Attaching 外部スクリプトエディタのコントロール下でUnityのデバッグ機能の実行を許可する
Image Application 画像ファイルを開くのに使うアプリケーションを指定する
Asset Server Diff Tool アセットサーバ使用時、ファイル不一致を解決するアプリケーションを指定する
Android SDK Location Android SDKフォルダのある場所を指定する
iOS Xcode 4.x support iOSのビルドターゲットとして、Xcode 4.xのサポートを有効にする

 

Use Cache Server キャッシュサーバを有効にします
IP Address 有効の場合、キャッシュサーバのIPアドレス

 

//////////////////////
ビルド

 

基本:
ゲームオブジェクトにEditorOnlyというタグをつけていると、ビルド時にそれは含まれなくなる。デバッグ用のファイルなどはこうしておくとよい。
新しいレベルのシーンをロードするときは、前のシーンのすべてのオブジェクトは破棄される。これを防ぐには DontDestroyOnLoad()を使う。前のシーンの音楽の再生を続けたり、前と同じゲームのコントローラーを使う場合に。
新しいシーンのロード時、OnLevelWasLoaded()というメッセージがすべてのアクティブなゲームオブジェクトに送信される。

 

///コンパイルの順番

 

いろんなフォルダにスクリプトがある場合、コンパイルには順番があり、フォルダによって決まる。以下の順で行われる。
何かを参照にするときは、それ以前のコンパイルでなされたものだけ可能で、逆は不可。たとえばフェーズ2で出てきた関数を、フェーズ3で取り出すことはできるが、フェーズ1で取り出すことはできない。
WebPlayerTemplates にある全てのスクリプトは一切コンパイルされない。
別の言語から取り出すとき、たとえばJavaScriptファイルがC#のクラスを取り出すときは、C# ファイルを Plugins フォルダに配置して、 UnityScript を特殊でないフォルダに入れることで実現できる。

 

フェーズ 1: Standard Assets, Pro Standard Assets, Plugins フォルダにあるランタイム スクリプトを実行
フェーズ 2: Standard Assets/Editor, Pro Standard Assets/Editor, Plugins/Editor フォルダにあるエディタ スクリプトを実行
フェーズ 3: Editor フォルダにないスクリプトを実行
フェーズ 4: 残り全てのスクリプトを実行(すなわち Editor フォルダにあるスクリプト)

 

///名前空間

 

これはAndroidではサポートしていないらしい。
異なるスクリプトファイルで、まったく同じ名前のクラスがあると、コンパイル時に同じものと解釈されてしまうため、おかしなことになる。
これを防ぐため、

 

namespace Enemy {
public class Controller1 : MonoBehaviour {
...
}

 

public class Controller2 : MonoBehaviour {
...
}
}

 

のように書く。するとこのクラスはコンパイル時に
Enemy.Controller1
Enemy.Controller2
という名前となり、問題なくなる。
別のファイルでController1が見つかったとき、Controller1と書いたのでは上手くいかず、Enemy.Controller1と書かなければならない。

 

//属性

 

スクリプトのクラス、プロパティ、関数の前に書いて、特別な効果を得るもの。
たとえばHideInInspector 属性は、publicでもインスペクタで非表示にできるものだが、C#では

 

[HideInInspector]
public float strength;

 

のように書く。

 

////////////////
最適化

 

ゲームはスペック的な負荷が大きいと動かなくなったりする。ハードによって負荷を減らして動きやすくすることを最適化という。
特にモバイルはスペックが弱いので、ちょっとしたことでも負荷が重く、動きにくくなる。以下に注意。

 

基本:
あまりにも多くのオブジェクトを出したりなくしたりしていると、負担が大きくなる。
あまり容量の大きいシーンが二つあると、それらをつなぐ瞬間にメモリ負担が大きくなってクラッシュすることがある。このような場合、空のシーンを間に差し込むことで解決できる。
無圧縮ファイルを含めない。読み込みに時間がかかる。
動かないオブジェクトにはstaticを有効にすると、負荷が減るらしい。ただし使用メモリが少し増えるので、微妙なさじ加減が必要。
オブジェクトの数があまりに多すぎるとまずい。
レイヤー数が多すぎるとまずい。
グローやデプスエフェクトは負担が大きい。それ以外のエフェクトもすべて負担が大きいので、エフェクトはなるべく使わないほうがよい。
リアルタイムシャドウは負担が大きい。特にモバイルは使用しないほうがよい。
プレハブを頻繁に使用すると重くなる。同じ物質であればプレハブよりもパーティクルのほうが軽い。
ピクセルライトは負担が大きい。

 

ポリゴン数:
ポリゴンを減らす(ゲームでは三角形ポリゴンしか使えないので注意)
ポリゴンを増やすくらいならノーマルマップのほうがマシだが、それでもけっこう重い。それよりもただの平面に凸凹をテクスチャに描いてしまったほうがよい。
あまり細長い三角形ポリゴンは作らないように。
カメラから見た角度が変わらない物体に関しては(つまり回りこんでみる可能性のない物質は)、スプライトを使用する。つまり板ポリゴンに出来上がった画像やアニメーションを貼り付けて使う。アニメーションは動画を貼り付けるのではなく、数十枚の静止画をつなげて使う(板ポリゴンに動画を貼り付けるのはモバイルでは不可能で、しかもProバージョンでしかできない)
同じポリゴン数でも、オブジェクトの数が多いほうが負荷は大きい。
画面に表示されるオブジェクト、ポリゴン数を減らせば負荷は軽くなる。
一般論では、モバイルではポリゴン数は10万以下、パソコンでは数百万以下に抑えなければいけない。

 

物理演算:
物理演算は負荷が高いので、あまり大量だったり複雑にならないようにする。
メッシュコライダは使わないほうがいい。使うとしてもできるだけポリゴン数を減らす。
Time.fixedDeltaTimeはできるだけ大きくする。
fixed updateを少なくする。
クロス オブジェクトをできるだけ少なくする。
メッシュコライダを避ける。使うなら少ないポリゴンで。
リジッドボディのないColliderは動かさない(リジッドボディがあればいいらしい)。動かすと負荷が非常に大きくなる。やるならRigidbodyでIsKinematic有効を使う。
リジッドボディの適用オブジェクトが多すぎるとまずい。
決まったアニメーションならメカニムで変形させる。
TimeManagerのFixedTimestepを大きくする。ただし精度は落ちる。

 

スクリプト:
pow, exp, log, cos, sin, tanあたりの関数は負荷が高い。normalize, dot, inversesqrt も高い。
できるだけ低い精度の型を(float, half, fixedin Cg)使用する。
FindObjectsOfType(およびUnityのgetter プロパティ全般)は非常に負荷が高い。
UnityGUI(OnGui)は、割と負担が大きいらしく、モバイルでは使わないほうがよいらしい。
無駄なコードや、明らかに時間が無駄にかかりそうなコードを書かない。
可能なものはコルーチンを使い、処理を軽くする。特に重い計算。
instantiateやDestroyを頻繁に使用すると負荷が重い。
クラスは作るのに時間がかかるが、構造体はすぐに作れる。よって、「Gameobject ○○」などはUpdateなどにできるだけ入れない。さもないと遅くなる。逆にVector3のようなのはできるだけUpdateに入れると、使用メモリが少なくてすむ。
あまり最初から最適化に凝りすぎると、プログラムがわけがわからなくなることがあるので注意する。不具合を生むくらいなら少々重いほうがマシである。

 

パーティクル:
パーティクルは重いので、可能ならベイクする。
パーティクルの数を減らしたり、パーティクルに複雑なシェーダを使わない。
あまり高密度なパーティクルや数が多すぎるものは避ける。
3Dでなく、2Dのパーティクルを使うと軽くなる。

 

オブジェクトのロード:
毎フレームごとに大量の読み込みを行うのは負担が大きく、タイムラグにつながりやすい。適切なタイミングを計る。
スクリプトの最初の部分、ゲーム開始直前にできるだけメモリに入れると動作が早いが、一気に大量に詰め込むとメモリリークを起こすので注意する。特にモバイルはメモリも貧弱なので、注意。
毎フレームあまり大量のオブジェクトをロードしないこと。

 

レンダリング・ライト・マテリアル:
リアルタイムでライトを照らさず、できるだけライトマップを使用する。
マテリアル数をできるだけ少なくする。
同じシェーダを使いまわす場合、スクリプトではRenderer.sharedMaterial をRenderer.material の代わりに使用する。
quality settingsでpixel light count を調整。ピクセル単位にするのはスポットライトのみにし(負荷が少ないので)、ほかは頂点単位にすべき。ピクセル単位は負荷が大きい。
あまり複雑なシェーダを使うと時間がかかる。
シェーダの透明をアルファで抜くのは負担が大きいのでできるだけ使わない。透明部分が多いほど負荷が大きい。
Quality SettingsのRender Mode of Lightsを調整。
一つのオブジェクトを複数ライトが照らすのは負荷が大きい。
シャドウ、ピクセルライト、反射をオフにする、少なくする。
一つのオブジェクトのスキンメッシュレンダラは一つにする。二つにすることもできるが、2倍の時間がかかる。

 

メモリとガベージコレクション:
そのシーンで使われなくなったオブジェクトは、メモリから消されて新たに空きメモリを自動で確保するようにできている。
関数の中で配列を使用するときは、関数の最初の行で行い、関数の中では行わないようにする。function RandomList(arrayToFill: float[]) { ……のように、関数宣言と同時に配列を宣言する。このほうが、中で配列を作るよりも負荷が少ない。中で配列を作るとガベージコレクションが頻繁に行われて、CPUの負荷が増す。

 

メモリリーク:
これが起こるとクラッシュする。情報を見ながらチェックする。

 

テクスチャ:
縦横の解像度を2の乗数にする。512や1024など。4096が限界で、これ以上の解像度は使えないので注意。安全に行くなら2048が限界と見ていい。
タイリングできるものはタイリングし、読み込むテクスチャはできるだけ小さい解像度にする。
同じ面積でも、多数のテクスチャを使うよりは一枚の大きなテクスチャを使うほうが負担は少ない。
ミップマップを積極的に使う。遠ざかると完全に見えなくすることで負荷を減らせる。
圧縮テクスチャを使うほうが負担が軽い。
32ビットよりも16ビットのほうが負担が軽い。
インスペクターの下のMaxSizeを減らす。ここでは見た目で気にならなくなるギリギリまで下げるとよい。元のファイルは変える必要はない。ファイルは圧縮されたほうがよい。

 

メカニムのパフォーマンス最適化:
ボーン数が多いと、数にほぼ正比例して負荷が重くなる。ボーン数15と30では2倍の違い。
ただしボーンを使っていても、それがアニメーションしていなければほとんど負荷は増えない。
一つのキャラクターに2つ以上のメッシュレンダラをかけることはできるが、負荷が大きくなる。
アニメータは、コントローラーを追加しなければ負荷は増えない。動かないものにはコントローラーをつけないほうがいい。
スケールを変化させるアニメーションがあると負荷は増える。
アニメーションレイヤーの数が増えると負荷が増える、というわけではないが、全体のアニメーションの数に負荷は比例している。全レイヤー含めて大量のアニメーションがあれば、それなりに負荷が大きくなる。レイヤーが多くてもアニメーションやボーン数が少なければ負荷は少ない。
Humanoidの場合、不要なボーンをボディマスクで隠すことで負荷を減らせる。特に指はボーン数が多いので、不要ならカットするとよい。
Genericではrootmotionを使うと負荷が増えるらしい。
AndroidではNEONというものがないため、ほかのものより負荷が大きいらしい。特にHumanoidでは負荷が大きい。
GenericよりもHumanoidのほうが負荷が大きいようだ。
一般論でのキャラクターのポリゴン数は、モバイルでは1500以下、パソコンでは4000以下、プレステ3くらいでは7000以下でまともに動くらしい。
IKをFKにすると負荷が減る。

 

ファイルサイズの削減:
フォトショップファイルはレイヤー単位で一つのファイルにし、psdのまま使用する。作業効率もよくなるし、サイズも減らせる。ただし実際に使うのは低解像度のもので、高解像度のものは別に取っておいたほうが無難である。
Unityの中で使用しないアセットはビルドしたときに排除されるので、余分なアセットが含まれていてもサイズが増えたりはしない。なので、Unityの中で余分なファイルがあってもかまわない。

 

////////////////
Androidにインストール

 

基本
ゲームの製作中、定期的に実機でテストしていくほうがよい。
Androidは無料、iOSは年間8400円のライセンスが必要。

 

apkファイルのインストール:
モバイルの設定で、セキュリティ、提供元不明のアプリのところを有効にするとインストールできるようになる。
通常は、Androidならグーグルプレイからのアプリしかインストールできないようになっている。
apkファイルを作ることができるなら、この方法でインストールすることができる。
たぶんJDKやAndroidSDKは必要だと思う。それらは以下の手順に従う。

 

テスト手順:
JDKをインストールする。JAVAの開発機。
使っているスマホのUSBドライバをパソコンにインストールする必要がある。これができていないとエラーになる。ネットでDocomoなど検索してインストールする。
次にAndroidSDKをパソコンにインストールする。そのままデフォルトのままインストール(Install 4 Packagesなどと表示されている、必要なのは、9以上のAPI、SDKPlatformを少なくとも一つ、AndroidSDLPlatformToolsを一つ、BuildToolsを一つで、デフォルトでインストールされるはず)
UnityでEdit>PreferenceでExternalのAndroidで先ほどインストールしたSDKの場所を指定。SDKのフォルダを指定すればよい。
UnityでFile>BuildSettingでAndroidを選択、インストールするシーンをScenesInBuildに加える。AddCurrentで必要なシーンを追加。

 

PlayerSettingを開いて、インスペクターで、AndroidのOtherSettingsを選択、BundleIdentifierを入力。このゲームの識別名前で、好きな名前を入力するが、一般には国名.作者名.アプリ名と入れる。たとえば「jp.shigetaka.mygame」など。
ほかの項目も入力する。
ResolutionAndPresentation:画面の設定。
Icon:アイコンを指定。
SplashImage:ゲーム起動時に表示される画像。無料版では強制でUnityと表示される。
OtherSettings:きれいな順からDefferd,Forward,Lit。モバイルではDefferdは不可。ゲームのバージョンやそのコードを入れる。ほかはデフォルトでもいい。
PublishingSettings:ストアへ出すときに設定する。

 

テストするアンドロイド端末で、設定の開発者向けオプションを表示する。これはバージョンによってデフォルトで表示されなくなっていることが多いので注意。ネットでバージョンで検索して出す方法を調べる(4.2.2では端末情報、ソフトウェア情報のビルド番号を連続タップすると出てくる)これのUSBデバッグとAllow mock locationsをONにしておく。
Android SDK/platform-tools フォルダにある adb devices コマンドを実行することで、OS は機器を確認できる。
設定のセキュリティで、提供元アプリのインストールを許可する。さもないとインストールできない。
アンドロイドとパソコンをUSBでつなぎ、File>BuildAndRunする。アンドロイドでいきなりゲームが始まる。

 

注意:
2014/6/1現在、JDKの64bit版と、AndroidSDKの64bit版は、64bitのパソコンでうまく動作しないため、両方32bitのものをインストールするようにする。Unityが64bitに対応していないのかもしれない。

 

Androidでの注意点:
Androidではテクスチャムービーは再生できないらしい。iphoneでも同じ。代わりにストリーミングプレイバックを使用する。
正方形でないテクスチャは使えない。
テクスチャでETC形式というのが安定して使えるらしい。
OnMouseEnter、OnMouseOver、OnMouseExit、OnMouseDown、OnMouseUp、およびOnMouseDragイベントは存在しない。
WWWクラスを介したビデオ ストリーミングはサポートされていない。
アプリが50MB以上の場合、GooglePlayで売るには分割する必要がある。分割はやり方もかなりややこしいので50MBを超えないようにするといい(それぞれ50MB以内に収め、別のアプリとして発売する)

 

Android特有の設定:
入力はInput、画面についてはHandheldを参照。

 

///Androidビルド時の設定項目

 

Resolution
Default Orientation (このプロパティは、iOSおよびAndroid間で共有されます。)
Portrait デバイスはPortraitモード、持ち方は縦向きでホームボタンが下。
Portrait Upside Down デバイスはPortraitモードで逆さま、持ち方は縦向きでホームボタンが上。
Landscape Right デバイスはLandscapeモード、持ち方は横向きでホームボタンが左。
Landscape Left デバイスはLandscapeモード、持ち方は横向きでホームボタンが右。
Use 32-bit Display Buffer ディスプレイバッファが32ビットカラー値(デフォルトでは16ビット)を保持するために作成するかを指定。。使用するのは、バンディングが見られる場合や、Image Effects(イメージエフェクト)でアルファを必要とする場合であり、理由はディスプレイバッファと同じ形式にRTを作成するためです。Gingerbread以前のOSではサポートされてません(強制的に16ビットになります)。
Use 24-bit Depth Buffer (少なくとも)24ビットカラー値を保持するためディスプレイバッファを作成するよう指定。パフォーマンスに影響を及ぼす可能性があるので、'z-fighting'やその他の画像の乱れがある場合のみ使用して下さい。

 

Icon
Override for Android Androidゲームで使用したいカスタムアイコンを割り当てる場合、オンにします。異なるサイズのアイコンを、以下の箱の中に収めます。

 

Splash Image
Mobile Splash Screen (Unity Proのみ) iOSのスプラッシュ画面に使用されるべきテクスチャを指定。標準のスプラッシュ画面サイズは320×480になります。(これは、AndroidとiOSの間で共有されます)
Splash Scaling デバイス上のスプラッシュ画像の拡大・縮小の方法を指定します。

 

Other Settings

 

Rendering
Static Batching ビルドでStatic Batchを使用する場合に設定(WebPlayerではデフォルトで無効)。Unity Proのみ。
Dynamic Batching ビルドでDynamic Batchを使用する場合に設定(デフォルトで有効) 。
Identification
Bundle Identifier お使いのApple Developer Networkのアカウントからプロビジョニング証明書で使用される文字列(これはiOSとAndroidの間で共有されます)。
Bundle Version バンドルのビルドバージョン番号を指定、ビルドバージョンが上がったことを示す(リリースされたかどうかにかかわらず)。単調に増加する、ピリオドで区切られた一つ以上の数字。(これは、iOSとAndroidの間で共有されます)
Bundle Version Code 内部バージョン番号。この番号はひとつのバージョンが、別のバージョンより新しいかどうかを判断するための数字で、高いほうが新しいです。ユーザーに表示するバージョン番号ではなく、その番号はversionName属性によって設定されます。値は "100"のように、整数として設定しなければなりません。次のバージョンが、より高い数値であるかぎり好きに定義することができます。例えば、ビルド番号でも問題ありません。あるいは"x.y"の形式として、でバージョン番号または、下限と上限の16ビットで個別に "x"と "y"をエンコードし、整数に変換することができます。それとも、単に新しいバージョンをリリースするたびに、1つ数を増やすことができます。
Minimum API Level ビルドをサポートするのに最低限必要なAPIの最小バージョン。
Configuration
Graphics Level ES 1.1( "固定機能")またはES 2.0( 'シェーダベース')のOpen GLバージョンのいずれかを選択します。AVD(エミュレータ)を使用する場合はES 1.xのみサポートされています。
Install Location アプリケーションをデバイス上にインストールするロケーションを指定(詳細については、http://developer.android.com/guide/appendix/install-location.html を参照)。
Automatic OSで自動判断。ユーザーが後からアプリを相互に移動することができます。
Prefer External 可能であれば外部ストレージ(SDカード)にアプリをインストールします。OSでは保証されないため、出来ない場合はアプリは内部メモリにインストールされます。
Force Internal 強制的に内部メモリにアプリをインストールします。ユーザーはアプリを外部ストレージに移動することができません。
Internet Access Requireにすると、スクリプトがこれを使用していない場合でも、ネットワークのアクセス許可が有効になります。開発ビルドでは、自動的に有効化されます。
Write Access External (SDCard)に設定すると、SDカードなどの外部記憶装置への書き込みアクセスを可能にします。開発ビルドでは、自動的に有効化されます。

Scripting Define Symbols カスタム コンパイル フラグ(詳細はプラットフォーム依存のコンパイル を参照)。
Optimization
Api Compatibility Level アクティブな.NET API プロファイルを指定。
.Net 2.0 .Net 2.0ライブラリ。.Net互換性が最大、ファイルサイズ最大。
.Net 2.0 Subset .NET互換性は全体の一部、ファイルサイズは小さく。
Stripping Level (Unity Proのみ) ビルドされたプレーヤーのファイル容量を小さくするためスクリプト機能の一部を削減するオプション(この設定はiOSとAndroidプラットフォームの間で共有されます)
Disabled 削減は行われません。
Strip Assemblies レベル1の削減。
Strip ByteCode レベル2の削減(レベル1からの削減を含む)。
Use micro mscorlib レベル3の削減(レベル1、2からの削減を含む)。
Enable "logcat" profiler プロジェクトのテスト時に、デバイスからフィードバックを取得したい場合はこれを有効にしてください。adbのlogcatを、デバイスからコンソール(開発ビルドでのみ使用可能)にログを出力します。
Optimize Mesh Data メッシュについて、それが適用されたマテリアルが必要としていないデータを全て取り除く(接線、法線、色、UV)。

 

Publishing Settings
Keystore
Use Existing Keystore / Create New Keystore 新しいキーストアを作成するか、既存のものを使用するか、選択するために使用します。
Browse Keystore 既存のキーストアを選択します。
Keystore password キーストアのパスワード。
Confirm password パスワード確認、Create New Keystoreオプションが選択された場合にのみ有効。
Key
Alias キーのエイリアス。
Password キーエイリアスのパスワード。
Split Application Binary アプリケーションをExpansion Fileに分割するためのフラグ。Google Playストアで最終ビルドが50MB超えたときにかぎり便利です。

 

Other Settings
Optimization
Stripping ビルドの際にバイトコードを削減するオプションです。
Strip Physics Code 必要でない場合に物理エンジンのコードを削減します。
Optimize Mesh Data メッシュについて、それが適用されたマテリアルが必要としていないデータを全て取り除く(接線、法線、色、UV)

 

Google Native Client
Resolution
Default Screen Width 生成されるPlayerのスクリーン幅。
Default Screen Height

 

Other Settings
Rendering
Static Batching ビルドでStatic Batchを使用する場合に設定(WebPlayerではデフォルトで無効))。Unity Proのみ。
Dynamic Batching ビルドでDynamic Batchを使用する場合に設定(デフォルトで有効) 。
Configuration
Scripting Define Symbols カスタム コンパイル フラグ(詳細はplatform dependent compilationのページ を参照)。
Optimization
API Compatibility Level
.Net 2.0 .Net 2.0ライブラリ。.Net互換性が最大、ファイルサイズ最大。
.Net 2.0 Subset .NET互換性は全体の一部、ファイルサイズは小さく。
Strip Physics Code 必要でない場合に物理エンジンのコードを削減します。
Optimize Mesh Data メッシュについて、それが適用されたマテリアルが必要としていないデータを全て取り除く(接線、法線、色、UV)。

 

////////////////
iOSにインストール

 

PVRTCテクスチャというのが使えるらしい。
iOSにもUnityRemoteはある。

 

注意点:
ムービーテクスチャは不可能。
OnMouseDown、OnMouseEnter、OnMouseOver、OnMouseExit、OnMouseDown、OnMouseUp、およびOnMouseDragイベントはサポートされていません。
ダック タイピングなどの動的機能はサポートされていません。 コンパイラに動的機能をエラーとして報告させる場合は、スクリプトに #pragma strict を使用します。
WWWクラスを介したビデオ ストリーミングはサポートされていません。
WWWクラスによる FTP サポートは制限されています。

 

大まかな手順:
まず、MacとiPhoneが必要。
アップルのウェブサイトで、アップル・ディベロッパーアカウントを作る。
iPhoneSDKをダウンロード。Xcodeもダウンロード。iTunesもダウンロード。
MacにiPhoneを認識させる。
iPhoneDeveloperCenterで証明書を作る。
WWDR Intermediate Certificateをダウンロードし、インストール。
プロビジョニング ファイルの作成。

 

 

/////////////////
ウェブブラウザでプレイ

 

File>BuildSettingでWebPlayerにし、BuildAndRunで書き出せる。

 

//streamingを有効にした場合
通常、ウェブではそのレベルのシーンがロードされたかどうか確認してからシーンを始める。ロードされてないのにはじめても上手くいかない。
以下のようにする(levelToLoadにロードすべきシーンのレベルを入れる)

 

if (Application.CanStreamedLevelBeLoaded (levelToLoad)) {
Application.LoadLevel (levelToLoad);
}

 

//Offline Deploymentを有効にした場合
オフラインでウェブゲームができるようになる(厳密には、UnityObject.jsというネットワークと結びつけるファイルがローカルにも存在するようになるため)
ただしUnityObject.jsはローカルのままだと更新されない。オンラインだとUntyサーバーから自動ダウンロードして更新されるのだが。

 

 

///Winodows,Macでプレイ

 

できたファイル、WindowsではexeとDataファイルを、Macならapp bundleだけ配布すればよい。

 

//////////////////
Edit

 

///Project Setting

 

キーボードやジョイスティックの入力を決定する。モバイルは対応していない。

 

Input:
Input Managerを開ける。Horizontalやjumpなどは「軸」という。
Input.GetAxis("Horizontal")などのスクリプトと関係する。たとえば("")の中はnameの内容で、デフォルトでは矢印キーかw,a,s,dで上下左右に動くが、この設定もここで行う。
パラメータの内容は以下のとおり。

 

Name スクリプトからこの軸をチェックする文字列の名前。
Descriptive Name スタンドアローン ビルドで Configuration の Input タブで表示される正の値の名前
Descriptive Negative Name スタンドアローン ビルドで Configuration の Input タブで表示される負の値の名前
Negative Button 負の方向の軸を押すためのボタン。
Positive Button 正の方向の軸を押すためのボタン。
Alt Negative Button 負の方向の軸を押すための、代わりのボタン。
Alt Positive Button 正の方向の軸を押すための、代わりのボタン。
Gravity 何もボタンが押されてない場合に軸がニュートラルになるための、毎秒単位での速度。
Dead アナログの Dead Zoneのサイズ。この範囲の全てのアナログデバイスはニュートラルにマッピングされます。
Sensitivity 軸がターゲットの値に向かうための毎秒単位での速度。これはデジタルデバイスのみ向けです。
Snap もし有効化すると、軸の値は、ボタンを反対方向に押したときに、ゼロにリセットされます。
Invert もし有効化すると、Negative Button は正の値に反転し、その逆も然りとなります。
Type 軸を制御する入力の種類。
Axis 軸を制御する接続されたデバイスの軸。
Joy Num 軸を制御する接続されたジョイスティック。

 

キーボードやジョイスティックの場合、値は-1〜1まで。ニュートラルは0。
マウスですばやく動かした場合などは、この範囲を超えることもある。
複数の軸を同じ名前で定義すると、最も絶対値の大きい軸が返ってくる。たとえば同じ名前の軸で一つをキーボード用に一つをジョイスティック用に作ったとすると、キーボードを使えばキーボードから、ジョイスティックを使えばジョイスティックから反応が得られ、同時にやると絶対値の大きい装置に合わせられるということ。

 

命名規則:

 

通常キー: "a", "b", "c" ...
数字キー: "1", "2", "3", ...
矢印キー: "up", "down", "left", "right"
キーパッド キー: "[1]", "[2]", "[3]", "[+]", "[equals]"
修飾キー: "right shift", "left shift", "right ctrl", "left ctrl", "right alt", "left alt", "right cmd", "left cmd"
マウスボタン: "mouse 0", "mouse 1", "mouse 2", ...
ジョイスティック Buttons (from any ジョイスティック): "joystick button 0", "joystick button 1", "joystick button 2", ...
ジョイスティック Buttons (from a specific ジョイスティック): "joystick 1 button 0", "joystick 1 button 1", "joystick 2 button 0", ...
特殊 キー: "backspace", "tab", "return", "escape", "space", "delete", "enter", "insert", "home", "end", "page up", "page down"
Function キー: "f1", "f2", "f3", ...

 

たとえば
int a = Input.GetKey ("a");

 

///モバイル入力について

 

モバイルについては、スクリプトの構造体Touchを参照。Input.mousePosition同様、Input.touchesというのがある。
iPhone,iPadは5本指まで同時タッチを検出できるが、Androidは2〜5で機種によって異なるなどの規定がある(2014/7時点)

 

fingerId タッチの一意のインデックス。
position タッチの画面位置。
deltaPosition 最終フレーム以降のタッチの画面位置の差分。
deltaTime 最後の状態変更から経過した時間。
tapCount iPhone/iPad 画面はユーザによるクイックな指のタップを識別できます。このカウンタによりユーザが、指を横に動かさずに、何回画面をタップしたか知らせます。Android デバイスはタップの数をカウントせず、この値はつねに 1 です。
phase "Phase" と呼ばれるタッチの状態を表現します。これによりタッチが始まったばかりなのか、ユーザが指を移動したのか、もしくは指を上げたところなのかを判断できます。

 

Phase は次のうちのいずれかの値をとります:
Began 指がスクリーンをタッチしたばかりです。
Moved 指がスクリーン上で動きました。
Stationary 指がスクリーンをタッチしてますが最終フレームから移動してません。
Ended 指がスクリーン上から離れました。これはタッチの最終フェーズです。
Canceled システムがタッチのトラッキングをキャンセルしていて、(例えば) ユーザがデバイスを顔全体につけたとおか、同時に5タッチ以上が同時に発生した、等です。これはタッチの最終フェーズです。

 

次に、ユーザが画面でタップしたときにRaycast するサンプルスクリプトを示します:

 

var particle : GameObject;
function Update () {
for (var touch : Touch in Input.touches) {
if (touch.phase == TouchPhase.Began) {
// 現在のタッチ位置からRaycast
var ray = Camera.main.ScreenPointToRay (touch.position);
if (Physics.Raycast (ray)) {
// ヒットした場合はパーティクルを作成
Instantiate (particle, transform.position, transform.rotation);
}
}
}
}

 

重力(スマホを傾けると反応するヤツ)はInput.accelerationというのを使う。ただしもともとあまり正確ではない。
スマホのキーボーをを使うには、GUI.TextField, GUI.TextArea および GUI.PasswordField などを使う。

 

//////////////////////

 

オーディオマネージャー:
音ゲーなどで、早く音を再生するためにこの辺のパラメータを変える必要があるかもしれない。

 

DSP Buffer Size DSPバッファのサイズは、レイテンシやパフォーマンスを最適化するために設定することができます
Default デフォルトのバッファ・サイズ
Best Latency レイテンシを良くするためパフォーマンスを犠牲にします
Good Latency レイテンシとパフォーマンスのバランスをとります
Best Performance パフォーマンスを良くするためレイテンシを犠牲にします

 

Physics Manager:
物理演算を使うときの基本的な値をその挙動を設定する。

 

Gravity Rigidbody に適用される重力量。 通常重力は Y 軸にのみ働きます (負が下)。 重力の単位は、メートル / (秒 ^2) です。
Default Material 個々の Collider に何も割り当てられていない場合に使用されるデフォルトの Physic Material。
Bounce Threshold 相対速度がこの値未満の 2 つの衝突するオブジェクトは跳ね返りません。 この値により、ジッタも減るため、低すぎる値を設定することはお勧めしません。
Sleep Velocity デフォルトの直線速度で、これを下回ると、オブジェクトがスリープに入り始めます。
Sleep Angular Velocity デフォルトの角速度で、これを下回ると、オブジェクトがスリープに入り始めます。
Max Angular Velocity リジッドボディに対して許可されたデフォルトの最大角速度。 リジッドボディの角速度は、高速で回転するボディとの多くの不安定さを避けるため、「Max Angular Velocity」内に留まるよう固定されます。 これにより、車輪などのオブジェクトでの意図的な高速回転を回避することができるので、「Rigidbody.maxAngularVelocity」を記述することで、リジッドボディに対してこの値を無効にすることができます。
Min Penetration For Penalty 衝突ソルバーが 2 つのオブジェクトを離す前に、これらのオブジェクトが貫通できる深さ (メートル)。 値が高いほど、オブジェクトの貫通度合いは増しますが、ジッターは減ります。
Solver Iteration Count ジョイントおよび接点が解決される精度を定義します。 通常、7 の値にすると、ほぼすべての状況にうまく機能します。
Raycasts Hit Triggers 有効にすると、トリガーと付けられたコライダと交差するレイキャストがヒットを返します。 無効にすると、これらの交差はヒットを返しません。
Layer Collision Matrix layer-based collision 検出システムの動作を定義します。

 

 

Player Settings:
OSごとの、画面解像度などの基本設定。想定するプラットフォームではその設定をしておく。

 

Quality Settings:
一般に、クオリティを上げると動きが悪くなる。

 

Time Manager:
Fixed Timestep:「1÷この値」の数、1秒間に物理特性の計算が行われる。FixedUpdate()の間隔でもある。

 

///////////
インスペクター

 

上の名前を変えると、オブジェクトの名前を変えられる。

 

デバッグモード:
右上の「三」みたいなものをクリックすると、デバッグモードにすることができる。インスタンスIDなど普段見えない値が見られる。
IDというのは、Unity内で各素材につけられる番号。Unity内で移動させても問題が起きないのはこのため。

 

グラディエントエディタ:
色を削除するときはCtrl+Delete。
上部の矢印はアルファ値。

 

スクリプト:
インスペクターでスクリプトを追加するとき、そのスクリプトの中で、MonoBehaviour直下でpublic宣言した変数が下に出る。ここにアセットやヒエラルキーからオブジェクトを入れることで、その変数の内容を指定することができる。

 

transformの問題:
Scaleを行うとき、xyz値が違う場合は注意する((2,3,2)のような場合)。これはできるだけ避けるべきである。
通常はメモリだけに負担がかかるが、この場合ではCPUにも負担がかかるようになるらしい。
またいくつかの物理演算では不具合が起きやすく、親子関係のある物体でも不具合が起きやすい。
パーティクルはtransformの影響を受けない。
不具合の起きにくさから、可能であれば、Import Settingの調整でスケールの調整を行うのが望ましいらしい。xyzが同じ値でも、Scaleの変更は問題が生じやすい。
というか、Unity内でスケーリングするのはできるだけ避けたほうがいいらしい。モデリングの時点で調整するのが望ましい。

 

親子付け:
親子付けするとき、親の位置を0,0,0に置いた状態でやると問題が生じにくい。

 

オイラー角とクオータニオン:
インスペクターのRotaionの値は、オイラー角のローカル座標である。
したがってここの数値をスクリプトで直接変更したい場合、transform.localEulerAnglesで調整する。
rotationやRotateではクオータニオンなので、思い通りに動かないので注意。

 

ローカルとワールド:
親子付けした子オブジェクトは、インスペクターにはローカル座標が載っている。
したがってここの数値を変更したい場合、localPositionの値を変更する。
ただのpositionだとワールド座標の値を変更することになる。

 

///////////////////
スプライトアニメーション

 

手順:
アトラステクスチャ(2n乗のピクセルサイズの中にアニメするべき画像を分割して入れたファイル)を用意し、分割する。
アニメの最初の画像をシーンにドラッグ。その画像を選択したままアニメーションビューを出し、AddCurve。やりたい種類のアニメーションを選択する。
時間軸へプロジェクトから画像をドラッグして、アニメを作る。そのままだと最後の画像だけ一瞬だけしか表示されないので、最後の画像は同じ画像をもう一枚入れて表示させるとよい。
CreateNewClipでほかのアニメーションも作っていく。

 

///SpriteRenderer
Sprite:スプライトアニメーション。静止画像を入れ替える、2Dのもの。

 

//////////////////////////////////////
メカニムアニメーション

 

基本手順:
3DCGソフトでアニメーションを読み込むか(Lightwaveのシーン読み込み)、Animationウインドウでアニメーションを作ると、「コントローラー」と「アニメーションカーブ」が自動で作成される。コントローラーは普通、自オブジェクト名が入っており、アニメーションカーブはアニメーションの名前が入る。
通常はコントローラー=オブジェクト名であり、要するに一つのコントローラーが一つの一連のメカニム動作に相当。一つのコントローラーにいくつものアニメーションカーブが入り、トランジションが設定される。コントローラーを選択すると、アニメータウインドウにその一連の動きの表が表示される。
アニメーションカーブは、要するに「ステート」で、ステートからパラメータがある条件に達すると、別のステートに遷移する。その遷移条件を決めるのがトランジション。
メカニムの画面でパラメータを設定し、そのパラメータがある条件になるとトランジションを発生する。そのパラメータをプログラムから変更するにはアニメータクラスを取らなければならず、例えば「ブール変数aaがtrueになったらトランジションする」と設定した場合、アニメータクラスのインスタンスを取り、それにアニメータというコンポーネントを仕込まないといけない。

 

Animator a;
a = (Animator)GetComponent ("Animator");
a.SetBool("aa",true);

 

のように書く。
デフォルトのステートを設定でき、何もしないとデフォルトのアニメーションをする。したがって何かアニメーションを作った時、例えばデフォルトで停止させたい場合は、停止専用のアニメーションを作ってそれをデフォルトにしておかないと、いきなり動きっぱなしになるので注意。
AnyStateはアニメのすべての状態を示す。ここから矢印を出すと、あらゆる状態からそのアニメへ移行できる。
AnyStateから右クリックで矢印を引く。矢印をクリックしてインスペクターでトランジションの長さなど変更できる。
キー操作で動かすには、スクリプトが必要。

 

///////////////
LightwaveのUnity互換

 

LightwaveのシーンをUnityへ持ってくる方法。シームレスにデータのやり取りができる。

 

事前準備:
Lightwaveのsupport/3rdparty_support/Unity3D"フォルダにあるLightWaveAppLink.unitypackageを、Unityのインストールフォルダ内にあるEditor/Standard Packagesフォルダにコピーする。

 

手順:
Lightwaveシーンのコンテンツディレクトリを、標準コンテンツディレクトリの形にして(Sceneにシーンファイル、Objectsにオブジェクト、Imageに画像ファイルを入れたりする)、コンテンツディレクトリを互換させたい目的のシーンを含むフォルダに指定する。ファイルに日本語が含まれないように注意する。
ファイル→パッケージシーンで簡単に標準ディレクトリ形式で保存できる。
Unityで新しくプロジェクトを作る。そのとき
Character Controller.unitypackage
LightWaveAppLink.unitypackage
の2つのパッケージをインポートする。そこでいったん保存してUnityを終了する。
できたUnityフォルダのAssetsフォルダに、さっき作ったコンテンツディレクトリを丸ごと移動し、以降はここでシーン変更する。
再びUnityを起動するとLightwaveのプログラムが入っているインストールフォルダを聞かれるので、そのフォルダを指定する。通常は「C:\Program Files\NewTek\LightWave_11」の場所にある(要するにLightwaveのプログラムファイルのある場所のフォルダ)。するとシーンフォルダの中に、シーンファイル以外のファイルがたくさん出てくる。
プロジェクトのシーンフォルダにある、Lightwaveのシーンファイルと同じ名前の立方体のようなファイルがある。それをシーン内にドラッグし、プロジェクトのそのインスペクターの一番上のScaleFactorを1程度し、Applyをクリック。すると大きくなって目視できるようになる。
この状態でLightwaveでシーンファイルを開き、変更すると自動ですぐさまUnityにも変更が反映される。

 

テクスチャについて:
Lightwaveのテクスチャ(色、自己発光度、反射光、透明度、バンプなど)は、正しくUnityに転送できないことが多い。なので、まずLightwave上でUVテクスチャを作り、普通に物体を作る。その後Lightwave上ではテクスチャをすべてはずして転送し、Unity上で画像ファイルをUVに対応させる、という手順のほうがよさそうである。
基本的にDeffuseのみでよい。これは色をつけるだけ。そのテクスチャは、Lightwaveで反射光、光沢、自己発光、バンプもすべて含めて実質ベイクした状態として、テクスチャとして貼り付けておくとよい。

 

Unityの制限:
投影マッピングはUVしか使えない。
1オブジェクトに使えるUVマップは最大2つまで。
プロシージャル、クリップ、ノードは持ち込めない(複雑なノードを使用するときは、テクスチャにUVベイクするといい)

 

アニメーション方法:
純粋なボーンのキーフレームしかコピーできない。IKなどはキーフレームにベイクする。モーフや物理演算は不可能か。

 

FBX互換:
FBXファイルでもUnityにインポートできる。本来はこちらのほうが汎用的なファイル形式。アセットにインポートするだけでいい。

 

/////////
3Dモデルの設定(プロジェクトビュー)

 

3Dモデルをインポートすると、以下のプロパティが調整できる。
プロジェクトビューで3Dモデルを選択し、インスペクターのModel,selectで、Model,Rig,Animationsという項目がある。

 

///Model
Scale Factor:インポート時の拡大縮小が可能。
Mesh Compression:高くするとファイルサイズが減るが、異常が生じる場合がある。可能なら、おかしくならない程度にできるだけ上げる。
Read/Write Enabled:オフにするとメモリを節約するが、異常が生じる可能性がある(似たようなメッシュをインスタンス化することで節約する機能)
Generate Colliders:自動でコライダーを作る。移動しない物体では使いべきではないらしい。
SwapUVs:ライトマッピングがUVを間違えたときはこれで変更できる。
Generate Lightmap:これでライトマップのためのUV2を作成する。
Normals:法線の計算。Importは普通に計算。Calculateはスムージングで法線を計算。Noneは法泉の計算をしない。ライトの影響がない物体には使える。
Tangents:接線の計算。ImportはFBX、Maya および 3dsMax でファイルに法泉の計算方法が含まれているときのみ選択可能。Calculateはデフォルトで、普通に計算。Noneは計算しない。
Smoothing Angle:いわゆるスムージング角度。
Split Tangents:メッシュ上の継ぎ目が問題でライトマップがおかしくなるとき、これを有効にするといいらしい。

 

Material:
Import Materials:無効にするとマテリアルがオフになり、デフォルトのDiffuseが使用される。
Material Search:Material Namingオプションで定義された名前でUnityがマテリアルを検索する場所が、どこまで探すか。

 

///Rig
Animation Type:
人間ならHumanoidにしたほうがいい。汎用的なリグを使ったりできる。
これを変更時、リグとの対応がなされ、上手くいくとconfigueの欄にチェックがつく。
Genericはヒューマノイドではないものに使う。ヒューマノイドのいくつかの機能は使用できない。
Legacyは以前のUnityで作った場合に有効なもの。
インスペクターのConfigueで3DCGで作ったボーンとUnityで用意されたヒューマノイドのボーンを、相当するものに合わせる。これでUnityの持つヒューマノイドの機能を使える。

 

アバター確認:
人型のキャラクターは、通常の3DCGでもそうだが、まずT字のポーズをとっていないといけない。さもないと不安定な動きになることがある。
ヒューマノイド特有の機能を利用するため、アバターとインポートしたキャラクターのボーン構造が一致していないといけない。以下のようにする。

 

リターゲティング:
あるキャラクターのアニメーションを、別のキャラクターのアニメーションに移すこと。
キャラクターは、通常のヒューマノイドに設定していると、ヒエラルキーでは親のゲームオブジェクトがあり、キャラクターのルートボーンはその子オブジェクトになっている。
その子オブジェクトと同じ階層に、移し先のキャラクターのルートボーンを入れ、元のキャラクターを無効化すれば、同じアニメーションで移せる。

 

///Animations
Clips,Start,Endは、アニメーションのクリップ(モーションの一塊)で、これで一連のアニメーションとみなされる。
+を押して分割できる。時間の設定は下のStart,Endを調整すればいい。
Lightwaveの一つのシーンに必要なすべてのアニメーションを詰め込み、分割すれば作業が楽。

 

loop match:
アニメーションの最初と終わりがスムーズにループできるかどうかの自動チェックができる。緑だとスムーズで、赤だとうまくいっていない。
LoopPoseを有効にすると、無理やり最初と終わりを滑らかにする。

 

Mask:
特定のボーンの場所を動かなくすることができる。主にAniatorのアニメーションレイヤー機能を併用する。

 

//////////////////
Animator Component

 

コンポーネントにAnimatorというのがあり、3Dモデルをインポートするとこれが自動で入っている。
Controller このキャラクターにアタッチされたアニメーターコントローラ
Avatar このキャラクターのアバター
Apply Root Motion  キャラクターの位置をアニメーション自体から制御するかスクリプトから制御するかどうか
Animate Physics アニメーションが物理挙動と連動する必要があるか
Culling Mode アニメーションのカリングモード
Always animate つねにアニメーションし、カリングを行わない
Based on Renderers レンダラが非表示の場合ルートモーションのみがアニメーションされます。キャラクターが非表示の場合、体の他の部分はすべてスタティックとなります。

 

//////////
Animator Controller(アニメーターコントローラー)

 

プロジェクトビューから作成。ステートマシンを制御する。

 

ステートマシン:
アニメのステート(状態)がそれぞれあり、それらを矢印で結ぶ(トランジション)がある。これで任意のアニメーションの作成と、その遷移を作成する。
ステートを作るには、まず3DCGモデル読み込み時に作成したアニメーションクリップを必要な数だけ用意し、それらはプロジェクトビューにあるので、Animatorへドラッグすればよい。または右クリックで空のステートを作り、Motionにそれを指定すればよい。
AnyStateは「すべてのステート」を意味する。あらゆるステートから遷移できる矢印を書くことが可能。AnyStateへ入る矢印は作れない。
デフォルトのステートは茶色で示される。変更する場合はステートで右クリックしてSetAsDefault。

 

パラメータ:
Animatorの左下にパラメータがある。これはすでに定義されているとみなされる。たとえばBoolでJumpというパラメータを追加したら、後はスクリプトで
アニメータのインスタンス.SetBool ("Jump", true);
などして、パラメータを変化させられる。
左下の状態や数値がデフォルト。たとえばBoolならチェックを入れるとオン(True)の状態がデフォルトになる。
たとえばジャンプすべきオブジェクトにスクリプトを適用し、その中に「スペースキーを押したらJumpブール変数をTrueにセットする」を書いておき、ジャンプするトランジションConditionsにJump,trueを入れておけば、スペースキーを押したときにジャンプするアニメーションが作れる。

 

ステートのインスペクター:
Speed アニメーションのデフォルトの速度
Motion ステートに割り当てられているアニメーションクリップ
Foot IK ステートで足のIKを有効にするか
Transitions ステートの遷移先ステート一覧

 

Transition:
Atomic:有効にすると中断できなくなる。
Conditions:遷移のタイミング。左の変数が右の数値になるとtransitionが起こる。たとえば「Jump true」なら、Jumpという変数がtrueになるとこの遷移が起こる、ということ。変数はスクリプトで調整したりする(スペースキーを押したらJumpがtrueになる、など)
変数はAnimatorの左下ので追加したりする。数値は初期値。+で追加、-で削除。
ExitTimeはデフォルトで存在する変数。遷移前のアニメーションが終わってこの秒数経過すると、次のアニメーションに遷移する。

 

Transitionで起こりうる問題:
ジャンプやしゃがみなど、ボタンを押した瞬間にしてくれないと困る。ジャンプなどのモーションは、その瞬間から飛ぶのがよい。助走をつけたモーションだと、ボタンを押しても助走が始まり、なかなかジャンプしてくれずに操作性が悪くなる。

 

BrendTree:
一つのステートで、条件が変わると別のアニメーションをいくらかの割合で合成させる機能。たとえば「歩行」ステートで、通常時のアニメーションがAとした場合、スピードが速くなったらBのアニメーションをやる、というようなもの。ただしスピードが速くなったら突然Bになるのではなく、徐々に滑らかに変化する。
インスペクターで+で条件を追加する。Parameterで速度、角速度、方向がデフォルトであり(追加可能)、これらがどの値に達すると変化するかを真ん中の数値(スレッショルド)で調整する。
右の値は、時間。これを大きくすると、早くアニメーションするようになる。
一番右のチェック部分は、ミラーリング。逆方向のアニメーションができる。
ほかのパラメータはあまり気にしなくていい。スレッショルドを自動で計算したりするもの。automateは自動で均等に計算するもの。
1Dは一つの値によってモーションを分ける。
2Dは二つの値によってモーションを分ける。赤い丸が現在の位置で、青いひし形は2つの条件の影響範囲を示す。青のひし形の濃い部分ほど影響が強い。赤の丸を動かして、影響の強いひし形は大きく表示されるのでわかりやすい。とにかく使ってみるとわかる。Simple,Directional,Cartesianの違いは、ひし形の影響範囲の仕方が異なるだけ。
AdjustTimeScaleで時間の早さを自動調整する。

 

サブステートマシン:
CreateSub-StateMachineでサブステートマシンを作れる。いくつかのステートマシンをまとめたもの、というだけ。
サブステートマシンをダブルクリックで、中身を編集できる。Upで外にあるどれかと接続できる。

 

アニメーションレイヤー:
Animatorの左上で、レイヤーを追加できる。追加すると、ボディマスクとブレンディングを指定できる。
たとえば上半身だけ別の動きをさせたい場合、上半身だけ動くボディマスクを適用し、ブレンディングでOverride(上書き)をすればよい。元のアニメと半々くらいで混ぜたいならAdditiveにすればよい。
レイヤーの実行順は上からであり、下のほうにOverrideがあると、上のレイヤーを上書きする。
レイヤーの時間の長さ異なる場合、同期することはなく、時間のない部分については空白のまま何もアニメーションしない部分となる。

 

ソロとミュート:
ステートのインスペクターで、ソロにすると、そのステートからのほかの遷移は無効になる。ミュートは文字通りそれが無効になる。
これはステートのインスペクターでやるべきで、トランジションでも同じ機能があるが、非推奨らしい。

 

ターゲットマッチング:
アニメーションの最中、体のある部分が、ある時間のときに特定の場所にもっていきたいことがある。そのときはMatchTargetというものを使う。
animator.MatchTarget(jumpTarget.position, jumpTarget.rotation, AvatarTarget.LeftFoot, new MatchTargetWeightMask(Vector3.one, 1f), 0.11f, 0.223f);
のように使う。

 

///アニメーションの編集(Animationウインドウ)
Window,Animationで、アニメーションを編集・追加できる。特にスプライトではここでの編集が必須。
ヒエラルキーで編集するオブジェクトを選択すると、編集できる。またはヒエラルキーでオブジェクトを選択し、Animationで左上あたりの空白で新規追加すれば、アニメーションを作れる。
アニメーションの追加の場合、AddCurve。
やり方はLightwaveと同じで、時間位置に赤線を持ってきて、オブジェクトを動かせばそれでキーフレームが追加される。インスペクターでは、赤くなっている部分はその時点で値を変えればキーフレームが追加される。
下のほうでドープシートかカーブか、表示を選択できる。カーブでは、キーフレーム間の補完カーブの編集ができる。キーフレームの場所で右クリックして、カーブの種類を変更できる。
スプライトの場合、分割前のスプライトをヒエラルキーに出し、それをAddCurveのSpriteRendererで、インスペクターでSpriteを追加、インスペクターでSpriteの内容を変えれば瞬時に変わるアニメーションが作れる。
新規追加時にアニメーションコントローラーも追加されるので、メカニムを使うことが可能。
親子付けされているオブジェクトなら、親オブジェクトのAnimationを作ることで、AddCurveの中に子オブジェクトという項目ができ、子オブジェクトのアニメーションも一度に編集できる。
ほかにもいろいろアニメーションできる。スクリプトのオンオフも調整できる。

 

3Dモデルのanimation:
ボーンや移動に関してはメカニムを使えばいいが、テクスチャを動かす場合はこれを使うことになる。
Material_Reference[0]でキーフレームを作り、いつもどおりMaterialをヒエラルキーにドラッグすることで、その地点でMaterialを変更できる。テクスチャの内容を変更させる場合はこうする。
Material_STで、タイリングの数やオフセットを変更できる。テクスチャの位置を変更するにはこうする。
テクスチャに動画を貼りこむにはProバージョンでないといけないが、アニメーションの数だけ静止画を用意し、Material_Referenceで画像を変更し、オフセットで移動させれば、テクスチャのアニメーションはできる。

 

アニメーションイベント:
スクリプトを作り、今Animationを使っているオブジェクトに適用、スクリプトの中に関数を入れておくと、アニメーションの特定の時間でその関数を実行できる機能がある。
Animationの上野黒い部分で右クリック、イベントを追加し、適用する関数を指定すると、そのタイミングで関数が起きる。
関数に引数がある場合、引数をアニメーションの中で指定できる。

 

//////////////
人体アニメーション

 

///Mecanim Locomotion Starter Kit
アセットストアに置いてある。unity製のアセット。これを改良して人間のアニメーションを作れる。
まずデフォルトアバターを画面に配置する。そしてヒエラルキーのデフォルトアバターを選び、インスペクターでセットアップ。
Controller:Locomotion
Avatar:Default Avatar

 

さらにAdd Componentでスクリプトを入れる。スクリプトはLocomotion Player。

 

JoystickToEvents.Do(transform,Camera.main.transform, ref speed, ref direction);
キーの入力を受け付ける記述。矢印キーで、右を押せば右へ、左を押せば左へ移動する。これだけでは動かせない。

 

locomotion.Do(speed * 6, direction * 180);
実際にどんな速度で、どの方向へ動かすかの記述。sppedの数値で走る速さを、directionの数値で回るときの回り角度を設定する。

 

応用:
float a = Input.GetAxis("Horizontal");
float b = Input.GetAxis("Vertical");
locomotion.Do(b * 2, a * 100);

 

Inputはキー入力受付だが、いろいろな方向性を持つ入力を受け付けるらしい。汎用受付。
Horizontalは左右、Verticalは上下の受付。
locomotion.Doの数値で、水平、垂直の移動速度を決める。
この応用では、左右キーではその場で回るだけで、上キーを進むとその方向へ進む。バイオハザードのような操作感になる。

 

///Charactor Controller
新規でプロジェクトを作るときに選択できるコンポーネント。人体に適用することで、人体に当たり判定を作ってくれる。
まずアバターのインスペクターで、Update ModeをAnimate Physicsにする。これで物理演算が適用される。
ヒエラルキーの、デフォルトアバター直下の、リファレンスでないほう(Geo_grp)が3D本体なので、これにCharactor Controllerをコンポーネントから適用する。
衝突判定に関係するスクリプトはGeo_grpに組み込む。
これはAddForceの作用を受けない。普通の物理演算が適用されない。JointやForceを与えたい場合、新たにRigidbodyを実装して行う。
当たり判定はY軸方向のみなので、人間が向きを変えたり重力方向が変わる場合、新たにRigidbodyを適用する必要がある。
Charactor ControllerをRigidbodyの親にするとJointのような動作になる。

 

注意点:
物理演算と相性が悪いらしく、あまり正しい動きをしないらしい。可能なら自前のスクリプトで動かすべき。

 

///////////
Animator

 

アニメーションをステート(状態)とトランジションに分けて作成し、変化させる。

 

パラメータ:
左下のパラメータは、「これが○○になると別のステートにトランジションしながら遷移する」という意味。
+で新規作成、-で削除。
たとえばパラメータにBoolの「Jump」というパラメータを作成し、トランジションのConditionでJump,trueにすると、スクリプトでJumpをtrueにしたときにその方向へトランジションが起こる。
中央部の長方形と上の矢印(始まりと終わり)を動かすことで、遷移するタイミングやトランジションの重なり時間を調整できる。

 

ステート(四角):
新しくアニメーションを登録するには、右クリックで新規ステートを作成し、Motionにその動きを入れる。
速度も調整できる。

 

トランジション(矢印):
Conditionsでその動きが行われる条件を入れる。Exit Timeはデフォルトであるもので、その動作が終わると自動的に遷移するもの。

 

/////////
例文

 

//この記述はデフォルトアバターに組み込む
//あらかじめメカニムのアニメーターで、Boolパラメータ「Jump」を作っておく。そこにジャンプモーションを入れておく。
//さらに新しいステートメント「Jump」に歩いているステートから互いにトランジションさせたジャンプするステートを作っておく。
//スペースキーを押すとJumpブールがtrueになるため、アニメーターは歩きからJumpへトランジションする。
//Locomotionというベースステートの名前。Locomotionの中のJumpステートはLocomotion.Jumpとなる

 

public class JJ : MonoBehaviour {

 

void Start () {

 

}

 

// Update is called once per frame
void Update () {
Animator a = GetComponent();
if (Input.GetKey (KeyCode.Space) == true) {
a.SetBool ("Jump", true);
}

 

AnimatorStateInfo b = a.GetCurrentAnimatorStateInfo (0); //現在のアニメーターの状態をbに入れる
if (b.IsName ("Locomotion.Jump") == true) { //ジャンプした瞬間、aはfalseに戻す
a.SetBool ("Jump", false);
}
}
}

 

//////////////////
経路探索(Navigation機能)Pro専用?

 

自動追跡の機能。敵キャラクターが主人公を自動で追いかける、というようなことができる。
追跡は最短経路で行われる。

 

手順:
Window,Navigationでパネルを出す。
最初に、追跡するキャラがどこを通れるか、通れないかを決める。これはポリゴンで決める。このポリゴンをナビメッシュという。
通れるところは地面のような「平面」で、通れないところは壁のような面で決める。
まずナビメッシュを作る。ヒエラルキーでオブジェクトを選び、ナビメッシュに含めたいものを選び、含めたいものにはすべてObjectインスペクターでNavigation Staticを有効にする。SceneFilterはヒエラルキーで余計なオブジェクトを表示しなくさせるだけ。
地面を設定するとき、Navigation Layerは、デフォルトなら普通に歩くべきところ、NotWalkableは、歩けそうなところでも歩けなくする。Jumpはたぶん、ジャンプして飛び越えるところ。
自動である程度計算してくれる。Bakeインスペクターで調整する。

 

Radius:キャラクターがどれだけ壁まで近づけるか。あまり大きくすると、通れる部分が狭すぎて動けなくなったり、天井に頭がつっかえて動けなくなるので注意。
Height:ナビメッシュの通れる部分は地面で指定するのだが、その地面からこの高さまでは通行可能となる。キャラクターの背丈がこれを越えると頭がつっかえて通れなくなる。
MaxSlope:この角度以上だと壁とみなされ、通れなくなる。基本、地面は通れて、壁は通れなくなる。地面に適用したときは、Defaultで通れるが、NotWalkableは通れない。壁に適用したときは、DefaultでもNotWalkableでも通れない。
StepHeight:地面の凹凸があるとき、この高さまでは凹凸を無視して通れるようにする。

 

調整したら、Bakeを押す。気に入らなければClearでやり直す。
追跡者にComponent > Navigation > Nav Mesh Agentを適用。スクリプトから適用する場合は
var agent: NavMeshAgent = GetComponent.();
agent.SetDestination(targetPoint);
のようにする。
後は目的地をセットするだけ。

 

オフメッシュリンク(Proのみ):
2つのナビメッシュの橋渡しをするリンク部分を作成し、条件によってそこを通過できたりできなくしたりできる。
特定の部分を強制的に通過させることもできる。

 

レイヤー:
レイヤーというのがあり、これで通過コストをそれぞれ設定できる。何かというと、通常は最短距離を通るのだが、コストを大きくするとハイリスクということになり、避けるようになる。これにより、必ずしも最短距離を通らないように設定できる。
ObjectにNavigation Layerというのがあるが、これがそのコストのレイヤー。デフォルトで3つあるが、右のLayersで追加可能。新たにコストを設定し、そのレイヤーをオブジェクトに設定することで、ハイコストなナビメッシュを作成できる。
コスト値は1以上の値を使用すべき。さもないとおかしな動きをすることがある。
実際には思うように追跡できないかも知れず、試行錯誤が必要なことが多い。

 

///////////////////
コンポーネント

 

基本:
設定マークで、コンポーネントの設定をコピーしたり、上下に移動したりできる。
コンポーネントのチェックをはずすことで、非アクティブにすることができる。一時的に無効になる。親オブジェクトを非アクティブにすると、子オブジェクトも非アクティブになる(ただしこのとき子オブジェクトのactiveSelfの値は変わらない)これは非アクティブ効果が親からオーバーライドされているからなので、activeInHierarchyを使えばオーバーライドも含めてアクティブかどうか判定できる。

 

///MeshRenderer
これをオフにすると見えなくなる。

 

////////////
Rigidbody系

 

///Rigidbody2D
物理エンジン。HardFXと同じ。けっこう重いので注意。無駄に計算させないように。
これだけでは衝突判定は出ないので注意。衝突させたい場合はColliderも適用する。
物理演算機能中にtransformを使うと、おかしな動きになるので注意。親子関係でも同じで、物理演算オブジェクトの親をtransformで動かすと、やはり同じく不安定な動きになる。
Rigidbody同士では衝突が起こらない。コライダとは起こる。このあたりはLightwaveと同じ。
注意点として、現実的な値を用いることと、重力の値は変えないほうがいい。重力を変えるととんでもない動作をすることが多く、別の値を変えたほうがいいらしい。

 

Mass:重さ、kg
LinearDrag:移動時の空気抵抗。通常は0.01〜10くらいに治まる。
AngularDrag:回転時の空気抵抗
GravityScale:重力の影響強さ
FixedAngle:衝突時に回転するかどうか

 

IsKinematic:
通常のRigidbodyではtransformで動かすと物理演算の力も働くために思ったように動かない場合がある。IsKinematicするとtransformなどで完全に動きをコントロールできる。
IsKinematic有効の場合、物理演算の影響を受けない。ただし当たり判定を検出でき、ほかのオブジェクトには動き的に衝突の影響を与える。
通常はIsKinematic有効で手動アニメーション操作し、何かがぶつかったときにスクリプトで無効にし、WakeUpすれば、ぶつかった瞬間に物理演算を発動できる。
HingeJointを使う場合はこれを有効にすると便利。

 

Interpolate:計算のスムージング。Interは直前の位置で計算、Extraは次のフレームの位置を予測して計算。
SleepingMode:どのタイミングで計算を開始、終了するか。NeverSleepは常に演算有効。StartAwakeは何かに衝突して演算開始、止まると終了。AtartAsleepは任意のタイミングで開始、衝突して開始、止まると終了。
CollisionDetection:Descreteでオブジェクト同士が、1フレーム内で接触していなければ貫通。Continuousで1フレーム内で接触していなくても補完計算で貫通しない。高速すぎて貫通して困る場合にContinuousにする。負荷が大きい。
ContinuousDynamic:静的なコライダにもContinuousを適用する。Continuousよりさらに負荷が大きい。これでも上手くいかないなら、インスペクタのTime ManagerのTime Stepを減らしてもよい。
Constrains:Rigidbodyの動きを制限する。その部分だけ動かなくする。

 

///////////////
Collider系

 

Collider系はゲーム中に有効無効を変更すると多大な負荷がかかり、ゲームが不安定になるのでやるべきではない。途中で有効向こうを切り替える場合は、RigidbodyのIsKinematicを調整してやるべき。
ヒューマノイドではCharactor Controllerを使用すべき。
Collider同士は衝突しないが、Convexを有効にすると衝突できる。

 

コライダと中心点:
コライダのCenterの値を変えると、どうやらそこが回転の中心になるらしく、オブジェクトを回転させたときの挙動がおかしくなる。
なので、カメラなどにコライダをつけるときは、カメラに子オブジェクトを作成し、それにコライダをつけるとよい。

 

複合コライダ:
親子付けし、親にコライダ、子にもコライダをつけることで、複合的なコライダがつけられる。
また親にリジッドボディ、子にコライダをつけると、親は別のコライダで衝突されて吹き飛び、それに衝突した別のリジッドボディも動かせる。つまり、玉突き事故のような再現はこのようにして行う。
コライダの種類を増やす場合、子を増やしてそれにコライダをつけていけばよい。
メッシュコライダは負荷が大きい。よく動くものにはプリミティブなコライダをつけ、背景オブジェクトにメッシュコライダを使うことが多い。

 

///CircleCollider2D
衝突エンジン。Collision。オブジェクトの丸がその判定。
衝突が必要なものにはすべてこれが必要。

 

Material:PhysicsMaterial2Dなど設定することで摩擦や跳ね返りを設定できる。右の丸をクリックして適用したいPhysicsMaterialを選ぶ。
IsTrigger:チェックを入れると衝突を無効にする。接触判定はあるが物理的にはぶつからない、という状態になる。
Radius:衝突範囲の半径。
Center:衝突の中心。

 

///BoxCloiider2D
Circleと同じ。衝突エンジン。

 

///MeshCollider
2DではPolygonCollider2Dという名前になる。ポリゴン単位で衝突させるが、負荷が重い。
普通、これどうしは接触できないが、どうしてもやりたいならconvexをオンにする。
Convexをオンにした場合、面数は255以内でないといけない。
デフォルトでは適用したオブジェクトのレンダリングに使用されているメッシュが衝突部分のポリゴンになる。プロパティで変更することもできる。

 

///PolygonCollider2D
オブジェクトの形に添って衝突を作る。CircleやBoxより重い。
Shift押しながらクリックで、判定ポリゴンの頂点を移動できる。
ctrl押しながら頂点を選択で、頂点を消す。できるだけポリゴンを少なくしたほうが計算が軽くなる。

 

//エッジコライダ2D
ポリゴンコライダと似ている。ポリゴンの編集はシフト押しながらクリック。

 

/////////////
Joint系

 

///SpringJoint2D
Rigidbody2Dが設定された2つの物体を、ばね状のものにぶら下げるような物理演算ができる。
ばねの付け根になる物体にこれを適用する。

 

CollideConnected:ジョイントされた物体同士で衝突するかどうか。チェックすると衝突する。
ConnectedRigidbody:ジョイントするオブジェクトを指定。
Anchor:つるす物体のアンカーポイント(つるす付け根の位置)のローカル座標を指定。0,0が中心点の位置になる。
ConnectedAnchor:つるされる物体のアンカーポイントを指定。
Distance:ばねの長さ。
DampingRatio:ばねの減衰閾値。
Frequency:ばねの振動周波数。

 

3Dの場合のプロパティ:
Connected Body ジョイントが依存する剛体へのオプションのオプションの参照。
Anchor ジョイントの中心を定義するオブジェクトのローカル空間での位置 (静止時)。 これは、オブジェクトがびょうがされる先の点ではありません。
X X 軸に沿ったジョイントのローカル点の位置。
Y Y 軸に沿ったジョイントのローカル点の位置。
Z Z 軸に沿ったジョイントのローカル点の位置。
Spring スプリングの強さ。
Damper 有効な場合にスプリングを減らす量。
Min Distance この距離を超えると、スプリングが起動しません。
Max Distance この距離を未満の場合、スプリングが起動しません。
Break Force このジョイントが分解するのに適用される必要のある力。
Break Torque このジョイントが分解するのに適用される必要のあるトルク。

 

///DistanceJoint2D
Rigidbody2Dが設定された2つの物体を、ひも状でつなぐ。
Springと違う点は、一定以上距離が離れない。
あとはSpringJointと同じ。

 

///HingeJOint2D
Rigidbody2Dが設定された2つの物体を、蝶番状でつなぐ。ドアのような動き。
あとはSpringJointと同じ。
モーターを使うと自動で回すことができる。

 

UseMotor:モーターを使うかどうか。
MotorSpeed:モーターの速さ。
MaximumMotorForce:モーターの最大トルク。回転する力。
UseLimits:回転角度を制限するかどうか。
BreakForce・BreakTorque:これ以上の力を加えると切り離せる。

 

3Dの場合のプロパティ:
Connected Body ジョイントが依存するリジッドボディへのオプションの参照。 設定しないと、ジョイントはワールドに接続します。
Anchor ボディが揺れる中心となる軸の位置。 この位置はローカルなスペースで定義されます。
Axis ボディが揺れる中心となる軸の方向。 この方向はローカルなスペースで定義されます。
Use Spring スプリングは、リジッドボディをその連結されたボディと比較して、一定の角度に到達させます。
Spring Use Springを有効にした場合に使用されるスプリングのプロパティ。
Spring オブジェクトが前述の位置に移動するのに出す力。
Damper この値が高いほど、オブジェクトの速度は低下します。
Target Position スプリングの対象角度。 スプリングは、°で測定されたこの角度に向けて引っ張られます。
Use Motor モーターはオブジェクトを回転させます。
Motor Use Motorを有効にした場合に使用されるモーターのプロパティ。
Target Velocity オブジェクトが達成しようとする速度。
Force オブジェクトが前述の速度を達成するのに適用される力。
Free Spin 有効にすると、モーターは回転にブレーキをかけるのに使用されず、加速にのみ使用されます。
Use Limits 有効にすると、MinとMax値内にヒンジの角度が制限されます。
Limits Use Limitsを有効にした場合に使用される制限のプロパティ。

Min 回転が到達できる最低角度。
Max 回転が到達できる最高角度。
Min Bounce 最小の停止に到達した際にオブジェクトが跳ね返る量。
Max Bounce 最大の停止に到達した際にオブジェクトが跳ね返る量。
Break Force このジョイントが分解するのに適用される必要のある力。
Break Torque このジョイントが分解するのに適用される必要のあるトルク。

 

///SliderJoint2D
Rigidbody2Dが設定された2つの物体を、指定した線でつなげる動き。レールの上を走るような動き。
あとはSpringJointと同じ。モーターの設定はHingeと同じ。
Angle:沿わせる線の角度。ワールド座標での角度で、たとえば0にすると、見た目垂直線にしたがって動く。90なら真横線。

 

//////////////
PhysicsMaterial

 

アセットの中で呼び出す。呼び出して必要なオブジェクトに適用して使う。
コリジョンなどのMaterialに適用して使う。

 

DynamicFriction:動摩擦係数0〜1。高いほど摩擦が大きい。
StaticFriction:静止摩擦係数0〜1。高いほど摩擦が大きい。
Bounciness:跳ね返り係数0〜1。高いほどよく跳ね返る。
FrictionCombine:2つの物体が接触するとき、2つの摩擦係数の平均、掛け算、大きいほう、小さいほうが実際の摩擦係数になる。
BounceCombine:2つの物体が接触するとき、2つのBouncinessの平均、掛け算、大きいほう、小さいほうが実際の摩擦係数になる。

 

Friction Direction 2 異方性の方向。 この方向が 0 でない場合、異方性摩擦が有効になります。 Dynamic Friction 2 と Static Friction 2 Friction Direction 2に沿って適用されます。
Dynamic Friction 2 異方性摩擦を有効にすると、DynamicFriction2 が、Friction Direction 2 に沿って適用されます。
Static Friction 2 異方性摩擦を有効にすると、StaticFriction2 が、Friction Direction 2 に沿って適用されます。

 

/////////
音響系

 

///Audio Source
サウンドを入れる。ここから音が出ているということ。これらが「聞こえる地点」はAudio Listenerのところになる。
これはシーンに複数設定できる。
3Dにするとゲーム中空間の影響を反映し、距離が離れると音量が小さくなる。
グラフは、ソースからの距離をその音量。
携帯デバイスでは特に、mp3しか使用できず、完全なループが作れないことに注意。

 

Audio Clip 再生される音声クリップを参照します。
Mute 有効にすると、音声は再生されますが、ミュートになります。.
Bypass Effects オーディオ ソースに適用されるフィルター効果を素早く「バイパス」します。 簡単にすべての効果をオン・オフできます。
Play On Awake 有効にすると、シーン開始時に音声の再生が始まります。 無効にすると、スクリプティングから「Play()」を使用して開始する必要があります。
Loop 有効にすると、最後に達した時に、「オーディオ クリップ」がループします。
Priority シーンにある他のすべてのオーディオ ソースの間でこのオーディオ ソースの優先度を決定します。 (優先度: 0 = 最重要、 256 = 最も重視しない、 デフォルト = 128)。 音楽トラックが時々スワップアウトするのを避けるには、0 を使用します。
Volume Audio Listener からワールド座標で 1 単位 (1 メートル) の距離での音声の大きさ。
Pitch 「オーディオ クリップ」での減速 / 加速によるピッチの変化量。 1 が普通の再生速度になります。
3D Sound Settings 3D 音声の場合にオーディオ ソースに適用される設定。
Pan Level 3D エンジンがオーディオ ソースに与える効果の程度を設定します。
Spread スピーカー空間内の 3D ステレオまたはマルチチャンネル音声に広がり角を設定します。
Doppler Level このオーディオ ソースに適用するドップラー効果の量を決定します (0 に設定すると、効果は適用されません)。
Min Distance MinDistance 内は、音声は最も大きくなります。 MinDistance 外では、音声が弱まり始めます。 音声の MinDistance を増やすと、3D 世界での音声が「大きく」なります。減らすと、3D 世界での音声が「小さく」なります。
Max Distance 音が弱まるのを止める距離。 この地点を超えると、リスナーから MaxDistance だけ離れた音量を維持し、値が下がりません。
Rolloff Mode 音声がフェードする速度。 この値が高いほど、音声を聞く前にリスナーがより近づく必要があります (グラフによって決定されます)。
Logarithmic Rolloff オーディオ ソースに近づくと音声が大きくなりますが、オブジェクトから離れると、かなりの速さで低くなります。

Linear Rolloff オーディオ ソースから離れるほど、聞こえにくくなります。
Custom Rolloff オーディオ ソースからの音声が、ロール オフのグラフの設定状態に応じて動作します。
2D Sound Settings 3D 音声の場合にオーディオ ソースに適用される設定。
Pan 2D 3D エンジンがオーディオ ソースに与える効果の程度を設定します。

 

///Audio Listener
AUdio Sourceから音が出て、Audio Listenerで音を聴く。通常これはカメラに仕込まれる。またListenerのほうはシーンに一つしか生成できない。
一つのシーンで2つ以上設定するとおかしなことになるので注意。

 

///リバーブゾーン
リバーブをつける。洞窟シーンとかで使える。
Min以下では完全にリバーブが効いている。Max以上ではまったく効かない。MinとMaxの中間では、徐々にMinへ向かってリバーブが強くなっていく。

 

////////////////
その他コンポーネント

 

///Constant Force
ずっと一定の力を加え続けるだけ。Relativeはローカル空間、ほかはワールド空間。

 

///Smooth Follow
Targetで設定したアイテムを追随するカメラを設定できる。これ自体はカメラに設定する。

 

///Mesh Renderer
Removeしたり無効にすると物体が見えなくなる。ただし当たり判定などは残っている。

 

//////////////////////
Efeects系

 

//////////////
Particle System

 

基本:
プロパティの中にはカーブエディタで編集するできるものがある。カーブのポイントを選択肢、右クリックで曲線の形を変化できる。
パーティクルオブジェクトを親子付けすると、OpenEditorでまとめて編集することもできる。
+で最適化(無駄なポイントを削る)、-でカーブを消す。
カラーでは、グラディエントで時間に対する変化などを指定する。時間とともに少しずつ変化したりできる。長方形のすぐ上、下をクリックして色など追加できる。上はアルファ、下は色。

 

基本値:
Duration パーティクルシステムがパーティクルを発光する期間
Looping パーティクルシステム がループするかどうか
Prewarm ループしている場合のみ事前発光が出来る、すなわち パーティクルシステム はあらかじめ 1サイクルのパーティクルの発光を行ったかのように、スタート時に発光されたパーティクルが存在。
Start Delay パーティクルシステム がパーティクル発光前に待機する秒単位での遅延時間。Prewarm が有効でループしている場合は Start Delayは使用できないことに留意して下さい。
Start Lifetime パーティクル生存期間を秒単位で指定。( MinMaxCurve を参照して下さい)。
Start Speed パーティクルが発光される初期速度。( MinMaxCurve を参照して下さい)。
Start Size パーティクルが発光される初期サイズ。( MinMaxCurve を参照して下さい)。
Start Rotation パーティクルが発光される初期の回転。 ( MinMaxCurve を参照して下さい)。
Start Color パーティクルが発光される初期カラー。(See MinMaxGradient).
Gravity Modifier 生存期間中にパーティクルに影響する重力の大きさ。
Inherit Velocity パーティクルがパーティクルシステムの Transform から継承すべき速度の大きさを制御する係数 (移動するパーティクルシステム向け)。
Simulation Space パーティクルシステム をローカル座標、ワールド座標のいずれかでシミュレーション。
Play On Awake 有効にすると、パーティクルシステム 作成時にが自動的に開始。
Max Particles パーティクルシステム が発光するパーティクルの最大数。

 

Emission モジュール:
発光されているパーティクルの割合を制御し、特定のタイミングに大規模なパーティクルのグループの生成を許容します(パーティクルシステムの期間を通じて)。同時に多くのパーティクルを生成すべき爆発などに便利です。
Rate 時間(毎秒)または距離(メートル)ごとに発光されるパーティクルの量 ( MinMaxCurve を参照して下さい)。
Bursts (Time オプションのみ) パーティクルシステムの期間中に発生するパーティクルの爆発を追加
Time and Number of Particles 特定の量のパーティクルが発光されるべき時間を指定(期間内に秒単位で)。+および−を使用して爆発の数を調整します。

 

Shape Module:
エミッターの形を定義します: 球(Sphere), 半球(Hemishpere), 円錐(Cone), 箱(Box) および メッシュ(Mesh)。表面の法線またはランダム方向に沿った力の初期サイズ。
Sphere
Radius 球の半径 (シーンビューの中のハンドルを使う方法でも微調整が可能)。
Emit from Shell 球の外郭から発光。無効化した場合、パーティクルは球の内側部分から発光。
Random Direction パーティクルが発光する場合にランダムな向きをさせるか、球の表面の法線に沿って発光させるか。
Hemisphere
Radius 半球の半径 (シーンビューの中のハンドルを使う方法でも微調整が可能)。
Emit from Shell 半球の外郭から発光。無効化した場合、パーティクルは半球の内側部分から発光。
Random Direction パーティクルが発光する場合にランダムな向きをさせるか、半球の表面の法線に沿って発光させるか。
Cone
Angle 円錐の角度。もし角度が 0 の場合、パーティクルは一方向に発光されます (シーンビューの中でハンドルによって微調整が可能)。
Radius 0 より大きい値は円錐台となり、点ではなく円から発光。 (シーンビューの中でハンドルによって微調整が可能)。
Length 発光する体積部分の長さ。 Emit From の値が Volume または Volume Shellのときのみ。 (シーンビューの中でハンドルによって微調整が可能)。
Emit From 発光の生成元がどこか。選択肢はBase, Base Shell, Volume およびd Volume Shell。
Random Direction パーティクルが発光する場合にランダムな向きをさせるか、円錐に沿って発光させるか。

Box
Box X ボックスのX方向のスケール。 (シーンビューの中でハンドルによって微調整できます)。
Box Y ボックスのY方向のスケール。 (シーンビューの中でハンドルによって微調整できます)。
Box Z ボックスのZ方向のスケール。 (シーンビューの中でハンドルによって微調整できます)。
Random Direction パーティクルが発光する場合にランダムな向きをさせるか、箱のZ軸に沿って発光させるか。
Mesh
Type パーティクルは頂点、エッジ、三角形のいずれかから発光できます
Mesh 発光する形に使用するメッシュを選択
Random Direction パーティクルが発光する場合にランダムな向きをさせるか、メッシュの表面にそって発光させるか

 

Velocity Over Lifetime モジュール:
パーティクルの速度を直接アニメーションします。複雑な物理挙動のあるパーティクルでありながら、シンプルな視覚的な特徴(乱気流および温度低下のある煙)および物理世界と相互作用がない場合に非常に便利です。
XYZ パーティクルの速度を制御するにあたり、定数またはカーブ間でランダムな値により指定。MinMaxCurve を参照下さい。
Space Local / World: 速度の値がローカル座標かワールド座標か

 

Limit Velocity Over Lifetime モジュール:
基本的な使い方として、抵抗をシミュレーションします。ある閾値を超えたときに速度を低下または範囲を固定します。軸ごと、またはベクトル長ごとに設定できます。
Separate Axis 軸ごとに設定
Speed 速度の全ての軸方向における大きさを制限するのに、定数またはカーブにより指定。 MinMaxCurve を参照下さい。
Dampen (0-1) の範囲の値で閾値を越えた速度を低下させる程度を制御。例えば値が0.5の場合は超過速度を 50% 削減

 

Force Over Lifetime モジュール:
XYZ パーティクルに適用される力を制御するのに、定数またはカーブ間でランダムな値により指定。 MinMaxCurve を参照下さい。
Space |Local / World: 速度の値がローカル座標かワールド座標か
Randomize パーティクルに適用される力を毎フレームごとにランダム化

 

Color Over Lifetime モジュール:
Color 生存期間を通じたパーティクルのカラーを制御。もしいくつかのパーティクルが他のものよりも生存期間が短い場合、アニメーションが早くなります。定数または2つのカーブ間でのランダムな値により指定か、、グラデーションによりアニメーションか、ふたつのグラデーション間でのランダムな値により指定( グラデーション を参照下さい)。このカラーは Start Color プロパティの値に 乗算 されることに留意して下さい - もし Start Color が黒であれば Color Over Lifetime はパーティクルに影響しません。

 

Color By Speed モジュール:
パーティクルの色を速度にもとづいてアニメーションします。定義された範囲で速度をカラーに再マッピングします。
Color 速度の再マッピングに使用される色。色に幅を持たせるにはグラデーションを使用。 MinMaxGradient を参照ください。
Speed Range 速度をカラーに再マッピングする際に、速度範囲を定義する最大および最小の値。

 

Size Over Lifetime モジュール:
Size 生存期間における各々のパーティクルのサイズを制御。定数またはカーブによりアニメーションか、2つのカーブ間でのランダムな値により指定。 MinMaxCurve を参照下さい。
Size By Speed モジュール
Size 速度の再マッピングに使用される大きさ。大きさに幅を持たせるにはグラデーションを使用。 MinMaxCurve を参照下さい。
Speed Range 速度を大きさに再マッピングする際に、速度範囲を定義する最大および最小の値。

 

Rotation Over Lifetime モジュール:
Angular Velocity 各パーティクルの生存期間を通じた回転速度を制御し、カーブによりアニメーションか、2つのカーブ間でのランダムな値により指定。 MinMaxCurve を参照下さい。

 

Rotation By Speed モジュール:
Angular Velocity パーティクルの速度の再マッピングに使用される回転速度。回転速度に幅を持たせるにはグラデーションを使用。 MinMaxCurve を参照下さい。
Speed Range 速度を回転速度に再マッピングする際に、速度範囲を定義する最大および最小の値。

 

External Forces モジュール:
Multiplier Wind Zone によりパーティクルが影響されるスケール係数(すなわち風力ベクトルをこの値に乗算)。

 

Collision モジュール:
このパーティクルシステムのパーティクルの衝突をセットアップします。World(立体)およびPlane(平面)での衝突がサポートされています。Plane での衝突はシンプルな衝突検知で非常に効果的です。Plane をセットアップするには、はシーンの既存の Transform を参照するか、この用途のために新規で空のゲームオブジェクトを作成します。Plane での衝突の長所は衝突平面のあるパーティクルシステムはプレハブとしてセットアップできることです。World での衝突はRaycastを使用するため、高いパフォーマンスを確保するには慎重に使用する必要があります。しかし、近似の衝突が許容できるケースでは、Low または Medium 品質でのWorld での衝突は非常に効果的です。

 

全ての Collision モジュールでの共通プロパティ:
Planes/World 衝突タイプを指定: 平面での衝突としてPlanes 、または立体での衝突として World を指定。
Dampen (0-1) の範囲。パーティクルが衝突するとき、速度のこの割合を保持します。1.0でないかぎりパーティクルは衝突の後に減速します。
Bounce (0-1) の範囲。パーティクルが衝突するとき、衝突した平面と垂直な速度の方向について、この割合を保持します。
Lifetime Loss (0-1) の範囲。衝突ごとにStart Lifetime が減少する割合。Lifetime が 0 になると、パーティクルは消滅。例えばパーティクルが最初の衝突により消滅させたい場合は1.0に設定。
Min Kill Speed パーティクルを消滅させる直前の最低速度。
Send Collision Messages コリジョン メッセージを送信するかどうか、かつ、それに伴いゲームオブジェクトおよびパーティクルシステムに対して OnParticleCollision コールバックをトリガーするかどうか。

 

Planes モードのみで利用可能なプロパティ:
Planes Plane は Transform に参照を割り当てることで定義。この Transform はシーンにおける任意の Transform が可能であり、またアニメーション付きも可能。複数の Plane が使用可能。注意: Y軸が平面の法線として使用されます
Visualization 平面を表示するのに使用: Grid または Solid。
Grid Gizmo としてレンダリングされ、ワールド座標における位置および向きを素早く指定するのに便利。
Solid シーンの平面をレンダリングし、平面の正確な位置調整に便利。
Scale Plane 表示される平面をリサイズ。
Particle Radius 衝突のときに用いるパーティクルの半径(つまりパーティクルは球として扱われます)。

 

World モードのみで利用可能なプロパティ:
Collides With コライダを指定するのに使用するフィルタ。World 全体と衝突する場合はEverything 。
Collision Quality World 衝突の品質。
High 全てのパーティクルはシーンで Raycast を毎フレーム実行。注意: CPU負荷が大きく、 (シーン全体で)1000 同時シミュレーション以下ののパーティクルで使用すべきです。
Medium パーティクルシステム は各フレームで Particle Raycast Budget の一部を受け取ります ( Particle Raycast Budget を参照下さい) 。 パーティクルはラウンドロビン方式で更新され、あるフレームで Raycast を受け取らないパーティクルはキャッシュに格納された過去のコリジョンを使用します。注意: この衝突タイプは近似であり、隅の方など特に、パーティクルがいくつか漏れます。
Low Medium と同じですが、パーティクルシステム は 4 フレームおきにしか Particle Raycast Budget の一部を受け取りません。
Voxel Size 品質が Medium および Low で設定されている場合の交差情報をキャッシュするボクセルの密度。ボクセルの大きさはシーンの単位で指定されます。通常は 0.5 - 1.0 を使用すべきです(メートル単位であるとして)。

 

Sub Emitter モジュール:
これは、次のパーティクル イベントにおいて、他のパーティクルシステムの生成を可能にする強力なモジュールです: Birth(誕生)、Death(消滅)、またはパーティクルのCollision(衝突)
Birth このパーティクルシステムで各パーティクルが誕生したときに、他のパーティクルシステムを生成
Death このパーティクルシステムで各パーティクルが消滅したときに、他のパーティクルシステムを生成
Collision このパーティクルシステムで各パーティクルが衝突したときに、他のパーティクルシステムを生成。 重要:衝突はCollision モジュールでセットアップしておく必要があります。 Collision モジュールを参照下さい。

 

Texture Sheet Animation モジュール:
生存期間におけるパーティクルのUV座標をアニメーションします。アニメーション フレームはグリッドの形式とするか、またはシートにおける各行を別々のアニメーションとすることが出来ます。フレームはカーブによりアニメーションするか、二つのカーブの間のランダムな値としてして出来ます。アニメーション速度は "Cycles" で定義されます。 重要: アニメーションで使用されるテクスチャは Renderer モジュールにあるマテリアルです。
Tiles テクスチャのタイリングを定義。
Animation アニメーションの種類を指定: Whole Sheet または Single Row.
Whole Sheet シート全体を UV アニメーションに使用
- Frame over Time シート全体に対して、生存期間における各パーティクル のUV アニメーション フレームを制御します。定数か、カーブによるアニメーションか、2 つのカーブ間のランダムなフレームを指定します。 MinMaxCurve を参照下さい。
Single Row UV アニメーションに対して、テクスチャ シートのひとつの行を使用します
- Random Row 有効化すると、開始行はランダムとなり、無効化すると行のインデックスを指定できます(最初の行は 0)。
- Frame over Time 指定された行に対して、生存期間における各パーティクル のUV アニメーション フレームを制御します。定数か、カーブによるアニメーションか、2 つのカーブ間のランダムなフレームを指定します。 MinMaxCurve を参照下さい。
- Cycles アニメーション速度を指定。

 

Renderer モジュール:
Renderer モジュール は ParticleSystemRenderer コンポーネントのプロパティを公開します。ゲームオブジェクトが ParticleSystemRenderer を保有しているにも関わらず、そのプロパティはこのモジュールが削除/追加された場合のみここで公開されることに留意して下さい。実際には ParticleSystemRenderer コンポーネントが追加または削除されます。
Render Mode パーティクルのレンダリングモードを次の中からひとつ選択
Billboard パーティクルがつねにカメラの方を向く
Stretched Billboard パーティクルは次のパラメータによりストレッチ
- Camera Scale パーティクルをストレッチする際にカメラ スピードをどれだけ反映するか
- Speed Scale パーティクルの速度に対する長さを定義
- Length Scale パーティクルの幅に対する長さを定義
Horizontal Billboard パーティクルを XZ 平面にあわせる
Vertical Billboard パーティクルをカメラの方に向かせたたまま Y 軸にあわせる
Mesh パーティクルを四角形でなくメッシュでレンダリング
- Mesh パーティクルのレンダリングに使用するメッシュへの参照
Normal Direction 0 から 1 の範囲の値で、どれだけ法線がカメラの方を向くか(0)、また、どれだけビューの中心に対して横向きに向くか(1)。
Material Billboard または Mesh パーティクルに使用されるマテリアル
Sort Mode パーティクルの描画順を距離、新しい順、古い順にソートが可能。
Sorting Fudge 描画順を変化させるのに使用。Sorting Fudgeが lower のパーティクルシステムは最後に描画される傾向となり、かつ他のパーティクルを含めた他の透明オブジェクトの前に表示されます。

Cast Shadows パーティクルがシャドウを投影するかどうか。マテリアルによって出来るか出来ないか決まる。
Receive Shadows パーティクルがシャドウを投影されるかどうか。マテリアルによって出来るか出来ないか決まる。
Max Particle Size 最大の相対的なビューポートの大きさをセット。有効な値: 0-1

 

///////////////////////
プロジェクト

 

基本:
ファイルは基本、外部で(パソコン上で)移動してはいけない。ファイルどうしの紐付けができなくなり、ゲームが動かなくなる可能性がある。移動するならUnityのプロジェクト上で移動する。
外部(エクスプローラなど)からファイルの名前を変更するのもいけないが、「ファイルの内容」は外部で変えてもかまわない。
音声やテキストなどのファイルをインポートすると、メタデータ「○○.meta」というファイルが作られる。これはファイルをUnityの内部で扱うためのデータで、消したり内容を変更したりしてはいけない。

 

/////////
テキストファイル

 

txtやhtmlなどのテキストファイルを読み込める。
ノベル型ゲームでは、テキストファイルを読み込んで、スクリプトから読み込んで出したりすることが可能。

 

/////////
テクスチャ

 

基本:
ミップマップはメモリを使うが、可能ならゲームでは常に使用すべきである。負荷を軽くするため。
異なるシェーダで使うテクスチャは一枚のテクスチャファイルに一緒に入れてはいけない。アルファのテクスチャと通常のテクスチャも、一枚にまとめてはいけない。

 

テクスチャのファイル形式:
何でも使えるらしい。フォトショップ形式も使える。
フォトショップはレイヤーごとに出せるので、ファイルをレイヤー単位で作り、1ファイルで済ませられる。
縦横の長さはすべて2の倍数にすべき。64や128など。
テクスチャはマテリアルに突っ込んで使う。

 

Texture Type:
GUI:GUIで使う場合に選択。
Reflection:反射マップを使うときはこれ。
Cookie:ライティングのクッキーで使用するとき。

 

Texture:
Alpha From Grayscale:有効にすると、テクスチャの明るさの応じてアルファ値が生成される。
Wrap Mode:Clampは端で終了させる。
Filter Mode:テクスチャを引き伸ばしたときにどのように見えるか。Pointだとバイリニア法、Bilinearはバイリニア、Trilinearはもっときれい。
Aniso Level:急角度で見たときのテクスチャの品質を上げる。床とか地面とかに適する。

 

Normal Map:
Create From Grayscale:
これを有効にすると、グレースケールからノーマルマップを作成してくれる。
Bumpinessはバンプ強度。Filteringはバンプ強度を計算する方法。

 

Sprite:
Pixels To Units:スプライト画像の解像度みたいなもの。
Pivot:ローカルに置ける配置を調整。

 

Reflection:
Fixup edge seams:有効にするとイメージの端につくノイズを軽減できるらしい。

 

Cookie:
まずLight Typeでどんなライティングかを指定する。Directional Lightの場合はテクスチャのEdge ModeをRepeatにする必要があるらしい。スポットライトではテクスチャの端を黒にし、Edge ModeをClampにすべきとのこと。

 

Advanced:
詳細説明は省く。
Non Power of 2:テクスチャを2のべき乗にスケールしてくれる機能。
Generate Cube Map:キューブマップを作成する機能。
Read/Write Enabled:テクスチャデータそのものををスクリプトから操作できるようにするが、非圧縮および DTX 圧縮のテクスチャでのみ有効かつメモリを多く使うので非推奨。
Generate Mip Maps:ミップマップ有効にする。
In Linear Space:ミップマップをリニアカラー空間で生成。
Border Mip Maps:これを選択すると、色が下位のミップ レベルの端ににじみ出ることがなくなる。
Mip Map Filtering:ミップマップの最適化。テクスチャが遠くでぼやけすぎる場合はKaiserを使うとよい。そうでなければBoxで。
Fade Out Mipmaps:ミップマップがグレーにフェードするときの設定。これを右にずらすと、遠くから見たときに細かい部分が見えなくなる。特にシェーダをDiffuse DetailにしたときのDetailに適用される。

 

プラットフォーム毎の設定:
Advancedだとより多くの項目が出る。
Max Size:テクスチャの最大サイズ。小さいほど画質が悪いが軽い。
Texture Format:圧縮、16、32ビットの順で質がよくなる。

 

プロシージャル・マテリアル:
いわゆるプロシージャルテクスチャだが、モバイルでは不可能。WebとWindows,Macのみ。
またWindows,Mac以外では、ゲーム開始時に焼きこみを行う。
アセットストアで購入できる。
テクスチャを、ムービーを使わずに動かせる。プロシージャルのパラメータを使っていろいろ可能なのは3DCGソフトと同じ。

 

ムービーテクスチャ:
これはプロ版でしか使えない。

 

///シェーダー

 

Materialにあるシェーダー。3DCGと同じ。
Cubemapというのは、立方体型の物体に適用すると、6つの面に鏡面反射マップを設定できる。

 

Diffuse Detail:
詳細テクスチャというのを貼れる。これはミップマップの設定に従う。

 

Transparent、Sprites:
透明度を設定したいならTransparentを使う。Spriteでも透明にできるが、影などはつかない。

 

//////////
音声

 

音声ファイル形式:
非圧縮のAIFF・WAVはそのまま使うが、圧縮型のMP3・OGGは一度oggに変換してから使うらしい。
AIFF・WAV:短い音声に適する。つまり出るのが早いがファイルが大きい。
MP3・OGG:長い音楽などに適する。つまり出るのが遅いがファイルが小さい。ただしoggはandroidやiPhoneでは今のところ使えないらしい。mp3を使うほうがよい。
mp3はファイル構造上、必ず前後にわずかな空白が入るので、正確にループさせることは不可能のようである。

 

音声ファイルのインスペクター:
Aidio Format:非圧縮は大きいが動作が速い。縮は小さいが動作が遅い。
Force to Mono:モノラル音声にする。
Load Type:Decompressはゲームをロードしたときに解凍する。メモリ負担が非常に大きく、大きなファイルには使用できない。Compressedは再生時のみ解凍する。若干のタイムラグがある。Streamはストリーミング。同時にたくさんストリーミングすると非常に負担が大きくなり、同時発音数のクオリティはハードの性能による。
Compression:圧縮量。
Hardware Decoding:iOSのみ、アップルのハードウェアデコーダーを使うかどうか選択。
Gapless looping:Android/iOSのみ。ループ処理。

 

Audio Format ランタイム時に音声に使用される特定の形式。
Native 品質は高くなりますが、ファイル サイズが大きくなります。 非常に短い音響効果に最適です。
Compressed ファイル サイズは小さくなりますが、品質が低くなるか、変わりやすくなります。 中程度の長さの音響効果や音楽に最適です。
3D Sound 有効にすると、3D スペースで音声が再生されます。 モノとステレオの音声の両方を 3D で再生できます。
Force to mono 有効にすると、オーディオ クリップが 1 つのチャンネル音声にダウンミックスされます。
Load Type Unity がランタイムで音声をロードする方法。
Decompress on load ロード時に音声を解凍します。 オン ザ フライの解凍の性能オーバーヘッドを回避するため、より小さい圧縮音声に使用します。 ロード時の音声の解凍では、メモリ内で圧縮状態を維持する場合の 10 倍以上のメモリを使用するため、大きなファイルには使用しないでください。
Compressed in memory メモリ内で圧縮状態を維持し、再生時には解凍します。 若干の性能オーバーヘッドが生じるため (Ogg/Vorbis 圧縮ファイルの esp.)、大きいファイルにのみ使用してください。技術的な制約により、このオプションはFMODオーディオを使用するプラットフォーム上でOgg Vorbisについて”Steam From Disc”(下記参照)に切り換わることに注意してください。
Stream from disc ディスクから直接オーディオ データを流します。これは、メモリの元の音声サイズの一部を使用します。 音楽や非常に長いトラックに使用してください。 一般的に、1 〜 2 の同時ストリームに抑えますが、問題なくハンドリングできるストリーム数はハードウェアに依存します。
Compression 「圧縮」クリップに適用される圧縮の量。 ファイル サイズに関する統計はスライダの下で確認できます。 スライダをドラッグして、再生を「十分良好」な状態にすべきですが、ファイルや配布上のニーズに見合うよう、十分小さいサイズにしてください。
Hardware Decoding (iOS のみ) iOS 機器上の圧縮オーディオに使用できます。 解凍時の CPU への負担を減らすため、Apple のハードウェア デコーダを使用します。 詳細については、プラットフォーム固有の詳細を確認してください。
Gapless looping (Android/iOS のみ) 完全ループのオーディオ ソース ファイル (非圧縮 PCM 形式) を圧縮する際に、そのループを残すために使用します。 標準の MPEG エンコーダは、ループ点周辺にサイレンスを取り込んでいますが、これはちょっとした「クリック」または「ポップ」として再生します。 Unity ではこれは円滑に扱われます。

 

//////////
スプライト

 

スプライトとして使用するテクスチャは、縦横それぞれ2のn乗の長さにする。
GPUはサイズを2のn乗で処理するため、それ以外だと無駄が生じてメモリを無駄に使う。
テクスチャをこの長さで作り、後で分割して使う。

 

手順:
テクスチャデータをプロジェクトに読み込み、TextureTypeをSpriteにしてApplyすれば、画面に読み込めるようになる。

 

Sprite Editor:
スプライトエディターで分割できる。インスペクターかWindowsから起動。
画像ファイルは透明のあるpngがよい。背景が白色だと上手く分割できない。
スプライトモードをMultipleに、下の想定する環境でOverride for……を有効にする。
Formatは、自動抽出を使う場合は16bitがよい。
複数ファイル選択して、Windows→Sprite Editorで、複数ファイルを一度に自動分割できる。
Maximize Sizeは、分割する最小の大きさ。
Trimで自動で検出。Applyで確定。

 

Delete existing:さっき作った選択済みの部分はすべて置き換える。
Smart:およそさっきやった分割を保持する。
Safe:さっき作った分は変更を加えず。新規作成のみ。

 

////////////////
ヒエラルキー

 

オブジェクトを別のオブジェクトにドラッグすることで親子関係にできる。
なぜか1対1で親子にしても一体化するだけであまり意味がない。2対1にすると3DCGのような親子関係になる。

 

QuadとPlane:
Planeは400ポリゴンだが、Quadは1ポリゴン。Quadはテクスチャなど貼り付けて使うもの。

 

///ライト

 

エリアライト:
全ポリゴンの片面だけを均等に照らすライト。プロバージョンでしか使えない。ライトマップといい、ベイクした陰影を使うときに使用するもの。

 

///ライトマップ

 

いわゆるベイキング。現在のライトの影をベイクして負担を軽くする。影は負担が重く、モバイルには向かないので、これを使う。
ライトがある限り、フレームごとに計算される。ライトマップを使うとこの計算がなくなり、処理が早くなる。

 

通常のテクスチャとの違い:
ライトマップは、陰影や影の情報のみテクスチャとして記憶する機能。通常のテクスチャはその上に貼りこまれる。
たとえばLightwaveですべての陰影を含めたテクスチャをサーフェイスベイキングカメラでUVにベイクし、それをUnityに持っていって自己発光させると、すべてのテクスチャをメモリに入れるためかなり負担になる。この方法は超リアルな陰影を出せるが、メモリの負担は大きいため、物体の少ない場面でのみしか使えそうにない。
ライトマップでは、たとえばタイリングした周期テクスチャであれば、テクスチャに使われるメモリは少ないため、負担は軽い。

 

Lightwaveで貼りこむ:
ライトマップは白黒のみの情報で、一方Lightwaveサーフェイスベイキングで貼りこむやり方は、理論上はライトマップの3倍のメモリを消費するはずである。
自作でライトマップを用意し、自己発光度のところに貼り付ければ、理屈上はライトマップと同じことができるはずだが。

 

Window,LightMappingで、Bake、BakeSceneで行う。
適用されるのは、インスペクターでstaticに設定されたすべてのオブジェクト。

 

///カメラ

 

Clear Flugs:何もない背景に何を表示するか。
Culling mask:何をレンダリングするか決める。
Clipping Planes:Nearが大きすぎると近くのものが見えなくなる。Farが小さすぎると遠くのものが見えなくなる。適切な値にして負担を減らす。
Viewport Rect:見える範囲の調整
Depth:この値が大きいカメラは、小さいカメラの上に上書きされる。
Rendering Path:きれいな順からDefferd,Forward,Lit。VertexLitは影ができない。

 

///テキスト文字

 

完全に固定された文字を作るなら、イメージファイルで出せばよい。ゲーム中に、タイムなど変更する文字を出す場合にはこれを使う。

 

手順:
文字を追加するには、ヒエラルキーでGuiTextを追加するか、空のゲームオブジェクトにTextMeshコンポーネントを使う。
GuiTextのほうがきれい。

 

////////////////
プレハブ

 

大量複製する機能。いわゆるインスタンス。位置や回転は継承されない。
プレハブはゲームオブジェクトにドラッグして配置可能。これはインスタンスなので、いくら配置してもさほどゲームに負担が増えない。
プロジェクトのプレハブをインスペクターで変更すれば、ゲーム中のすべてのプレハブに変更が施される。
各インスタンスの値を変えたときは、そのインスタンスだけ変わる。ただしインスペクターのApplyを押すと、インスタンス元のオブジェクトも含め、すべてのインスタンスに変更が適用される。
プレハブはその時点でのプレハブであって、プレハブの元データを変更してもプレハブのソースは変わらない。
プレハブにコンポーネントを適用するとGameObjectへの接続が壊れることがある。この場合はGameObject,Apply Changes to Prefabでリンクを再構築する。

 

無からプレハブを作る手順:
まずアセットでCreate,Prefabでプレハブを作る。
大量複製したいものをヒエラルキーからそのアセット中のプレハブにドラッグすると、このプレハブアセットとヒエラルキーのその名前が青色に変色。
プレハブ用スクリプトを用意し、MonoBehaviourのすぐ下あたりに、仮にpfという変数を作って
public GameObject pf;
と書くと、オブジェクトにコンポーネントからこのプレハブ用スクリプトを適用すると、インスペクターに「pf(スクリプト中に定義した変数)」という項目ができる。ここにプレハブアセットを適用する。これで準備完了。ヒエラルキーにある元のオブジェクトは消してもプレハブは使える。
プレハブを出すときは
GameObject aa = (GameObject)Instantiate(pf);
と定義して使う。たとえばプレハブを1つ出して、x=1の位置に出させるときは、以下のようにする(aaは複製されたオブジェクト変数、pfは複製元のオブジェクト変数)

 

public class PFTrial : MonoBehaviour {
public GameObject pf;

 

void Start () {
GameObject aa = (GameObject)Instantiate(pf);
Vector3 bb = aa.transform.position;
bb.x = 1;
aa.transform.position = bb;
}
}

 

//大量複製
instantiateは大量複製の機能なので、一度に大量複製するときはもちろん、forなどをよく使う。
フレームごとに条件付で発生させたりする。

 

////////////////////
アセットストア

 

デフォルトで使用できるアセットストアがある。プロジェクトを作るときに読み込めるが、あとで「assets>importpackage」読み込むこともできる。

 

///Terrain
これはかなり負担が大きいので、モバイル向けではない。
Create>Terrainで起動。スカルプトツールで、左3つのパネルで盛り上げたり盛り下げたりする。
4つ目でテクスチャをエディットし、筆で塗れる。addで複数選択でき、好きな場所に塗れる。Editで調整。
5つ目で木を植える。EditTreesのAddで木を加える。大量散布できる。
6つ目で草を植える。
7つ目は基本のセッティング。大きさはResolutionの項目で設定するので、Transformをいじっても変わらない。

 

///Projectors
影を作る。

 

///SkyBox
MainCameraのAddComponent>Rendering>SkyBoxで起動。テクスチャを読み込んで空に配置する。

 

///CharactorController
上の人体アニメーションを参照。

 

アセットからキャラクターをヒエラルキーやシーンにドラッグすることで起動する。
インスペクターでアニメーションファイルを設定、ほかの数値も設定すると、それで終了。デフォルトでは矢印で移動、シフト押しながらで走る。

 

///Particles
アセットからシーンへドラッグして使用。インスペクターで調整して使う。

 

///アセットストアから検索
WindowsのAssetStoreからネットで検索、ログインしてダウンロードできる。インポートでダウンロード。
インポートするとUnityのAssetsに入っている。シーンにドラッグして使用。

 

///Mecanim Locomotion Starter Kit
上の人体アニメーションを参照。

 

///StandardAssets(Mobile)
モバイル用のアセット。

 

JoyStick:
スマホに仮想のジョイスティックが出現し、それで操作できるようになる。
GameObjectでCreateEmptyを出し、そこにこのアセットの中にあるJoyStickをコンポーネントで適用するといい。
インスペクターのTextureでジョイスティックの形を選択する。スケールは0でもうまくいく。
PixcelInsetで大きさと位置を調整、ゲームビューを見ながらやる。

 

////////////////////
スクリプト

 

アセットの中にスクリプトファイルを作り、書く。使用したいオブジェクトにAddComponentのScriptでそのスクリプトを選ぶことで適用される。

 

////////////
C#

 

///C++との違い

 

==はない:
if(a==0)ではなく、if(a=0)でOK。

 

変数定義の仕方:
long,float,doubleは中身の最後にそれぞれL,f,dを入れる。
文字列のstringがある。charもある。
基本的に、実数はfloat,整数はintを使う。
long a = 100L;
float a = 100f;
double a = 100d;
string a = "qwer";

 

スコープ:
任意の場所で{}で囲むことで、変数のスコープ調整が可能。

 

<>がない:
「でない」は!=しか使えない。

 

型変換:
int a = 1;
floar b = 2.1f;
int c = (int)(a + b);
のように書く。cは小数点以下切り捨てられ、答えは3になる。

 

///////
クラス

 

クラスとインスタンスとメソッド:
クラスは頭が大文字で、プログラムの中では出てこない。
インスタンスはクラスと名前が同じで、頭が小文字。これを使う。
メソッド(関数)は頭が大文字。クラスやインスタンスとは別物なので注意。
Transformはクラス、transformはインスタンス、Translate()はメソッド。Vector3はクラス。

 

ややこしい問題:
GameObjectのtransformプロパティにTransformクラスがあり、そのインスタンスaaでも作る。
Transformクラスにpositionプロパティがあるので、aa.positionとでも作る。
positionプロパティにVector3クラスがあり、そのインスタンスbbでも作る。
Vector3クラスにxプロパティがあるので、bb.x = 1とでも作る。
インスタンスなので、aaとbbは別物である。aa.bb.xのようにはできない。1行で操作できるインスタンスは一つだけ。

 

例:
下のいずれも可能。
transform.Translate(new Vector3(1,1,1));
transform.position = new Vector3(1,1,1);

 

Web辞書の見方:
ランタイムクラスにクラス名一覧が出ている。
GameObjectクラスを開くと、そのプロパティ(Variables)にtransformプロパティがある。
transformプロパティを開くと、var transform: Transform; つまりtransformの中にTransformクラスがある。
Transformクラスを開くと、そのVariablesにpositionプロパティがある。
positionプロパティはvar position: Vector3; で、つまりpositionの中にVector3クラスがある。
Vector3クラスを開くと、そのVariablesにxプロパティがある。
xプロパティはvar x: float; で、これ以下はない。

 

GameObjectのVariablesにtransformがあり、この関係ではGameObjectのインスタンスをaaとすると、aa.transformのように使える。
TransformのVariablesにpositionがあり、この関係ではTransformのインスタンスをbbとすると、bb.positionのように使える。
Vector3のVariablesにxがあり、この関係ではVector3のインスタンスをccとすると、cc.xのように使える。

 

//例
プロパティ.プロパティ.プロパティ = インスタンス;
プロパティ.プロパティ.プロパティ = インスタンス.関数();
プロパティ.プロパティ.関数(インスタンス,インスタンス,数値);
インスタンス.プロパティ.プロパティ = 数値;

 

○○.○○.○○……のような形のとき、
インスタンスは左端にしか出ず、関数は右端にしか出ない(つまりこの左端のインスタンスを今制御しているということ)
インスタンスも関数も、2つ以上は出ない。
プロパティは2つ以上も普通に出る。
クラス名はインスタンスを定義するときにしか出てこない。

 

 

継承:
class クラス名 : 継承元クラス名(){}
のように書く。

 

using:
パッケージ(クラスの塊)を読み込むための記述。最初の2行でUnityの基本動作に必要なクラス群を読み込む。

 

MonoBehavior:
MonoBehaviorがUnityの元の状態を記述したクラス。これに継承させる形で
public class ○○ : MonoBehaviour{}
と本文を書く。要するに、MonoBehaviourに追加したものが、Unityの本文なのである。

 

///静的プロパティ

 

静的プロパティというものがあり、これは特殊で、インスタンスなしで使えるもので、これは最初が大文字になる。
たとえばInputやCameraなど。

 

////////////
コールバック関数(イベントドリブン)

 

○○したときに××する、というもの。イベントドリブン関数のこと。
基本的に、a,b,cなどは自分で作った変数。それ以外は自分で作った変数ではない。

 

 

あるコリジョンに別のコリジョンが入った時に○○する:
void OnCollisionEnter2D(Collision2D coll){
}

 

同様に
OnCollisionExit2D(Collision2D coll){}:あるコリジョンに別のコリジョンが出たとき
OnMouseUp(){}:マウスクリックして離した瞬間
OnTriggerEnter2D(Collider2D other){}:コリジョンに別のコリジョンが入った時(IsTrigger)
OnTriggerExit2D(Collider2D other){}:コリジョンに別のコリジョンが出た時(IsTrigger)
OnTriggerStay2D(Collider2D other){}:コリジョンに別のコリジョンが入っている時(IsTrigger)

 

void FixedUpdate() :物理挙動の直前に呼び出される。
void LateUpdate(): Update と FixedUpdate がシーン上の全てのオブジェクトに対して呼び出しされた後に呼び出される。
void Awake():インスタンスがロードされたときに呼び出される

 

///FixedUpdate()と物理演算(Physics)
FixedUpdate()は、Updateとは異なり、フレームに依存せず、一定の間隔で呼び出される。
Updateはマシン能力によって更新時間が異なるため、つまり処理落ちが発生するが、FixedUpdateは基本的にそういうことが起こらない、とされている。
このため、物理演算など正確な値を取得したい場合は、処理の重さに左右されるUpdate関数ではなく、FixedUpdate関数を使用するのが望ましい。
void Update () {
}
void FixedUpdate() {
rigidbody.AddForce(Vector3.up);
}
のように、Updateとは別に記述する。
FixedUpdate()の中にInput系のもの(Input.GetKeyDownとか)を記述すると、正しく動かないらしい。
それはマシンの性能によってUpdateとFixedUpdateが時間的に1対1で対応しないかもしれないということであり、マシンによって2対1とか3対1のように対応してしまう。
Input入力はUpdateの速度で処理するのが限界で、Fixedで使うとImputはブツ切りに処理されるので、正しく入力されない感がある。Inputに対応した変数も同様。
要するに、Inputとそれで変化する変数はUpdateで処理し、それによって何かが動いたり、物理演算で動いたりするときはFixedで処理するとよい、ということ。

 

///コルーチン
Update関数は1秒に30フレームくらいだが、この30という数字を変えることができる。

 

IEnumerator Fade() {
for (int a = 1 ; a >= 10 ; a++) {
Debug.Log(a);
yield return new WaitForSeconds(1f);
}
}

 

まず上のように関数を作り、実行時には

 

StartCoroutine("Fade");

 

 

のように書く。すると、Fadeという関数は、1秒おき(1fのところ)に実行されるため、処理が非常に軽くなる。

 

///タイマー
タイマーの例。

 

float a = 0;
int b = 2;

 

void Update(){
a = a + Time.deltaTime;
if(a > b){
//ここに20更新ごとにやりたい処理を入れる
a = 0;
}
}

 

Time.deltaTimeは更新間隔の秒。たとえばこれが0.1秒とすると、上の場合だと20更新、つまり2秒ごとにその処理が起きる。
これでコルーチンを使うと、ややこしくなって上手く動かないことが多いらしい。面倒ならこのようなタイマーでよい。

 

///遅延処理
時間的に少し後に処理させたい場合のテクニック。

 

//5秒後にそのオブジェクトが消滅
Destroy(gameObject, 5);

 

//Invokeを使って、ある処理が起きてから2秒後に指定の関数を実行
void Update(){
Invoke("AA", 2);
}
void AA(){
//2秒後にしたいことを記述
}

 

 

///その他のイベントドリブン関数

 

Awake
OnEnable
Start
OnApplicationPause
FixedUpdate: FixedUpdate()
LateUpdate
OnPreCull
OnBecameVisible/OnBecameInvisible
OnWillRenderObject
OnPreRender
OnRenderObject
OnPostRender
OnGUI
OnDrawGizmos

 

コルーチン
yield
yield WaitForSeconds(2)
yield WaitForFixedUpdate()
yield WWW
yield StartCoroutine(MyFunc);

 

その他:
OnDestroy
OnApplicationQuit
OnDisable

 

/////////////////
例文

 

//その物体をx方向へ0.01移動する。
//Translateは相対なので注意。たとえばCamera.main.transform.Translate(new Vector3(0.0f,0.0f,0.1f));とすると、常に単にカメラの見ている方向に進むだけ。カメラが回転しても常にカメラの見ている方向へ進む。
Vector3 a = new Vector3 (0.01f,0,0);
transform.Translate (a);

 

//その物体を1,2,2へ移動する。
Vector3 a = new Vector3 (1,2,2);
transform.position = a;

 

//その物体をpitch方向へ1度回転する。
Vector3 a = new Vector3 (1,0,0);
transform.Rotate (a);

 

//その物体をX方向へ2倍スケールする。
Vector3 a = new Vector3 (2, 1, 1);
transform.localScale = a;

 

//型キャスト
int a = 1;
float b = 2.1f;
int c = a + (int)b;
Debug.Log (c);

 

//ストリング型にキャスト
int d = 3;
string e = "qwe" + d.ToString();
Debug.Log (e);

 

//ストリングをintに
string f = "3";
int g = 5;
int h = g + int.Parse(f);
Debug.Log (h);

 

//行列
string[] i = new string[3];
i [1] = "AA";
guiText.text = i[1];

 

//foreach
int[] j = {1,2,3,4,5,6,7,8,9,10};
int k = 0;
foreach(int m in j){
k = k + m;
}
Debug.Log (k);

 

//↑キーを押すとXへ0.01移動。
if(Input.GetKey(KeyCode.UpArrow) == true){
transform.Translate(new Vector3(0.01f,0,0));
}

 

//マウス左を押し続けている間はX方向へ0.01移動。
if(Input.GetMouseButton(0) == true){
transform.Translate(new Vector3(0.01f,0,0));
}

 

//GGという名前のゲームオブジェクトを探して変数aに入れる
//このFindという命令は、Updateの下に入れるのが望ましい。どうやらこの中に位置情報まで含んでいるらしく、MonoBehaviour直後にやると、位置情報がUpdateされない情報のままになってしまう。
GameObject a = GameObject.Find ("GG");

 

//GGという名前のGuiTextに123456789という文字を入れる(別スクリプトから)
GameObject.Find ("GG").guiText.text = "123456789";

 

//マウスの画面上の位置をGGというGuiTextに表示する(X,Y座標のみ)
Vector3 b = Input.mousePosition;
GameObject.Find ("GG").guiText.text = b.ToString();

 

//マウスの位置にその物体を移動(bは二次元座標なのでz座標を3.0と仮定)
Vector3 b = Input.mousePosition;
b.z = 3.0f;
Vector3 a = Camera.main.ScreenToWorldPoint(b); //画面上bという座標をゲームの3次元座標に変換する
transform.position = a;

 

//その物体にマウスが乗るとその物体をX方向へ2倍の大きさにする(物体が奥行き100の場所まで有効)
//レイがぶつかる物体にはコライダを設定する必要がある
//Rayを飛ばすとき、飛ばす元の物体にコライダが設定してあると、コライダの中心位置がずれているとレイの飛び方がめちゃくちゃになるので、コライダは空の子オブジェクトを作成し、そこにつけるのがよい。
Vector3 b;
b = Input.mousePosition;
b.z = 0f;
Ray a = Camera.main.ScreenPointToRay(b); //クリックした場所から画面奥方向へレイを発射
RaycastHit c;
if(Physics.Raycast(a ,out c, 100) == true){ //レイaを奥行き100まで発射して物体cに当たった場合
Vector3 d = new Vector3(2,1,1);
c.transform.localScale = d;
}

 

//すでにRigidBodyが設定してあるオブジェクトに↑を押すと力(1,0,0)を加える
if(Input.GetKey(KeyCode.RightArrow) == true){
transform.rigidbody.AddForce(1,0,0);
}

 

//その物体からz方向-1の位置にカメラ(Mcameraという名前)を置く
Vector3 a;
a = transform.position;
a.z = a.z - 1f;
GameObject b = GameObject.Find ("Mcamera");
b.transform.position = a;

 

//メインカメラの座標をGGというGuiTextに出す
Vector3 a = Camera.main.transform.position;
GameObject.Find ("GG").guiText.text = a.ToString();

 

//メインカメラが(0,0,0)と(0,1,0)を結ぶ軸を中心に1.0fの速度で回転する
Vector3 a = new Vector3 (0, 0, 0);
Vector3 b = new Vector3 (0, 1, 0);
Camera.main.transform.RotateAround (a, b, 1.0f);

 

//サイン30度をGGというGuiTextに表示
float a = Mathf.Cos (30);
GameObject.Find ("GG").guiText.text = a.ToString();

 

//マウスボタン押している間だけ見えなくする。回転しているのを見れば分かるが、見えていない間も動き続けている。
void Update () {
transform.Rotate (0, 0, 1.0f);
if(Input.GetMouseButton(0) == true){
renderer.enabled = false;
}else if(Input.GetMouseButton(0) == false){
renderer.enabled = true;
}
}

 

//その物体を赤色に変化
Color a = new Color (1.0f, 0, 0);
renderer.material.color = a;

 

//GuiText"GG"を赤色にする
GameObject a = GameObject.Find ("GG");
Color b = new Color (1, 0, 0);
a.guiText.color = b;

 

//ライト"DLight"のライトの色を赤色にする
GameObject a = GameObject.Find ("DLight");
Color b = new Color (1, 0, 0);
a.light.color = b;

 

//その物体のテクスチャを消す
renderer.material.mainTexture = null;

 

//その物体のテクスチャを変更(ソースファイルは必ずAssets直下に「Resources」という名前のフォルダを作ってそこに入れなければならない)
Texture a = (Texture)Resources.Load ("2"); //拡張子は入れない
renderer.material.mainTexture = a;

 

//テクスチャのスケールを変化(1だとそのまま、2だと同じ面積のポリゴンに2つテクスチャが入る。テクスチャ自体は小さくなる。0.5だと大きくなる)
Vector2 b = new Vector2 (0.5f,0.5f);
renderer.material.mainTextureScale = b;

 

//その物体が何かに当たると最後にロードされたシーンを最初から開始する。
//衝突判定を使うのでぶつかる物体はすべてCollisionコンポーネントが設定、有効にされている必要がある。無効だと色は変化しない
//Application.LoadLevel()はメソッドで()のシーンをロードする。
//Application.loadedLevelは最後にロードしたシーンを示す(最後にロードされたレベルのインデックス、という)最初にロードされたシーンは0。
void OnCollisionEnter(Collision a){
Application.LoadLevel (Application.loadedLevel);
}

 

//その物体が何かに当たると、当たった先のインスペクターの物体名がSSであれば、SSを黄色に変える。
//衝突判定を使うのでぶつかる物体はすべてCollisionコンポーネントが設定、有効にされている必要がある。
void OnCollisionEnter(Collision a){
if(a.gameObject.name == "SS"){
a.gameObject.renderer.material.color = Color.yellow;
}
}

 

//その物体が何かに当たると、当たった先のインスペクターのタグ名がPlayerであれば、それを黄色に変える。
//衝突判定を使うのでぶつかる物体はすべてCollisionコンポーネントが設定、有効にされている必要がある。
void OnCollisionEnter(Collision a){
if(a.gameObject.tag == "Player"){
a.gameObject.renderer.material.color = Color.yellow;
}
}

 

//BBを消す(非アクティブにする)
GameObject b = GameObject.Find("BB");
b.SetActive(false);

 

//ゲームオブジェクトcがアクティブかどうか調べてコンソールに結果を出す。アクティブならtrue,非アクティブならfalseをcに入れる。
bool c = b.activeSelf;
Debug.Log(c);

 

//ゲームオブジェクトbを回転させようとして(Rotate)、それが不可能だった場合、コンソールに「Wow!!」と出す。
//tryの中をやろうとして、エラーが出るとcatchの{}を実行する。
//System.Exception eはエラーが出たという引数。
GameObject b = GameObject.Find("BB");
b.SetActive(false);
Vector3 a = new Vector3 (1, 1, 1);
try{
b.transform.Rotate (a);
}catch(System.Exception e){
Debug.Log("Wow!!");
}

 

//タグが「Player」のオブジェクトをすべて「Transparent/Diffuse」シェーダーにし、透明度を0.2にする
//Colorのアルファ値はこのシェーダーにしないと変更しても透明にならないので注意
//「foreach ○○ in ××」で「変数群××の各オブジェクトを○○とし、○○の各々に対し……」という意味になる
GameObject[] aa = GameObject.FindGameObjectsWithTag ("Player");
foreach(GameObject bb in aa){
bb.renderer.material.shader = Shader.Find("Transparent/Diffuse");
Color cc = new Color(1,1,1);
cc.a = 0.2f;
bb.renderer.material.color = cc;

 

//その物体が何かに当たると、衝突は起きないが当たった先のオブジェクトが黄色になる
//衝突先のオブジェクトにはIs Triggerが有効になっている必要がある。無効だと色が変わらないので注意
void OnCollisionEnter(Collision a){
a.gameObject.renderer.material.color = Color.yellow;
}

 

//その物体の方向の速度を、XYZ方向をそれぞれ10,0,0にする
//Rigidbodyが適用されていないと動かない
Vector3 a = new Vector3 (10, 0, 0);
rigidbody.velocity = a;

 

//その物体の回転の速度を、HPB方向をそれぞれ10,0,0にする
//Rigidbodyが適用されていないと動かない
Vector3 a = new Vector3 (10, 0, 0);
rigidbody.angularVelocity = a;

 

//パーティクルシステムをCylinderに設定してある状態で、ゲームが始まったらパーティクルを開始する(Play On Awakeがあらかじめオフの場合。オンだと最初から出ている)
//ParticleSystem bb = (ParticleSystem)aa.GetComponent ("ParticleSystem");は、すでに設定してあるパーティクルを呼び出す命令。あらかじめ設定していないと効果がない
//MonoBehaviourの直下にParticleSystem bb = (ParticleSystem)aa.GetComponent ("ParticleSystem");と持ってくることはできない。なぜかというと、読み込まれる順番は、MonoBehaviourの直下→あらかじめ設定したパーティクルが生成→void Startの順番なので、MonoBehaviourの直下に「すでに設定してあるパーティクルを見つけろ」といっても見つけられないため
//aa.GetComponent ("ParticleSystem")だけでは「ただのコンポーネント」のインスタンスを取っただけなので、パーティクルにはならない。パーティクルのキャストが必要

 

public class Cylinder : MonoBehaviour {
GameObject aa;
ParticleSystem bb;
void Start () {
aa = GameObject.Find("BB");
bb = (ParticleSystem)aa.GetComponent ("ParticleSystem");
bb.Play();
}
}

 

//BBというオブジェクトにハロー効果をつける(最初オフにしてある状態の場合)
//パーティクルのようにそれ自体のクラスが用意されていないため、Behaviourと書く
GameObject bb = GameObject.Find ("BB");
Behaviour aa = (Behaviour)bb.GetComponent ("Halo");
aa.enabled = true;

 

//画面にフォグを使用する(Edit-RenderSettingの)。RenderSettingというクラス
RenderSettings.fog = true;
RenderSettings.fogColor = Color.gray;
RenderSettings.fogDensity = 10f;

 

//新たにカプセルを作成し、それにリジッドボディを適用し、Playerタグを追加する(タグはすでに存在するものでないと追加できない)
GameObject aa = GameObject.CreatePrimitive (PrimitiveType.Capsule);
aa.AddComponent ("Rigidbody");
aa.tag = "Player";

 

//bb.xに-3〜3のランダム値を入れる
bb.x = Random.Range (-3, 3);

 

//右クリックでクリックした場所へ移動
//カメラ座標をワールド座標へ交換して、2D的にし、zを3としてそこに位置させる
if(Input.GetMouseButton(1) == true){
Vector3 c;
c = Input.mousePosition;
c.z = 3.0f;
Vector3 d = Camera.main.ScreenToWorldPoint(c);
transform.position = d;
}

 

//そのオブジェクトを消す
Destroy (gameObject);

 

//BBというオブジェクトを常に向いているようにする(このスクリプトはvoid Updateに仕込む。カメラに仕込めば常にその物体を写す)
GameObject a = GameObject.Find ("BB");
Vector3 b = a.transform.position;
transform.LookAt (b);

 

//ランダム値
//実際に完全にランダムな値を出そうとしたら、ゲーム開始時間を計るなどしたほうがよい。
-10〜10までのランダム値。
Random.Range(-10.0F, 10.0F));
0〜1までのランダム値。
Random.value;

 

//データの保存
Resultというint変数に10を入れて保存
PlayerPrefs.SetInt("Result", 10);
resultへResultの内容をロード
int result = PlayerPrefs.GetInt("Result");

 

//別のスクリプトファイルから変数を取り出して変化させたり、別ファイルから関数を実行したりする(参照渡しという方法)
//このときaaa.csの適用オブジェクトとbbb.csの適用オブジェクトは異なるとする。オブジェクトAAにaaa.csのみ、オブジェクトBBにbbb.csのみ適用しているとする。
//ファイルaaa.csの変数ccを、ファイルbbb.csで使用し、さらに変化させる

 

//aaa.cs
public class aaa : MonoBehaviour {
public float cc = 1.0f; //別ファイルに参照させるためにはpublicでないといけない
void Start () {
}
void Update () {
}
}

 

//bbb.cs
public class bbb : MonoBehaviour {
aaa aaaaa; //元ファイル名 変数名で変数を定義
void Start () {
GameObject a = GameObject.Find ("AA");
aaaaa = a.GetComponent(); //GetComponentで元ファイル名を入れる
aaaaa.cc = 2.0f;
}
void Update () {
}
}

 

//C#とJavascriptの間で変数名などを参照したい場合
//相互に参照させることは不可能で、片道通行なら可能らしい。参照される側をStandard AssetsかPro Standard AssetsかPluginsに入れ、これ以外のフォルダから参照するようにする。
//たとえばJavaScriptで書かれたコードをアセットストアからダウンロードし、自分はC#でそれを使う場合、JavaScriptのファイルをStandard Assetsに入れ、自分で作ったコードをここ以外のフォルダに入れて、上記の方法で参照する。Assetsフォルダが一番初めにコンパイルされるため、このようにできるらしい。

 

//////////////////////
課金と広告収入について

 

スマホアプリの課金は、クレジットカードやキャリア決済。
未成年は、キャリア決済は購入限度が限られており、クレジットカードは使えないため、未成年対象のゲームで課金収入を目的にしても効果はなさそうである。広告収入は問題なさそうだ。
課金方法は、NTTドコモでは、クレジットカード、キャリア決済(NTTドコモの月料金と同時に払う)、バーコード(クーポン券みたいなもの)がある。
課金収入の場合、特定商取引法と問い合わせの欄を作る必要がある。問い合わせは自分のところのメールアドレスで、不具合で課金してもアイテム購入ができなかった場合などに備えた問い合わせ。面倒そうではある。
広告収入のほうが、対応や不具合が起きたときの対処は楽である。

 

アンドロイド48の例:
はっきりいって、課金するのとしないのとでは大違いで、課金しなければ途方もない時間がかかるか、ほとんどクリア不可能に見えるほどの差がある。課金すればものすごい優遇処置が当然。
実質、課金しなければクリア不可能といってよい。実際にゲームを楽しむためには課金が不可欠なようになっている。
重要なこととして、課金しなければゲームの本当の楽しさを知ることができないように設定するのがよさそうだ。

 

計算:
ダウンロード数と広告収入は同じくらいらしい。たとえば1万ダウンロードなら、広告収入は1万。
仮にユーザーの1割が500円の課金をした場合、1万DLなら1000人が500円の課金で、50万円になる。課金と広告収入を比べると、課金のほうが多くなるはず。
ダウンロード数を稼がなくても、いかに課金させるかを重視することで、十分な売り上げを出せる可能性はある。

 

///何に課金するか
大きく2種類ある。
ペナルティの軽減は、もともとある程度難易度が高すぎるとか、膨大に時間がかかるように仕組んでおき、課金することで誰でもクリアしやすいようにするもの。課金しなければ非常にクリアが難しいか、非常に時間がかかるように仕組むのがベスト。
サービスの追加は、あらかじめすべてのサービスを無料で遊べないようにしておき、かつ追加のサービスが無料サービスよりも魅力のあるものにしなければ意味がない。無料と同じくらい面白いものを追加するのではなく、無料よりも面白い要素の追加ならさらに効果的である。

 

ペナルティを軽減する:
時間のかかるゲームで、時間を節約するために課金する(札束で殴るゲーム、RPGでレベルチートさせるなど)
プレーヤーの推測力、反射神経など、足りない部分を補う(脱出ゲームでヒントを出す、アクションゲームで敵が減る、ポイントが増えるなど)

 

サービスを追加する:
音ゲーで難易度の高い楽曲を追加。アクション、脱出ゲームで、さらに難しいステージを追加する。このやり方は、最初から難易度が高いと、さらに難易度の高いものをやらせようとすると、下手な客はやる気がおきないので注意する。
脱出ゲームでさらに怖い、あるいは難しいステージを追加。

 

///////////////////////////
Unityアセットストアの契約条項など

 

Unityアセットストア契約書内容:
配布可能なものは、

 

(i) ビデオゲームの開発を容易にする設計のソフトウェア、(ii) コンテンツ(3Dコンピューターグラフィックを含むコンピューターグラフィック、サウンド、ミュージックなどを含む)またはチュートリアルなど、ビデオゲームおよびインタラクティブメディア(双方向メディア、一方的に見せる単なる動画などは含まれない)の一部に組み込まれるデジタル素材
である。

 

アセットストアのカテゴリは

 

3Dモデル:キャラクター、小道具、植物、建物、乗り物、その他
アニメーション:二足歩行、その他
アプリケーション
エディタ拡張:2Dスプライト、モデリング、アニメーション……
オーディオ:音楽、環境音、効果音、その他
完成プロジェクト:システム、チュートリアル、テンプレート、パック、Unityテクニカルデモ、その他
サービス:決済手段、ゲーム分析、その他
シェーダー:ダイレクトX11、サブスタンス……
スクリプト:モデリング、GUI、アニメーション、アバターシステム、エフェクト……
パーティクルシステム:気象、炎、魔法、水、その他
テクスチャ&マテリアル:2Dキャラクター、タイルマップ、岩、紙、ガラス……

 

売り上げはUnityが承認するPayment Processor(支払い処理業者)によって支払われる。
著作権を主張するために、Unityがこちらの名前、住所その他の連絡先情報を侵そうとしている第三者に送信する権利を有する。
価格設定は米ドルで設定し、端数は認められない。そしてUnityが顧客に対し、妥当な通貨で表示する。
手取りは、あらゆる手数料を差し引いて30%が取られる。つまり70%がすべてがこちらに入る。
PayPalによる支払いでは、月ごとに支払われる。アカウントを提供すれば、払ってくれる。こちらのほうが早いし、手数料もかからないようなので、有利。
小切手または電子送金の場合、四半期ごとに支払われ、手数料を取られ、しかも250ドル以下だと支払われない。
無料提供の場合、Unityにも当然手数料は支払われない(Unityに嫌がられるかもしれない)
返金は支払い業者の規約による。
アセット提供の際、提供者の情報がダウンロード画面に表示される。保守やクレーム対応は提供者が行う。
提供者が適切にサポートしない場合、低評価、露出低下、売り上げ減少などが起こる場合がある。販売額が50ドル未満の場合、Unityは顧客に購入額を返金し、提供者に請求されることがある。50ドル以上なら、支払い業者のポリシーに従う。
提供した素材を消すと、顧客も以降はダウンロードできなくなる。
提供者は、自分のウェブサイトで決済機能をつければ、無料素材に対して寄付を募ることができる。ただし素材の「機能拡張版」を別のところで販売してはいけない。そのままならたぶん平気。寄付の募り文句は、アセットストアページ以外に表記してはいけない。
Unityは提供者の素材の著作権を奪い取るわけではない。好きに処理できるわけではない。
顧客が提供者に個人情報を与える場合、提供者は個人情報の秘密を守らなければらない。
提供者が、顧客から受け取った個人情報を、Unity素材のための宣伝とか(メールに新しい素材作ったよ!とか)はしてもいいが、Unity外ではどんな目的でも使ってはならない。
素材を別のところで販売するために、Unityを宣伝目的などに利用してはならない。

素材に悪評がついたとき、あまりひどいならそれについてUnityに問い合わせることができる。
素材を更新した場合、バージョン表記は提供者の責任で。
不謹慎なものは作ることができず、削除されたり、訂正を求められる。
Unityは提供した素材をプロモーションなどに使うことができる。
アセットを取得した顧客に対し、提供者は商用の販促、宣伝してもかまわない。
素材の中に第三者の素材が含まれる場合、その第三者の許可を得なければ出せない。
素材を削除することはいつでもできるが、顧客から取り戻すなどはできない。
エロはだめ。不謹慎もだめ。
各素材単位で、特約が可能。あまりおかしなものはだめだが。
顧客は、転貸借、複製、譲渡、頒布など不可能。
ダウンロードしたアセットを、別のパソコンで移動することはできず、それをやりたいならライセンサーから書面による承諾が必要。
顧客はアセットのコピーは不可。
同一素材のアップグレードは無料で行わなければならない。

 

Unityアセットストア提出基準:
あまり単純すぎるものは出してはいけない。もしやるならマルチパックしてセットで出すとかすべき。要するに、誰でもすぐ作れるようなものを出してはいけない(あなたの特有の才能、スキルを反映すべきである)
ユーザーが、使うに当たって難しそうなものは、文書によってサポートすること。特にプログラムコードはセットアップの方法を記述するように。
しっかりプレゼンテーションしよう。アセットの質と有用性を、テキストとプレビューでアピールするべき。unityウェブプレーヤー、youtube,Vimeoなどへリンクすることも可能で、有効である。
著作権に問題ある素材は絶対に出さないこと。訴えられる可能性がある。
中に別の著作権が含まれてはいけない。たとえば車にフェラーリのエンブレムがあってはいけないし、ベレッタのような実在の銃を出してはいけない。まるっきり実在のものを3Dモデリングしたりするのはたいてい不可。
できるだけ不具合は避けるように。
アセットの名前は、できるだけ詳しくわかるように。「飛行機」ではなく「伝統的なイタリアの複葉機」のように記述すること。スペースは使わず、アンダーバーで区切る。「Unity」で始まる名前は使わないように。既存のブランド名はつけることができない。
ReadMe.txtなどをつけ、セットアップやインストールの手順を明記すること。ドキュメントはパッケージのメインフォルダに配置すること。
zipファイルは非推奨。
3DモデリングデータはFBXかOBj。zipにする場合、たとえばLightwaveの元のファイルlwoを含めることもできる。
テクスチャはマテリアルにリンクさせるように。事前に確認しておくこと。
テクスチャはpsd,png,tiffのような可逆圧縮形式を使うように。顧客層からしてpsdが最適だろう。jpgは不可。
プログラムコードの場合、利用者が間違った使い方をしないように警告文を作るように。問題が起きたときに、その解決方法を明示するように。
UIの上の部分に自分の会社名を入れさせないように。UIにメニューを増やさせる場合、適切なカテゴリーに適切な名前で入れさせるようにする。
音素材はノーマライズし、できるだけ均一音量になるようにする。オーディオ素材の場合、オーディオサーバ上でもいいし、SoundCloudなどのサービスにリンクさせてもよい。

価格設定は、素材の複雑さや規模に比例してつけられるべき。以下、目安。単位は米ドル。

 

単品素材
小規模:2〜20
中規模:25〜95
大規模:100〜500

 

完成品
小規模:10〜55
中規模:60〜95
大規模:100〜1000

 

スクリプト
小規模:5〜45
中規模:50〜95
大規模:100〜1000

 

拡張機能
小規模:5〜45
中規模:50〜95
大規模:100〜1000

 

別のサイトで同じものをやたら低価格で販売してはいけない。
前例を見ながら妥当な価格をつけるのがベストである。
高い価格をつけることを恐れるな。
プロの作品であるという自覚を忘れないように。アート作品の場合、視覚的に魅力のないものは売れないかもしれない。

 

プレビューは前例を参考にしつつ、あまり変なものを作らないように。画像は16bitのpngで(32bitのpng形式というのは存在しない)
ライブエリアとは、画像のエリア。文字のかからないエリアのこと。たとえばbigでは、860×389の、右550は画像の未表示され、残り左は黒文字でテキストの説明が入り、そこも画像エリアと重なっている。
もし画像の左側が真っ黒な画像だと、文字が見えなくなってしまう。できればライブエリアに画像が収まるようにし、もし残り部分も画像がかかるなら、黒文字がしっかり読めるようにすること。
big - 860 x 389 (live area 550 x 330)
small - 200 x 258 (live area 175 x 100)
icon - 128 x 128
の3つが要る。

 

提出する際には、アセットストアツールというのを使う必要がある。ログオンして最初のページ下部にあるリンクをクリック、ツールの最新バージョンをダウンロードする。それをインポートし、ユニティエディタから「パッケージマネージャを起動」する。
提供者にロゴを入れるところがある。
記述は英語。ぎこちない英語やスペルが間違っていると再提出。
ウェブサイトのリンク記述は、html形式のそのままで書く。href="www.mysite.com"のような書き方。メールも。
3Dモデルの場合、リグアニメーションされているかどうか、ポリゴン数など書く。バージョンも書く。
プレビューページで問題ないかしっかり確認しよう。
事前にそれが正常に使えるかどうか、テストしてから提出してください。新しくプロジェクトを作り、本当にインポートできるか試す。細かくチェックするように。クレームが飛んできても知らんぞ。
提出後、ユニティチームによって審査される。ただしすべての不具合が見つけられるとは限らないし、後でクレームが飛んでくるかもしれないので、問題はできるだけ自分で見つけておくように。

 

///実際にアップロードしてみて
画像ファイルなど、マイドキュメントの直下でないとアップロードできないことがある。
作品の説明書きに一部のHTMLタグを入れることができる。使えるのは

 

//////////////////////
Unityショートカットキー

 

Q パン
W 移動
E 回転
R 拡大/縮小
Z ギズモの表示位置を切り替え
X ギズモの回転設定を切り替え
V 頂点スナッピング
CTRL/CMD+マウス左ボタン スナッピング

 

GameObject
CTRL/CMD+SHIFT+N game objectを生成する
CTRL/CMD+ALT+F ビューに移動(Move to view)
CTRL/CMD+SHIFT+F ビューに位置合わせ(Aligh with view)

 

Window
CTRL/CMD+1 Scene
CTRL/CMD+2 Game
CTRL/CMD+3 Inspector
CTRL/CMD+4 Hierarchy
CTRL/CMD+5 Project
CTRL/CMD+6 Animation
CTRL/CMD+7 Profiler
CTRL/CMD+9 Asset store
CTRL/CMD+0 Animation
CTRL/CMD+SHIFT+C Console

 

Edit
CTRL/CMD+Z 取り消す(Undo)
CTRL+Y (Windows only) やり直す(Redo)
CMD+SHIFT+Z (Mac only) やり直す(Redo)
CTRL/CMD+X カット
CTRL/CMD+C コピー
CTRL/CMD+V 貼り付け
CTRL/CMD+D 複製(Duplicate)
SHIFT+Del 削除
F 選択項目をフレームの中央に(Frame(center)selection)
CTRL/CMD+F 検索
CTRL/CMD+A 全ての項目を選択
CTRL/CMD+P 再生(Play)
CTRL/CMD+SHIFT+P ポーズ(Pause)
CTRL/CMD+ALT+P ステップ実行(Step)

 

Selection
CTRL/CMD+SHIFT+1 1から選択状況をロード(Load Selection 1)
CTRL/CMD+SHIFT+2 2から選択状況をロード(Load Selection 2)
CTRL/CMD+SHIFT+3 3から選択状況をロード(Load Selection 3)
CTRL/CMD+SHIFT+4 4から選択状況をロード(Load Selection 4)
CTRL/CMD+SHIFT+5 5から選択状況をロード(Load Selection 5)
CTRL/CMD+SHIFT+6 6から選択状況をロード(Load Selection 6)
CTRL/CMD+SHIFT+7 7から選択状況をロード(Load Selection 7)
CTRL/CMD+SHIFT+8 8から選択状況をロード(Load Selection 8)
CTRL/CMD+SHIFT+9 9から選択状況をロード(Load Selection 9)
CTRL/CMD+ALT+1 1に選択状況をセーブ(Save Selection 1)
CTRL/CMD+ALT+2 2に選択状況をセーブ(Save Selection 2)
CTRL/CMD+ALT+3 3に選択状況をセーブ(Save Selection 3)
CTRL/CMD+ALT+4 4に選択状況をセーブ(Save Selection 4)
CTRL/CMD+ALT+5 5に選択状況をセーブ(Save Selection 5)
CTRL/CMD+ALT+6 6に選択状況をセーブ(Save Selection 6)

CTRL/CMD+ALT+7 7に選択状況をセーブ(Save Selection 7)
CTRL/CMD+ALT+8 8に選択状況をセーブ(Save Selection 8)
CTRL/CMD+ALT+9 9に選択状況をセーブ(Save Selection 9)

 

Assets
CTRL/CMD+R リフレッシュ

 

//////////////////////////////////
機種ごとに開発の違い

 

iOS:
Appleデベロッパー アカウントをセットアップしないといけない。

 

//////////////////////////////////
Unityリファレンス

 

詳細はウェブページを参照。使う可能性のあるものだけ書いていく。
使い方に関しては、Webのページの例文を参考にして使う。とりあえず何をしたいときにどこを見ればよいかを示す。
ソーシャルやネットワーク関係と、Javaなど低級言語に関するものは除いている。それらをやるなら委託すべき。

 

注意:
画面に見えている値に関しては、プログラムで制御する必要はない。メカニムや通常のアニメーションで数値を変更し、条件が整ったらそのアニメーションを再生するようにプログラムを書いた方が楽である。

 

AccelerationEvent:Androidなどを揺らしたときの加速度センサー。加速度の値と計算時間を返す。
AndroidInput:タッチパッドの、高さや幅を返す。
AnimationClip:キーフレームアニメーション。新規作成、再生時間、フレームレート、ラップモード、カーブの削除など。
AnimationCurve:アニメーションカーブの、キーの追加と削除、移動、値の読み込み、接線をスムーズにする、ラップモードの設定。イーズイン、アウトの設定。
AnimationInfo:再生されたアニメーションクリップの名前、ウェイトを返す。
AnimationState:アニメーションクリップの、ブレンドモード設定、クリップの名前、有効無効、秒数、再生速度と時間、今の時間、ウェイト、ラップモードを返す。
AnimatorStateInfo:アニメータのステートの、長さ、ループの有無、ステート名、正規化された時間、タグ名を返す。
AnimatorTransitionInfo:アニメータのトランジションの、名前、正規化された時間、トランジション名を返す。
Application:ウェブプレーヤーのパス、ゲームのフォルダパス、レベルがロードされているかどうか、ウェブプレーヤーかどうか、最後にロードされたレベルと名前、プラットフォーム名、ウェブプレーヤーのHmtlからのパス、ウェブプレーヤーからダウンロードされたバイト数、言語、フレームレート、一時データの保管パス、Unityのバージョンを返す。関数は、アプリの終了取り消し、スクリーンショットを撮る、ウェブプレーヤーでカメラやマイクの許可があるかどうか確認、そのレベルをロード、ゲームオブジェクトを持ち越してレベルをロード、アプリの終了(ウェブプレーヤーでは無視)、
AssetBundle:ネット上からモノをダウンロードし、インスタンスにする。モバイル不可。
AudioClip:オーディオ。チャンネル、サンプリング周波数、クリップの準備ができているかどうか、オーディオの長さを返す。チャンネルや周波数を設定し、クリップの作成ができる。
AudioSettings:スピーカーとそのフォーマット。オーディオドライバのスピーカーモード、オーディオシステムの現在時刻、ミキサーの出力レート、スピーカーのモードの設定。サンプルミキサーのバッファサイズをとることもできる。
Avatar:アバターが、人型かどうか、メカニムのアバターかどうかを返す。
CharacterInfo:文字列をレンダリングするときの情報。Unicode値、大きさ、スタイル、文字のUV座標、スクリーン座標、文字どうしの幅を返す。
Collision:衝突。コライダ情報、ゲームオブジェクトの情報、ぶつかったオブジェクトの相対速度、リジッドボディの情報、トランスフォームの情報を返す。
Collision2D:2Dの場合はこちら。

Color:カラー情報。RGB,CMYなどで可能。
Color32:透明度も設定できるカラー。
COmpass:スマホとかのコンパス機能。有効無効、更新、北極からの角度、地磁気データ、最終更新時刻を返す。

 

Component:ここにあるVariable、Functionは、「オブジェクトの名前.変数または関数.……」という形で使用する。
Behaviour:これもComponentと同じで、オブジェクトの名前を先につけて使用する。

 

Animation:物理演算の有無、カリングタイプ、バウンズ、再生モードを返す。またアニメーション名の追加、ウェイト・クロスフェードの設定、アニメーションの数、再生中かどうか、再生・巻き戻し・停止・削除命令。
Animator:メカニムアニメーション。ルートモーションの有無、アバター情報を取得、中心位置、再生位置、ルート位置を返す。またトランジション、IK情報、パラメータの値の変更、ウェイト設定など。
AudioListener:オーディオの停止、音量など。
AudioSource:AudioSourceに関すること。
Camera:カメラの情報。
Collider2D:衝突に関することすべて。
ConstantForce:一定の力を加え続ける。
GUIText:テキスト描画。
GUITexture:Guiのテクスチャ。
Joint2D:ジョイントに関する制御。
LensFlare:レンズフレアの設定:
Light:ライトに関するすべて。
Projector:インスペクターのProjectorと同じ。
Skybox:スカイボックスのマテリアルを設定。
Cloth:クロス物理演算の設定。
InteractiveCloth:クロス物理演算の設定。

Collider:衝突。
Joint:ジョイント。
LightProbeGroup:ライトプローブの位置を変更。
MeshFilter:メッシュの名前を返す。
OcclusionArea:オクルージョンカリングの中心とサイズを返す。
OffMeshLink:ナビメッシュオブジェクトの詳細設定。
ParticleAnimator:パーティクルを扱う。
ParticleEmitter:パーティクルを扱う。
ParticleSystem:パーティクルを扱う。
Renderer:レンダラ。影、レンダラの有効無効、マテリアルの設定など。マテリアルのパラーメータの変更が可能。
Rigidbody:リジッドボディ。
Rigidbody2D:リジッドボディ。
TextMesh:テキストメッシュ。
Transform:それの親や子の名前、、オイラー回転値、わーるど・ローカルの位置、スケール。親子関係の解除、オブジェクト名検索、ワールドからローカルに変換、特定のオブジェクトの方向を向かせる。
ContactPoint:衝突が発生した、その接触点の情報。接触点の法線、その地点、当たった先の物体の情報。
ContactPoint2D:上と同じ。

ControllerColliderHit:コライダ情報の詳細。
CrashReport:クラッシュしたときの情報。
Debug:開発コンソールを見る。
Display:ディスプレイの情報。ディスプレイの一覧、メインディスプレイはどれか、レンダリングの高さ、幅、システムの高さ、幅を返す。ディスプレイのレンダリング解像度をセットする。
Event:ボタンを押したときに何をするか、の詳細。
Flare:フレアアセットを使う。
Font:GUIのテキストの変更。
GameObject:ゲームオブジェクトに関する詳細。
Graphics:メッシュの描画に関するもの。
GUI:GUIインターフェースの変更。
GUIContent:GUIの、画像追加、テキスト追加など。
GUILayout:GUIの箱に関するもの。
GUIStyle:GUIの色やフォントなど変更する。
Gyroscope:デバイスにジャイロスコープがある場合、それにアクセス。
Handheld:スマホの機能。動画のフルスクリーン、バイブレーションなど。
HumanDescription:ヒューマンボーンのIK、回転などの設定。

HumanLimit:ヒューマノイドの可動域の設定。
HumanTrait:メカニム・ヒューマノイドのボーン、マッスル設定。
Input:InputManagerの情報を返すほか、入力全般。マウスやキーボードのキーを押したときの反応を設定。
JointAngleLimits2D:ジョイントに関する設定の変更。
JointDrive:ジョイントに関する設定の変更。
JointLimits:ジョイントに関する設定の変更。
JointMotor:ジョイントに関する設定の変更。
JointMotor2D:ジョイントに関する設定の変更。
JointSpring:ジョイントに関する設定の変更。
JointTranslationLimits2D :ジョイントに関する設定の変更。
Keyframe:アニメーションカーブの、キーフレームの、接線や時間、カーブの値の設定。キーフレームの作成もできる。
LightmapData:ライトマップの入射光、間接光の情報を返す。
LocationInfo:GPS機能へのアクセス。
LocationService:GPS機能へのアクセス。
Material:マテリアルの、カラー、テクスチャ、シェーダーなど返す。またマテリアルの色、テクスチャ、画像の大きさなど設定できる。
Mathf:数学関数。無限大、円周率、サインコサイン、絶対値など。

Microphone:マイクを使って外の音を録音する。
NavMesh:ナビメッシュを使う。
Object:オブジェクトのインスタンスIDや、名前、オブジェクトやコンポーネントの削除など。
Particle:パーティクルの設定の変更。
Particle.CollisionEvent:パーティクルが何かに衝突したときの情報。
PhysicMaterial:衝突するオブジェクトの設定。
PlayerPrefs:データの保存、読み込み。Setで保存、Getで読み込み。
QualitySettings:Quality Settingsの変更。
Quaternion:クオータニオン回転の値をとる。オイラー角を返す。
Random:ランダム値の作成。
Ray:レイ。レイの方向ベクトル、原点を返す。原点から方向ベクトルに向かって進むレイの作成、進んだ点の座標を返す。
Ray2D:2Dでもレイが使える。
RaycastHit:レイを飛ばして衝突した物体の情報など。
RenderSettings:RenderSettingsの設定変更。
Resolution:ディスプレイの解像度を変更。
Resources:ファイルをロード、アンロード(メモリ開放)

Screen:ディスプレイ情報。ディスプレイ回転設定、フルスクリーンかどうか、解像度、カーソルのロック、カーソルの表示、省電力、高さと幅など返す。解像度の変更ができる。
GUISkin:GUIの設定。オブジェクト設定、フォント設定、縦横のGUI設定など。
Shader:シェーダ。シェーダー検索、色、Float、テクスチャなどのプロパティを設定する。
SleepTimeout:ゲーム画面がスリープするまでの設定。
Sprite:スプライト情報。スプライトの位置のほか、スプライトオブジェクトの作成もできる。
SystemInfo:システム情報にアクセス。デバイスのモデル、名前、タイプ、グラフィックデバイスの名前、GPU,OS名、メモリ、ピクセルフィルレート、シェーダも出る、CPU、加速度センサーやジャイロスコープ、バイブレーション機能の使用できるかどうか。
TextAsset:テキストファイルのデータを取得できる。
Texture:テクスチャの、フィルタリング、ミップマップバイアス、テクスチャの幅、ラップモードを返す。ハンドルを取得する。
Cubemap:キューブマップの情報。
MovieTexture:ムービーテクスチャの情報。
ProceduralTexture:プリシージャルテクスチャの情報。
Texture2D:テクスチャを作成、圧縮、エンコード、カラー取得、読み込みなど。
Texture3D:3Dテクスチャ。シェーダによる。
WebCamTexture:ウェブカメラの映像をテクスチャにする。デバイス名、画面の大きさなど返す。
Time:時間情報。前フレームからの時間、FixedUpdate関数が呼び出される時間間隔、ゲーム開始からの時間、合計フレーム数、フレームの最大待機時間、時間の伸縮、直近のシーンロードからの経過時間などを返す。
Touch:スクリーンに指をタッチしたときの情報。タッチの位置、タッチ状態(押されたか、離されたか、動いたかなど)、タッチした座標、タップした数など。

TouchScreenKeyboard:スマホのキーボード機能。
Vector2:二次元座標。
Vector3:三次元座標。
Vector4:四次元座標。
WebCamDevice:ウェブカメラの情報。
WheelFrictionCurve:タイヤ状のものの摩擦を物理演算する特殊なクラス。
WheelHit:ホイールの接点の情報など。
WWW:ウェブページにアクセス。ダウンロードの進み具合なども表示できる。
WaitForEndOfFrame:スクリーン上のレンダリングが完了するまで待つ。
WaitForFixedUpdate:FixedUpdate関数が呼び出されるまで待つ。
WaitForSeconds:指定秒数待つ。