オブジェクトにRigidbodyコンポーネントを追加して、AddForceメソッドを使うとオブジェクトを遠くに飛ばすことができます。簡単なサンプルを作って確認してみます。
イメージ
シーンの準備
シーンに3D ObjectのPlaneとSphereを追加します。
飛ばす方向がイメージしやすいようにY軸に対してX軸が右側になるようにシーン視点を調整してください。(色は適当にマテリアルでつけました→マテリアルの使い方)
オブジェクトに物理運動させたい場合は、Rigidbodyを追加する必要があります。
今回は、SphereにRigidbodyを追加します。
Spereを選択してInspectorウインドウのAdd Componentボタンをクリックします。
Physics > Rigidbody を選択して追加します。
このまま実行するとSphereが落ちますが、今回は落下させることが目的ではないので床に置いた状態にしておきます。
Sphereを選択してInspectorウインドウのPosition項目の Yの値を0.5とすればいいでしょう。
飛ばしたときの床面積が狭いので、Planeを広くしておきます。
Planeを選択し、InspectorウインドウのScale項目 XとZをそれぞれ10として広げておきます。
ここまでの状態
シーンの準備はこれで完了です。
遠くに飛ばすスクリプトの作成
オブジェクトを遠くに飛ばすにはAddForceメソッドを使ったスクリプトを作って飛ばしたいオブジェクトにアタッチします。
まずはスクリプトの作成です。
Assetsフォルダで
右クリック > Create > C# Script を選択してください。
スクリプト名は、ObjectAddForce とします。
作成したObjectAddForceスクリプトをダブルクリックしてエディタを起動し、以下のスクリプトを記述してください。(今回はStartメソッドにのみ記述しています)
ObjectAddForce
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectAddForce : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// 遠くに飛ばす
Rigidbody rb = GetComponent<Rigidbody>();
Vector3 force = new Vector3(0.0f, 5.0f, 5.0f);
rb.AddForce(force, ForceMode.Impulse);
}
// Update is called once per frame
void Update()
{
}
}
作成したスクリプトはアタッチしないと実行できません。
今回はShereを遠くに飛ばしたいのでObjectAddForceスクリプトをSphereにドラッグ&ドロップしてアタッチします。
アタッチするとSphereのInspectorウインドウにObject Add Force(Script)として追加されます。
実行確認
実行するとSphereが画面奥に向かって飛んでいくのが分かります。
あんまり遠くに飛んでいきませんね。
少しパワーが無いのでスクリプトを調整します。
今回飛んでいく方向を設定している部分は、UnityのVector3型を使いforceという変数名で指定しています。
Vector3 force = new Vector3( X軸方向への力, Y軸方向への力, Z軸方向への力 );
スクリプトではY軸とZ軸方向に力を加えています。
Vector3 force = new Vector3( 0.0f, 5.0f, 5.0f );
Y方向は上に向かう力、Z方向は奥に向かう力と考えると真横から見た飛んでいく方向はこんな感じです。
もっと遠くに高く飛ばしたいなら以下のように数値を大きくしてみてください。(数値の後に f をつけるようにしてください。Y軸とZ軸が同じ数値でなくても大丈夫です)
Vector3 force = new Vector3( 0.0f, 10.0f, 10.0f );
イメージ
遠くに飛んでいくようになりました。
ちなみにX軸方向をプラスの値にすると右側に、マイナスにすると左側に飛んでいきます。
例
Vector3 force = new Vector3( -5.0f, 10.0f, 10.0f );
色々と値を変えて試してみてください。
AddForceメソッドについて
RigidbodyオブジェクトのAddForceメソッドは、第1引数が力を加える方向、第2引数がどのように力を加えるか?(モード指定)となります。
今回のスクリプトは、第2引数をImpulseとしています。
Impulseは、ボールをバットで打った感じと表現すれば分かりやすいです。ある方向(第1引数のVector3)に一瞬だけ力を加えた感じです。
第2引数のモード指定は、以下のようにForceModeとして定義されていますが、正直なところマニュアルを見ても分かりにくいです。(Impulseが一番個人的には動作が分かりやすかったです)
ForceMode
Force | 質量を使用して、リジッドボディへ継続的な力を加えます。 |
Acceleration | その質量を無視して、リジッドボディへ継続的な加速を追加します。 |
Impulse | その質量を使用し、リジッドボディにインスタントフォースインパルスを追加します。 |
VelocityChange | 質量を無視して、リジッドボディにインスタント速度変化を追加します。 |
例えばこんな風に使います。
rb.AddForce(force, ForceMode.Acceleration);
第2引数も色々と試してみてください。
以上、Unity:オブジェクトを遠くに飛ばすでした。
コメント