【Unity 簡単解説】impulseとは?Enumerationsとは?を解決する

Unity インパルスとは? アイキャッチ画像 メタバース

どうも、ナッツパパです(^^)
本記事では、Unityで登場する【impulse】をメインに解説していきます。
オプションとして、【Enumerations】についての解説もやっていきます。

そもそも、Unityにおいて【インパルス】というのは、【impulse】と【Impulse】の2つが存在します。
厳密にいうともっとありますが、よく使うところではこの2つですね。

頭文字が、大文字か小文字かで、全く意味が異なります

▼2つの違いが以下です。

【impulse】
ゲームオブジェクト同士が衝突した時に生成される『Collisionクラス』の中のプロパティ。
この中に、衝突した衝撃値が格納される
【Impulse】
Unityで定義されている列挙型の内の1つである『ForceMode』内のプロパティ。
『ForceMode』は、ゲームオブジェクトにどの様に力を加えるかを指定できます。
【ForceMode.Impulse】と指定すると、瞬間的に力を加えることが出来ます。

最初にまとめてみました。

▼『Collisionクラス』については、下の記事で詳しく解説しています。

 

ナッツパパ
ナッツパパ

ちなみに、列挙型の集まりのことをUnityでは【Enumerations】と表現します

列挙型とは?というところも記事本文で解説していきます♪

 

2つの【インパルス】についてと、【Enumerations】について。
数分で読める内容なので、気軽に見ていってください(^^)

 

【impulse】とは?

改めて、【impulse】とは、ゲームオブジェクト同士が衝突した時に生成される『Collisionクラス』の中のプロパティで、衝突した衝撃値が格納されています。

そして重要なのは、ゲーム開発において、『衝撃値』をどの様に使用するのかということです。

▼よく使用する2つのパターンを紹介しておきます

・衝撃値が基準値より高ければ、ゲームオブジェクトを削除する
・衝撃値が基準値より高ければ、効果音を鳴らす
こんな感じで、結構使えます(^^)

 

【impulse】を使用した実際のコード例

ここでは、衝撃値が基準値より高ければ、ゲームオブジェクトを破削除するという処理を紹介します。

unity sphereとplaneオブジェクトの画像

▼環境(上画像を参照)
①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)をパンッと弾いて、壁に当てる簡単な処理を紹介します。

unity scene画面 床と壁と玉

▼環境(上画像を参照)

①床(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』という関数です。

▼『AddForce』
ゲームオブジェクトにどの様に力を加えるかを設定出来る関数。
『Rigidbodyクラス』内で定義されている関数の1つです。
第一引数に、力をどの方向にいくら与えるかをVector3型で入れます。
第二引数に、力の与え方の種類を入れます。

つまり、【ForceMode.Impulse】というのは、基本的には、『AddForce関数』の第二引数に使用するものだということです。

力の与え方の種類(モード)を、ForceMode列挙型の中から自由に選べるようになっていて、その選択肢の一つが、記事本題の【Impulse】なのです

【Impulse】の他には、『Force』というのがあります。
【Impulse】が瞬間的に力を加えるのに対し、『Force』は継続的に力を加えるモードになります。

ナッツパパ
ナッツパパ

ForceMode.Forceと表現されますね。
これは初期値ですので、『AddForce』の第二引数に何も設定しなければこれになります。

 

そして、『AddForce関数』は、『Rigidbodyクラス』の中で定義されているので、呼び出す場合はまず、GetComponentを使用し、ゲームオブジェクトの『Rigidbodyクラス』を取得する必要があるのです。

その処理が、上のコードの18行目になりますね。

 

ナッツパパ
ナッツパパ

【Impulse】の解説は以上です(^^)
次の列挙型【Enumerations】の解説で最後になります。
知っているという人は飛ばして下さい!

 

【Enumerations】とは?

unity リファレンスからの引用画像 enumerations

※上の画像は、Unityのスクリプトリファレンスより引用した画像です。

【Enumerations】とは、『列挙型』の集まりのことです。

では『列挙型』とは何か。
本記事で紹介した、『ForceMode』も『列挙型』だといいました。

C#には、というよりあらゆるプログラミング言語でも『定数』という概念が存在します。
『定数』とは、変数の種類の1つで、中の値を変えることが出来ないという特徴を持っています。

Const 〇〇 と定義されているあれです。

変数の中身を固定したい場合などに、定数は便利です。

そして、その『定数』をたくさん保管することができるのが、『列挙型』です

ナッツパパ
ナッツパパ

『定数』の集まりが『列挙型』。
『列挙型』の集まりをUnityでは【Enumerations】と表現します。

C#では、enum 〇〇 で列挙型を作成することができます

ではなぜ、定数の集まりをわざわざ作るのか。

コードを綺麗に保つ為です。
PC内でも、カテゴリーごとにフォルダを作ってまとめておくと使いやすいのと同じです。
定数というのは開発において数多く作成します。
その定数をカテゴリーごとにまとめる役割が『列挙型』だと思って下さい。
万が一、定数の中身のコードを修正することになっても、『列挙型』内の定数を1か所修正すればいいだけなので、非常に楽です。

そして、同じカテゴリーの定数が綺麗にまとめられた『列挙型』というのは、関数の引数と相性が抜群に合います

『ForceMode』は、『AddForce関数』の第二引数として、Unity側が用意してくれている『列挙型』でした。

先でもでてきた、ForceMode.〇〇 とは、『列挙型』の中の好きな定数を選択してね、ということなんです。
【Impulse】と【Force】が簡単に選べたように、Unity側が、定数を綺麗に『列挙型』という名のフォルダーにまとめてくれているおかげです。

ナッツパパ
ナッツパパ

引数に使用するなら、変数の中の値を変えることはないので、定数をしようしているのです!

値の決まった定数の中から好きなものを選ぶだけで、ゲームオブジェクトの挙動を変えることが出来る。
『列挙型』便利です。

 

参考資料

最後に本記事作成の参考資料を紹介します。

▼Unityの公式スクリプトリファレンス。AddForce関数について

▼サムライエンジニアさん。enumについて。

 

【Enumerations】については、調べても全く出てこず。
これは、あくまでも私の考えをまとめたものですので、ご了承を。