Unity(ゲーム制作)

【Unity】追従(ホーミング)する弾の作り方(2D)

Unity-追従(ホーミング)する弾の作り方-アイキャッチ

こんにちは。ラルトン(@raruton_blog)です。

この記事では、AddForceを使った、追従(ホーミング)する弾の作り方を紹介します。

このgifの黄緑色の弾を作ります。

もちろん、速さは調整可能です。

考え方

(プレイヤーのposition) - (弾のposition) をすることで、弾からプレイヤーに向く方向を出します。

これをnormalizedで正規化することで、方向を保ったままで長さを1にします。

これにBulletSpeedというfloat型の値を掛けて長さだけを変えて、AddForceで力を加えます。

また、速くなりすぎることを防ぐために、Mathf.Clampを使って速さを制御します。

実装方法

元となるGamaObjectを生成する

Hierarchyウィンドウで

2D Object > Sprite New Spriteオブジェクトを生成します。

New Spriteオブジェクトの名前を “Bullet” としました。

BulletオブジェクトSprite RendererコンポーネントSpriteに任意のSpriteを選択します。(今回はKnobにしました。)

今回は弾を見やすくするために、

BulletオブジェクトSprite RendererコンポーネントColor黄緑色にしました。

必要なコンポーネントを付与する

BulletオブジェクトCircle Collider 2DコンポーネントRigidbody 2Dコンポーネントの2つを追加します。

スクリプトを書く

Projectウィンドウで

Create > C# Script

名前を”BulletMover”としてC#スクリプトを生成します。

このBulletMoverスクリプトに以下の様に記述します。

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

public class BulletMover : MonoBehaviour
{
    [SerializeField] private Transform playerTrans; //追いかける対象のTransform
    [SerializeField] private float bulletSpeed;    //弾の速度
    [SerializeField] private float limitSpeed;      //弾の制限速度
    private Rigidbody2D rb;                         //弾のRigidbody2D
    private Transform bulletTrans;                  //弾のTransform

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        bulletTrans = GetComponent<Transform>();
    }

    private void FixedUpdate()
    {
        Vector3 vector3 = playerTrans.position - bulletTrans.position;  //弾から追いかける対象への方向を計算
        rb.AddForce(vector3.normalized * bulletSpeed);                  //方向の長さを1に正規化、任意の力をAddForceで加える

        float speedXTemp = Mathf.Clamp(rb.velocity.x, -limitSpeed, limitSpeed); //X方向の速度を制限
        float speedYTemp = Mathf.Clamp(rb.velocity.y, -limitSpeed, limitSpeed);  //Y方向の速度を制限
        rb.velocity = new Vector3(speedXTemp, speedYTemp);           //実際に制限した値を代入
    }
}

 

このように記述出来たら、

BulletMoverスクリプトBulletオブジェクト

ドラッグ&ドロップをして

BulletMoverコンポーネントを追加します。

コンポーネントの値をいじる

BulletオブジェクトBulletMoverコンポーネントPlayer Transには、

追従されるオブジェクトのTransformを入れます(今回は事前に作成したPlayerオブジェクトを入れました)。

Bullet Speedには、弾の速さを入れます(今回は15としました)。

Limit Speedには、弾の制限速度を入れます(今回は5としました)。

BulletオブジェクトCircle Collider 2DコンポーネントisTriggerのチェックをオンにします。

BulletオブジェクトRigidbody 2DコンポーネントGravity Scaleを0にします。

Bulletオブジェクトの大きさが小さく感じたので、

BulletオブジェクトTransformScaleをX,Y,Zそれぞれ2としました。

 

これで、実行すると・・・

うまくいきました!

 

まとめ

いかがだったでしょうか。

今回の記事では、2Dの追従(ホーミング)する弾の作り方の紹介をしました。

今回のBulletにOnTriggerEnter2Dを使って、プレイヤーに当たったときに弾が消える、プレイヤーにダメージを与えるなどすると、さらにホーミング弾っぽくなると思います。

AddForceを使う以外にも実装方法があるので、ぜひ他の方法も探ってみてください。

 

© Unity Technologies Japan/UCL