UnityのAddforceの使い方
UnityのAddforceはRigidbodyのコンポーネントがついているゲームオブジェクトに対し力を加えることができる。よって、まずRigidbodyがわからないという場合は以下の記事を確認してほしい。
Rigidbodyの使い方
また、この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
if文の条件分岐
AddforceはRigidbodyを使う場合に使用頻度が高い関数だ。使い方を紹介していく。
Addforceの使い方目次
Addforceの基本Force
Acceleration
Impulse
VelocityChange
目次にもどる
Addforceの基本
Addforceの基本の書き方は以下の通り。AddForce(力をかける方向, モード)
Addforceで動かしたゲームオブジェクトは物理的な挙動を行うのが特徴だ。
Force、Acceleration、Impulse、VelocityChangeの4つのモードがある。
AddForceなどの物理演算は基本的にはFixedUpdateメソッド内で行うべきと言われている。
void FixedUpdate()はメソッドの種類の一つだ。新しいスクリプトと開くと最初から書かれているUpdateメソッドと比較して定期的に呼ばれる点は似ているが異なる面もある。
Updateメソッド
毎フレーム呼ばれる(ゲーム機の性能差により呼ばれる回数が異なる)。アニメーションが表示される前に呼ばれるのが特徴。プレイヤーキャラの位置をUpdateメソッドで変更→アニメーションに表示といった流れの処理となる。
FixedUpdateメソッド
デフォルトの設定では0.02秒ごとに呼ばれる。一定間隔ごとに呼ばれるのが特徴。
Updateメソッドでは呼ばれる回数が異なるので、上手く物理演算が表現されずゲーム機のスペックによっては不自然な動きになってしまう場合がある。よって物理演算ではFixedUpdateメソッドを使うのが基本だ。
ただし、AddForce関数のモードであるImpulseやVelocityChangeなど瞬間的に力をかけるものを使いその後は何もしない場合はUpdateメソッドに記述しても問題はない(例えばジャンプ処理をImpulseで行う場合など)。だがForceやAccelerationといった継続的に力を加えるモードならFixedUpdateメソッドに記述したほうがいい。
4つのモードの詳細について詳しく紹介していく。
目次にもどる
Force
Forceは質量を考慮し継続的な力を加えることができる。ちなみに質量はRigidbodyのMassで設定することができる(単位はkgである)。
実際に使ってみる。まず、SphereとPlaneを作成しよう。
そしてSphereにRigidbodyのコンポーネントをつけよう。
スクリプトに以下のように記述してSphereにアタッチして再生しよう。
void FixedUpdate()の中の最初の記述はRigidbody sphere1 = this.GetComponent
続いてVector3 tikara = new Vector3(0.0f, 0.0f, 1.0f);として力を入れる方向(Z)と力の大きさ(1)をtikaraに代入した。
sphere1.AddForce(tikara, ForceMode.Force);で力を加える処理を行っている。sphere1に代入されたRigidbodyを持つSphereに対し、tikaraに代入された方向と大きさで力が加えられていく。その後のForceMode.Forceでモードを指定している。だがモードのデフォルトがForceとなっており、モード指定はなくてもいい。
再生するとSphereが少しずつ速度を上げながら転がっていく。
Massの値を大きくして再生することで初動の速度が遅くなることがわかる。
目次にもどる
Acceleration
Accelerationは質量を考慮せずに継続的な力を加えることができる。Forceと似ているが質量を考慮しないので、ゲームオブジェクトのRigidbodyのMassを変化させても移動に変化はない。
スクリプトに以下のように記述してSphereにアタッチして再生しよう。
基本的な記述は先ほどと同様。sphere1.AddForce(tikara, ForceMode.Acceleration);としており、Accelerationのモードで力をかけている。よってMassの値を変えてもSphereの転がり方に変化はない。
例えば行進シーンなど、質量が異なるゲームオブジェクト複数を同じ速度でまとめて動かしたい時に役立つ。
目次にもどる
Impulse
Impulseは質量を考慮して瞬間的な力を加えることができる。スクリプトに以下のように記述してSphereにアタッチして再生しよう。
基本的な記述は先ほどと同様。sphere1.AddForce(tikara, ForceMode.Impulse);としており、Impulseのモードで力をかけている。Startメソッドで1回のみの処理だが、力が一気にかかりSphereが初動から大きく動くのがわかる。
使い方としてはジャンプやダッシュといった移動しはじめから高速な動作を行う際に役立つ。
目次にもどる
VelocityChange
VelocityChangeは質量を考慮せずに瞬間的な力を加えることができる。Impulseと似ているが質量を考慮しない点が異なる。
スクリプトに以下のように記述してSphereにアタッチして再生しよう。
基本的な記述は先ほどと同様。sphere1.AddForce(tikara, ForceMode.VelocityChange);としており、VelocityChangeのモードで力をかけている。Startメソッドで1回のみの処理だが、力が一気にかかりSphereが最初から大きく動くのがわかる。