こんにちは。ラルトン(@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オブジェクトのTransformのScaleをX,Y,Zそれぞれ2としました。
これで、実行すると・・・
うまくいきました!
まとめ
いかがだったでしょうか。
今回の記事では、2Dの追従(ホーミング)する弾の作り方の紹介をしました。
今回のBulletにOnTriggerEnter2Dを使って、プレイヤーに当たったときに弾が消える、プレイヤーにダメージを与えるなどすると、さらにホーミング弾っぽくなると思います。
AddForceを使う以外にも実装方法があるので、ぜひ他の方法も探ってみてください。
© Unity Technologies Japan/UCL