Unityでモンキーハンティングをシュミレーション①

この記事は約6分で読めます。

こういう人におすすめの内容です!

  • Unityを使いたいけれど何から始めていいのかわからない
  • Unityの使い方をなんとなく知りたい
  • 高校物理の内容でシュミレーション をしてみたい

モンキーハンティングとは(高校物理)

高さhから小球を自由落下させると同時に、原点から初速vで弾丸を発射する。

という問題です。この手の問題では必ず

弾丸が物体に必ず命中する条件を答えよ。

という設問が入ります。答えは$$\tan \theta= \frac{h}{l}$$ ですが、簡単にいうと、命中させたい小球に向かって弾丸を発射させる。ということです。この条件は後でプログラミングする時に重要な情報になるので覚えていてください。

細かいことを言うと、小球が落下するまでに弾丸が当たる必要があります。この条件を満たせば、必ず弾丸は小球に命中します。
なぜ「モンキーハンティング」と呼ばれるか?
それは、銃口を木の上にいる猿に向けて弾丸を発射し、音にびっくりした猿は木から落ちるが、弾丸は猿に命中してしまう。という状況から名付けられています。

Unityで、新しいプロジェクトを作る

Unityをまだインストールしていない人は、下の記事を参考にしてください。

それでは、新しいプロジェクトを作成します。プロジェクト→新規作成をクリックします。

プロジェクト名をMonkeyHuntingとして、作成と進みます。

このような画面が作成されたと思います。

右上のDefaultをクリックし、Tallに変更します。

GameObjectを作成する

GameObject → 3D Object → Sphere を2つ作成し、Hierarchyから、名前を「Projectile」と「Monkey」とする。また、同様にGameObject → 3D Object → Planeを作成する。

Hierarchyからそれぞれのオブジェクトの位置や大きさ(InspectorのTransform)を以下の値に設定する。

Monkey
Projectile
Plane

ついでに、カメラ(Main Camera)の位置も次のように設定してみてください。

カメラの表示画面、もしくは再生ボタンを押した時の画面が次のようになっていたら、OKです。

注意!!

再生画面のまま次の行程に進まないでください。設定が保存されません。再生ボタンをもう一度クリックし、必ず編集画面に切り替えてください。

GameObjectに重力の効果を加える

  1. Monkeyを選択する
  2. Add ComponentからRigidbodyを選択する
  3. Rigidbody内のUse Gravityにチェックが入っていることを確認する

この状態で、再生すると、Monkeyが落下してきます。同様にして、ProjectileにもRigidbodyをコンポーネントに追加しておいてください。

発射体(Projectile)に初速を与えるプログラムを書く

次にProject → Asset を右クリックし、Create → C#Scriptを選択する。

作成されたScript の名前を「Firing」とする。このC#ScriptをHierarchyの「Projectile」にアタッチする。※アタッチとは、「Firing」Scriptを「Projectile」にドラックアンドドロップすることを指す。

「Firing」Scriptを開き、以下のプログラムをかく。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Firing : MonoBehaviour //Firing(発射)というC♯スクリプトをつくる
{
    public Transform target; // target(Monkey)の位置を取得するために必要
    public float v0 = 10.0f; //初速の初期値
    private Vector3 monkeyDir; // 初速の向きを指定するベクトルを定義

    void Start()
    {
        monkeyDir = target.position - this.GetComponent<Transform>().position;
        // targetDir=(ターゲットの位置ベクトル)-(発射物の位置ベクトル)
        monkeyDir.Normalize(); //targetDirを正規化する(ベクトルの大きさを1にする)

        this.GetComponent<Rigidbody>().AddForce(v0 * monkeyDir, ForceMode.VelocityChange);
        //発射体に大きさv0で、monkeyの方向に初速を与える
    }

    // Update is called once per frame
    void Update()
    {

    }
}

Projectileを選択すると、InspectorのコンポーネントにFiring(Script)が追加されていることが確認できます。TargetにはNone(Transform)となっていますが、ここにMonkeyを割り当てる必要があります。右の小さな◉をクリックし、Monkeyを選択します。

TargetにMonkey(Transform)と表示されているのを確認してください。
これで、すべての設定が終了しました。

再生してみる

Unityの画面上にある再生ボタンをクリックすると、シュミレーション が開始されると思いますが、発射体がモンキーに届かなかったのではないでしょうか。

発射体の初速を変更してみたいと思います。

上の画像の「v0」は「10」となっていますが、ここを「30」に変えてみましょう。すると、発射体は見事モンキーに命中したと思います。初速はモンキーに届けば、必ず命中するはずなので、いろんな初速で遊んでみてください。

衝突した時に、2つの球は一体となって進んだと思いますが、反発係数を指定することによって、跳ね返らせることもできます。これは、運動量を学習させる時にもかなり使えると思いますので、別で記事を作成します!

また、モンキーハンティングの問題では、モンキーからみた発射体の速度(相対速度)を問われることもあり、『イメージが湧かない』と悩む人も多いと思います。そのため、カメラをモンキーと一緒に移動させる、

余談ですが、Unityを学習する時には、本を使われることをお勧めします。僕もいろんなブログを見させていただきながら学習しましたが、どうしてもどのブログにどんな内容が書いてあったのか忘れてしまいます。そのため、必要な情報が整理された本を一冊持っておき、わからないことはブログなどで検索する方法のほうが、不安なく学習することができます。いろんなことが検索できる時代だからこそ、本がおすすめです!!初心者におすすめの本を載せておきますので、興味のある方はぜひ!

コメント

タイトルとURLをコピーしました