Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者40代後半中年中間管理職おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ RigidBody Fixed TimeStep 玉が転がるスピード、減衰力の調整方法

RigidBody 玉が転がるスピード、減衰力の調整方法ということで、

玉を転がすゲームを作りながら得たノウハウを紹介!!

 

といっても、大した内容ではないので、あしからず(-_-メ)

 

まあ、一応紹介しておくと、こんなアプリを作っている

youtu.be

play.google.com

 

ついでに・・・

play.google.com

 

前置きが長くなったが、UnityEditorのプロジェクトのデフォルトで、玉を転がすと、Physics Materialの摩擦を0にしようが下記のような感じで、玉の流れの勢いの減衰力が自然界のもののようには全然いかず、かなりもっさりで、使えない

さらに途中で無意味に止まってしまったりもする(-_-メ)

f:id:Harukichi:20210613202427g:plain

 

ここで、Physics MaterialのMassをいじってみたりするが、物理学的に、重さには関係なく重力は空気抵抗がなければ万物落下速度は同じである(あってるよね??)

f:id:Harukichi:20210613202731g:plain

 

なので、何ら変化なし

 

じゃあ、今度は本当にGravity(重力)をいじってみる

f:id:Harukichi:20210613203200g:plain

勢いが強すぎて、コリジョンをすり抜けてしまう (T_T)/~~~

 

なので、すり抜けないようにRigidbodyのCollistion DetectionをContinuousに

f:id:Harukichi:20210613203528p:plain

 

すり抜けなくなったが、玉の減衰が強いのは変わらず

f:id:Harukichi:20210613203357g:plain

 

 

ということで、前置きが長くなったが、Project SettingsのTimeのFixed Timestepの値をデフォルト0.02を0.005に変更する

f:id:Harukichi:20210613203930p:plain

 

 

すると、下記のように格段に玉の勢いが増し、減衰力も減らすことができた

f:id:Harukichi:20210613204344g:plain

 

ただ、なんかよくわからないタイミングで、何が気に入らないのか止まってしまうことがある

 

そこで、PhysicsのSleep Tjresholdをデフォルトの0.005から0.001に減らしてみる

f:id:Harukichi:20210613204757p:plain

 

祝!! 無事なんとか、気持ちいい感じに玉が流れるようになった!! 

f:id:Harukichi:20210613204953g:plain

 

 まとめ

 要は物理演算の計算の間隔を短くすると、計算の精度が上がるということらしい

 ただし、CPUへの負荷が増えるため、用途に合わせて調整する必要ありとのこと

 

 

基本的な仕様について

 そういえば、どうやって上記の動画のようなことを実現しているかを全く触れていなかったので、要点のみ書き残しておく

 

 ●構造物

  ・Blenderで作成したモデルデータ Blenderのファイル形式で読み込み

  ・コライダーは、Mesh Colliderを使用

  ・Physics Materialは、bouncinessのみ0.005

   その他は0 CombineはMaximum

        ・Materialは、パイプのみRendering modeをTransparentにして、

   albedoのA(アルファ)値を適当に下げて透かしている

 

 ●ボール

  ・3D Objectのsphereを使用

  ・Rigidbody、Sphere Colliderを使用

   Mesh Collider同士の当たり判定はできないので注意が必要

  ・Physics Materialは、bouncinessのみ0.005 用途に合わせて要調整

   その他は0 CombineはMaximum

  ・Prefab化して、スクリプトから制御して発射している

   Instantiate(TamaPrefab, TamaSpawnPos.transform.position,    TamaSpawnPos.transform.rotation);

 

以上、ここまで