どうも、ナッツパパです(^^)
本記事では、Unityで登場する【impulse】をメインに解説していきます。
オプションとして、【Enumerations】についての解説もやっていきます。
そもそも、Unityにおいて【インパルス】というのは、【impulse】と【Impulse】の2つが存在します。
厳密にいうともっとありますが、よく使うところではこの2つですね。
頭文字が、大文字か小文字かで、全く意味が異なります。
▼2つの違いが以下です。
ゲームオブジェクト同士が衝突した時に生成される『Collisionクラス』の中のプロパティ。
この中に、衝突した衝撃値が格納される。
Unityで定義されている列挙型の内の1つである『ForceMode』内のプロパティ。
『ForceMode』は、ゲームオブジェクトにどの様に力を加えるかを指定できます。
【ForceMode.Impulse】と指定すると、瞬間的に力を加えることが出来ます。
最初にまとめてみました。
▼『Collisionクラス』については、下の記事で詳しく解説しています。
ちなみに、列挙型の集まりのことをUnityでは【Enumerations】と表現します!
列挙型とは?というところも記事本文で解説していきます♪
2つの【インパルス】についてと、【Enumerations】について。
数分で読める内容なので、気軽に見ていってください(^^)
【impulse】とは?
改めて、【impulse】とは、ゲームオブジェクト同士が衝突した時に生成される『Collisionクラス』の中のプロパティで、衝突した衝撃値が格納されています。
そして重要なのは、ゲーム開発において、『衝撃値』をどの様に使用するのかということです。
▼よく使用する2つのパターンを紹介しておきます
・衝撃値が基準値より高ければ、効果音を鳴らす
【impulse】を使用した実際のコード例
ここでは、衝撃値が基準値より高ければ、ゲームオブジェクトを破削除するという処理を紹介します。
▼環境(上画像を参照)
①SphereとPlaneの位置は、上画像の様に各自設定。
②Sphereに『Rigidbody』を紐づける
③Sphereの『Collider』のMaterilに、Physic Material(Bounce CombineをMaximumに設定)を紐づける
以上です。
これで、PlaneにSphereが落下して、バウンドするようになります。
そして、Sphereが落下した衝撃で、Planeが削除されるコードが以下です。
このスクリプトファイルをPlane側に紐づけて下さい。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlaneScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } void OnCollisionEnter(Collision collision) { if(collision.impulse.magnitude > 20) { Destroy(gameObject); } } }
19行目~25行目までが目的のコードです。
落下の衝撃が20より大きければ、Planeを削除してという処理です。
21行目で【impulse】を使っていますね。
▼【impulse】の後ろの『magnitude』に関しては以下の記事で詳しく解説しています。
【impulse】が格納するデータは、Vector3型です。
『magnitude』をつけなければ、数字と比較することが出来ないのでご注意を!
次は、【Impulse】の方を見ていきましょう。
【Impulse】とは?
改めて、【Impulse】とは、Unityで定義されている列挙型の内の1つである『ForceMode』内のプロパティで、ゲームオブジェクトに瞬間的に力を加えることができる設定です。
列挙型については、後ほど解説するので一旦置いておきましょう。
ボールのゲームオブジェクトに瞬間的に力を加えると、ボールを蹴った時のような挙動を実現することが出来ます。
文章で書いてもイメージがしづらいので、これから実際のコードを見ながら解説していきます。
【Impulse】を使用した実際のコード例
ここでは、キーボードの『Fキー』を押すことで、青色の球(Sphere)をパンッと弾いて、壁に当てる簡単な処理を紹介します。
▼環境(上画像を参照)
①床(Plane)と壁(Mato)と球(Sphere)を用意
②球(Sphere)に『Rigidbody』を紐づける
③球(Sphere)の『Rigidbody』の、『Collision Detection』の設定をContinuousに変更
以上です。
③の処理は、オブジェクトの移動スピードが速くても、貫通させずに衝突させる処理です。
▼そして、球を弾いて壁に当てる処理が以下のコードです。
このスクリプトファイルを球(Sphere)に紐づけてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class impulseScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if(Input.GetKeyDown(KeyCode.F)) { Rigidbody rb_sphere = this.GetComponent<Rigidbody>(); rb_sphere.AddForce(-transform.forward * 1000f , ForceMode.Impulse); } } }
16行目~20行目が目的のコードです。
キーボードの『Fキー』が押されたら、球(Sphere)に対して、Z軸マイナス方向に瞬間的に1000(適当)の力を加えてという処理になります。
19行目で【Impulse】を使っていますね。
そして、注目は同じく19行目の『AddForce』という関数です。
つまり、【ForceMode.Impulse】というのは、基本的には、『AddForce関数』の第二引数に使用するものだということです。
力の与え方の種類(モード)を、ForceMode列挙型の中から自由に選べるようになっていて、その選択肢の一つが、記事本題の【Impulse】なのです。
【Impulse】の他には、『Force』というのがあります。
【Impulse】が瞬間的に力を加えるのに対し、『Force』は継続的に力を加えるモードになります。
ForceMode.Forceと表現されますね。
これは初期値ですので、『AddForce』の第二引数に何も設定しなければこれになります。
そして、『AddForce関数』は、『Rigidbodyクラス』の中で定義されているので、呼び出す場合はまず、GetComponentを使用し、ゲームオブジェクトの『Rigidbodyクラス』を取得する必要があるのです。
その処理が、上のコードの18行目になりますね。
【Impulse】の解説は以上です(^^)
次の列挙型【Enumerations】の解説で最後になります。
知っているという人は飛ばして下さい!
【Enumerations】とは?
※上の画像は、Unityのスクリプトリファレンスより引用した画像です。
【Enumerations】とは、『列挙型』の集まりのことです。
では『列挙型』とは何か。
本記事で紹介した、『ForceMode』も『列挙型』だといいました。
C#には、というよりあらゆるプログラミング言語でも『定数』という概念が存在します。
『定数』とは、変数の種類の1つで、中の値を変えることが出来ないという特徴を持っています。
Const 〇〇 と定義されているあれです。
変数の中身を固定したい場合などに、定数は便利です。
そして、その『定数』をたくさん保管することができるのが、『列挙型』です。
『定数』の集まりが『列挙型』。
『列挙型』の集まりをUnityでは【Enumerations】と表現します。
C#では、enum 〇〇 で列挙型を作成することができます。
ではなぜ、定数の集まりをわざわざ作るのか。
コードを綺麗に保つ為です。
PC内でも、カテゴリーごとにフォルダを作ってまとめておくと使いやすいのと同じです。
定数というのは開発において数多く作成します。
その定数をカテゴリーごとにまとめる役割が『列挙型』だと思って下さい。
万が一、定数の中身のコードを修正することになっても、『列挙型』内の定数を1か所修正すればいいだけなので、非常に楽です。
そして、同じカテゴリーの定数が綺麗にまとめられた『列挙型』というのは、関数の引数と相性が抜群に合います。
『ForceMode』は、『AddForce関数』の第二引数として、Unity側が用意してくれている『列挙型』でした。
先でもでてきた、ForceMode.〇〇 とは、『列挙型』の中の好きな定数を選択してね、ということなんです。
【Impulse】と【Force】が簡単に選べたように、Unity側が、定数を綺麗に『列挙型』という名のフォルダーにまとめてくれているおかげです。
引数に使用するなら、変数の中の値を変えることはないので、定数をしようしているのです!
値の決まった定数の中から好きなものを選ぶだけで、ゲームオブジェクトの挙動を変えることが出来る。
『列挙型』便利です。
参考資料
最後に本記事作成の参考資料を紹介します。
▼Unityの公式スクリプトリファレンス。AddForce関数について
▼サムライエンジニアさん。enumについて。
【Enumerations】については、調べても全く出てこず。
これは、あくまでも私の考えをまとめたものですので、ご了承を。