【はじめてのUnity】ブロック崩しを作る[1]
Unityでなにか作ろうと勉強してみるも、ちょっと間があいてしまうと覚えたことを忘れてしまうので、サンプルを作ったらその都度、記事にメモしていくことにした。
今回は、このページのサンプルをそのまま作成してみて、
わからない用語やメソッドがあったらその場で調べてみたメモ記事です。
http://japan.unity3d.com/developer/document/tutorial/my-first-unity/01.html
で、実際作ってみたのがこちら。
■用語メモ
Duplicate:複製
Horizontal:水平方向
GameObject:3Dメッシュ(立方体・球とか)、ライト、物理オブジェクト、サウンド、トリガーなどの総称
■RigidBody リジッドボディ:剛体(物理エンジン)コンポーネント。ゲームオブジェクトに追加する
CreateEmptyで空のゲームオブジェクト作成してそれをフォルダのように使う。
ゲームオブジェクトを選択してComponent>RigidBodyを付与すると物理オブジェクトになる。
Mass:オブジェクトの質量。100倍にすべきではない
Drag:空気抵抗値。無限の場合動きが止まる
Angular Drag:
Constraints:動きに関する制限
Freeze Position/Rotation:XYZ軸で移動・回転させるかどうか。チェック入れると制限される。
RigidBody.AddForceメソッド
例1:rigidbody.AddForce( (transform.forward + transform.right) * Speed, ForceMode.VelocityChange );
第1引数:3次元ベクトル。
transform.forwardはボールの正面(Z方向)
transform.rightはボールの右方向(X方向)を示す単位ベクトル。足すと右斜のベクトルを得られる。
Speedは任意の変数。
第2引数:力の加え方を指定するフラグ。例では質量を無視して指定速度をいきなり付与している。
ForceMode.Impulse:質量が反映する、瞬間的な力を加える。一定の慣性が働く感じが得られる。
Force 質量が反映する、連続的な力を加える
Acceleration 質量を考慮しない、連続的な加速を加える Impulse 質量が反映する、瞬間的な力を加える VelocityChange 質量を考慮しない、連続的な速度の変化を加える
例2:rigidbody.AddForce( transform.right * Input.GetAxisRaw("Horizontal") * Accel, ForceMode.Impulse);
Input.GetAxisRaw:引数方向のユーザ入力を-1〜1の正規化された範囲で取得する
ユーザ入力はキーボードでもジョイスティックでも構わない。細部はUnityのInput Managerによって管理。
【問題発生】WebPlayer上で再生すると、キーボード操作できなかった。
最低限プレイヤーの入力をサポートしなければ、プレイヤーはムービーを眺めるだけになってしまう(Unity3Dでの入力検知)
Q:InputGetAxisRawとInputGetAxisの違いは何?
A:InputGetAxisRawメソッドはスムージングをかける前の値を取得できるがジョイスティック向けの機能。
キーボードの入力に適用すると、値が徐々に変化することはなくなり、0か1か-1のみ、
つまり限界まで振り切った値のみ取得することになる。
【解決方法】InputGetAxisRawメソッドをInputGetAxisメソッドに修正したらWebPlayerでもキーボード操作できるようになった。
ただし慣性が働くようになるので、Racketのrigidbody>Drag(空気抵抗値)を調整していい感じにする。
■Physic Material(物理マテリアル)
Projectビューのコンテキストメニューから選択。
Bounciness:反発値。0の場合跳ね返らない。1だとエネルギー損失なしで跳ね返る。
Friction Combine Mode / Bounce Combine:2つの衝突するオブジェクトの摩擦/反発値がどのように結合されるか。
Average:平均化される
Min:2つの摩擦値のうち最小値が使用される
Max:2つの摩擦値のうち最大値が使用される
Multiply:2つの摩擦値が互いに乗算される。
→シーンビュー内のCubeにSphere Coliderコンポーネント内、Material項目に、ドラッグ&ドロップすると反映される。