バッテラが如く

いつもお世話になっております。

【Unity】RigidBodyのAddForceの引数であるForceModeとはなんだろうか?

この記事の情報は次のバージョンで動作確認しています。

  • MacOS Monterey (12.1)
  • Unity (2021.3.2f1)
  • Unity

    はじめに

    ForceModeによって力の加え方が異なります。

    モードは4種類あるんですが、違いは2つでした。

    • 質量を考慮するか
    • 速度の計算方法

    です。この組み合わせで4種類てことでした。

    表に表すとこんな感じになります。

    モード 質量の考慮 速度の計算方法
    Force する 平均
    Acceleration しない 平均
    Impulse する 瞬時
    VelocityChange しない 瞬時

    質量の考慮とは?

    質量とはRigidbodyMassのことです。

    つまりMassの数値によって動作が変わるかどうかというものです。

    モードがForceであればMassの値が変わると動作も変わります。

    具体的には内部パラメータであるvelocityが変わります。
    ※他にもあるかも

    モードがForceMassの値が1とAccelerationは同じ動作をしていました。

    Massの値が0.1だと力がveloctiy1/10になっていたので比例していると思います。

    速度の計算方法の違いとは?

    前提として速度を求める式が違うということです。

    平均の速度

    速度 = F/m * Δt
    
    F・・・力  
    m・・・質量  
    Δt・・・かかった時間 

    これをUnityの世界に置き換えた場合は以下のプログラム式になります。

    velocity  =  power / * FixedTimestep 

    ちなみにFixed Timestepはデフォルトは0.02になっています。

    Project SettingsのTimeにある項目で変えられます。

    Accelerationは質量を考慮しないため、Massを1に置き換えた計算式になる。

    瞬時の特性

    速度 = F/m 
    
    F・・・力  
    m・・・質量  

    これをUnityの世界に置き換えた場合は以下のプログラム式になります。

    velocity  =  power / Mass 

    VelocityChangeは質量を考慮しないため、Massを1に置き換えた計算式になる。
    つまり、powerがそのまま反映されるということ

    補足

    Rigidbodyのパラメータがどう影響するかの補足です。

    Use Gravity

    Use Gravityは物理運動をするしないの設定です。

    Use GravityがOFFだとAddForce使えないと思いきや使えました笑。

    ONにした場合、空気抵抗や摩擦抵抗を受けるようになるため、さらに計算が複雑になります。

    なので、ForceModeの動きを検証したいのであればOFFにするといいでしょう。

    IsKinematic

    IsKinematicがONだとAddForceが全く効きませんでした笑。