Unity覚え書き
別のシーンへ遷移させる方法:
File→Build SettingsのWindowにて、上部分にビルドするシーンを順番に格納。
追加したシーンに対して、Applicationクラスからアクセス出来る。
(例)Application.LoadLevel("game");
JavaScriptでの変数定義:
var test(変数名) : int(型);
初期化代入時: var test : int = 100;
C#は普通に、int test = 100;
スクリーン情報の取得:
Screenクラスよりアクセス可能。
Screen.Width, Screen.Heightで、それぞれスクリーンの幅、高さを取得。
基本的なスクリプトとオブジェクトのリンク:
GameObjectを作成し、それと対になるScriptを作成。
GameObjectに対して、Scriptファイルをドラッグして関連付ける。
スクリプトの中で、何かObjectを定義すると、関連付けたGameObjectに対してInspectorで表示されるので、
そこに初期値として関連付けたいObjectをドラッグ。
値等の場合は、Inspectorから初期値を操作する事が可能。(ただし、ソース内の初期値は無効になるのでややこしくなる)
物理演算処理を行いたい場合:
GameObjectのComponentに対し、Physics→RegidBodyを関連付ける。
これで、GameObjectに対し、物理的な処理が特に考えなくても内部的に行われる。
重力加速度の計算を無くす場合は、「Use Gravity」をOFFにする。
RigidBodyが関連付いたObjectは、スクリプト内でrigidbodyからアクセスが可能。
rigidbody.AddForce(x, y, z)により、物理処理が可能。
どの方向軸(X, Y, Z)に対して、どれぐらいの力が加えられたかで指定。
入力の取得方法:
単純なボタンイベントを取得する場合、Inputクラスのメソッドで取得可能。
Input.GetKeyDown(KeyCode.Space);
Input.GetButtonDown("space");
この場合は、スペースキーが押された場合という意味。
押された時にしか、イベントが発生しないので、注意。
Input.GetButton("space");だと、継続してイベントが取得出来る。
入力定義:
Edit→Project Settings→Inpoutを選択する事で、InspectorにInput情報が表示される。
Horizontalに定義されたアクションは、down, up, a, dとなっている。
Inputクラスにて、このInputに定義されたアクションを指定する事で、関連づいたボタンのイベントが取得出来る。
GUIについて:
凄く使い辛いので、使用する際はオリジナルで別の方法を使う必要があるが一応。
GUISkinクラスにて実装する。
GUISkinクラスは、あらゆるGUIを内包している。(Button, Box, TextArea,...等)
Buttonの場合は、GUI.Button(Rect(0, 0, 50, 100),"Game Start")的な感じ。
背景画像を入れる場合:
Project内に、画像データをドラッグしてやるとTextureとしてInportされる。
デフォルトでは、MipMap等が有効になっている。
追加したTextureファイルを選択した様態で、GameObjectからGUI Textureを選択する事で背景画像として設定される。
GameObjectのLifeCycleについて:
今のところ、主に使うイベントは、Start(), Awake(), Update()。
Start()は、GameObjectのどの情報にアクセスしても保障されているイベント。
Awake()は、Startより前に呼び出されるイベントで、内部情報等のロード完了は保障されていない。
Update()は、更新の度に呼び出されるイベント。
単純な変数の初期化処理等は、Awakeで行い、情報の代入等を行う場合は、Startでやるといい。
Tagについて:
Tagは、GmaeObjectに関連付けるタグ。
Edit→Project Settings→Tagsから、タグを追加登録。
GameObjectのInspectorのTagを選択すると、追加登録したTagが選択出来るようになる。
スクリプト内で、Tagを指定してやる事で、タグのついたオブジェクトを判定する事が出来る。
衝突判定等で使えるかも。
(collision.gameObject.tag == "player")みたいな。
Prefabについて:
Prefabは、Object等を動的に生成する際に必須になる。
使い方としては、何らかのObjectを作成し、別途Prefabを作成する。
作成したPrefabに対して、Objectをドラッグする事でそのObjectをPrefab化する事が出来る。
Prefab化したObjectは削除していい。
Prefabに対して、スクリプトを関連付けて、生成するオブジェクトの処理を生成から開放まで実装する。
後は、Objectを生成するタイミングにて、Prefabの座標を指定してInstanceを生成する事で追加される。
Instantiate(particle, other.transform.position, other.transform.rotation);
インスタンス生成するオブジェクト、座標、回転情報を指定。
*生成処理だけで、開放処理を行なっていない場合は、メモリを使用し続けるので、何らかの削除処理が必要。
ゲーム画面内に存在するオブジェクトなら画面外に出たり、ゲームクリアしたら等。
サウンドやパーティクルなら、サウンドが最後まで再生出来たら開放とか。
ゲーム開発では、一番使用頻度が高いと思う。
Prefabに対してJavaScriptの外部関数から操作する方法:
Prefabを生成した後、そのPrefabに関連付いたJavaScriptからメソッドを呼ぶには、Instanceを生成した後に、
GetComponent()で、JavaScriptのIDを指定する。
(例)end_arrow.GetComponent(ArrowScript).setTarget(this.transform);
Class実装
ClassをJavaScriptで実装する場合は、
class MyClass extends MonoBehaviour
{
public function MyClass()
{
}
}
衝突判定について
RigidBody同士の衝突判定を行う場合は、OnCollision関数系を利用する。
ただし、OnCollision系関数は、RigidBodyのCollision設定で、IsTrigerがONが含まれると動作しない。
また、IsKinematicが両方ともONになっていると動作しない。
RigidBodyに対して、IsTrigerを設定すると、当たり判定がおかしくなる。
床をすり抜けて落下したり。
Quaternionについて
GameObjectの回転制御は、全てQuaternionで行なっている。
Operatorにて、*がサポートされているので、Quaternion同士の乗算も気にせず出来る。
Vector3との乗算もサポートされているが、その場合は、Vector3 * Quaternionの形でないとエラー出るっぽい。
Modelの当たり判定
Modelを読み込んだ状態では、Collision設定がない為、設定する必要がある。
Hieralchyに追加したモデルに対して、ComponentからColliderを設定する。
Meshが存在するなら、MeshColliderを利用すると、細かい当たり判定を実装出来る。
が、処理が重いので、Convexを使うといい。
単純なHit判定なら、Box Colliderで独自に設定。
また、Meshを利用すると、足元の判定の為、モデルが立たなくなるので、その場合は、Box Colliderを追加して足場の当たり判定を作る。
RigidBodyですり抜ける原因
RigidBodyで、Gravityを設定していると床をモデルがすり抜ける現象が起きるときがある。
RigidBodyを設定する際には、Colliderが設定されていないと、着地判定が出来なくなりすり抜けてしまう。
もしくは、IsTrigerがONになっている可能性がある。
逆に、下に移動しない場合は、IsKinematicをチェック。
Pirticleの開放
Pirticleの開放は、Inspectorの設定で再生終了時に自動で開放する事が出来る。
AutodestoractをONにすると、一回再生で開放される。
また、OFFにした場合、明示的に開放するまで、Pirticleの再生がループする。