Learn Unity 4 for iOS Game Development 6
レッツ・ロール! 物理学と制御
作ったもの
・マウスカーソルを移動させると、ボールがその方向へ転がります。
クリックすると、別ウィンドウが開きます。
http://shakeweb.sakura.ne.jp/demo/LU4_chap6/
・照明(Directional Light)を配置。
・床に ProceduralMaterial を適用。
・ボールに Rigidbody を適用。
・床とボールに PhysicMaterials を適用。
————————————————————————————————
スクリプトでボールの動きを制御
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#pragma strict var mousepowerx:float = 1.0; var mousepowery:float = 1.0; var maxVelocitySquared:float = 400.0; private var forcex:float = 0.0; private var forcey:float = 0.0; private var isRolling:boolean = false; private var floorTag:String = "Floor"; function Update () { forcex = mousepowerx * Input.GetAxis("Mouse X")/Time.deltaTime; forcey = mousepowery * Input.GetAxis("Mouse Y")/Time.deltaTime; } function FixedUpdate () { if (isRolling && rigidbody.velocity.sqrMagnitude < maxVelocitySquared) { rigidbody.AddForce(forcex,0,forcey); } } function OnCollisionEnter(collider:Collision) { if(collider.gameObject.tag == floorTag) { isRolling = true; } } function OnCollisionStay(collider:Collision) { if(collider.gameObject.tag == floorTag){ isRolling = true; } } function OnCollisionExit(collider:Collision) { if(collider.gameObject.tag == floorTag){ isRolling = false; } } |
・FixedUpdate を使用して、一定の間隔で、Update より頻度の多い更新を行う。
TimeManager(Edit | Project Settings | Time)で更新頻度を指定できる。
・変数 rigidbody(= gameObject.rigidbody )で、Rigidbody コンポーネントの AddForce 関数を呼び出せる。
・ボールが床に接してから、制御が効くようにするために、Collision クラスの変数 collider を監視。
・rigidbody.velocity.sqrMagnitude : velocity の型は Vector3。sqrMagnitude で、その length を求めることができる。
————————————————————————————————
カメラの制御
・SmoothFollow スクリプトをメインカメラに適用。Rotation Damping の値を0にすることによって、カメラの回転を止める。
————————————————————————————————
使用アセット
Eighteen Free Substances (Allegorithmic)
————————————————————————————————
関連リンク
Unity で使用されている物理エンジン PhysX
https://developer.nvidia.com/physx