😀

【Unity】プレイヤーに引き寄せられるアイテムや誘導弾の作り方

2022/06/04に公開

概要

コスモプレイヤーZというゲームで使用した、添付Gifのように地面に落ちているアイテムがプレイヤーに近づいて消える処理の作り方を紹介します。

サンプルコード

以下にサンプルコードを貼っておきます。
もしわからない点がありましたら気軽に聞いてください。

CollectObject.cs
using UnityEngine;

/// <summary>
/// 特定のタイミングでプレイヤーを追従して特定範囲に近づいたら消えるオブジェクト
/// </summary>
public class CollectObject : MonoBehaviour
{
    [SerializeField]
    private GameObject _playerObject = null;

    //回収開始を呼んでからすぐに動き出すのを避ける
    [SerializeField]
    private float _delayTimer = 0.5f;

    //何かしらの不具合で消えない場合に備えて回収にかかる最大の時間を設定しておく
    [SerializeField]
    private float _maxTimer = 10.0f;

    //回収の速度
    [SerializeField]
    private float _speed = 0.4f;

    //プレイヤーにどの程度近づいたら回収したことにするか
    [SerializeField]
    private float _collectDistance = 0.3f;

    private float _timer = 0.0f;
    private bool _isCollect = false;

    private void Start()
    {
        //初手は非表示にしておく
        this.gameObject.SetActive(false);
    }

    private void Update()
    {
        if(!_isCollect)
        {
            return;
        }

        _timer += Time.deltaTime;
        if(_timer < _delayTimer)
        {
            return;
        }
        //回収の最大時間を超えていないかチェック
        else if(_timer > _maxTimer)
        {
            FinishCollect();
            return;
        }

        //プレイヤーに向かって進ませる
        transform.position = Vector3.MoveTowards(transform.position, _playerObject.transform.position, _speed);

        //特定の距離まで近づいたら回収完了
        var diff = _playerObject.transform.position - transform.position;
        if(diff.magnitude < _collectDistance)
        {
            FinishCollect();
        }
    }

    /// <summary>
    /// オブジェクトを出現させる
    /// </summary>
    public void Drop()
    {
        this.gameObject.SetActive(true);
    }

    /// <summary>
    /// 回収を開始する
    /// </summary>
    public void Collect()
    {
        _timer = 0.0f;
        _isCollect = true;

        //念のため見える状態にしておく
        Drop();
    }

    /// <summary>
    /// 回収を完了させる
    /// </summary>
    public void FinishCollect()
    {
        _isCollect = false;
        this.gameObject.SetActive(false);
	
	//もし回収完了のタイミングで処理をしたい場合はここに処理を追加する
    }
}

サンプルコードの使い方

添付画像のようにオブジェクトに上記のサンプルコードを貼り、基準とするオブジェクトをPlayerObjectに設定してください。
その他のパラメータも使いたい形に変更し、アイテムの出現タイミングでDrop()を、アイテムの回収を開始したいタイミングでCollect()を呼んでください。

また、回収を完了したときに何かしら処理を行いたい場合はFinishCollect()に処理を追加すればOKです。

補足

今回のサンプルコードはコスモプレイヤーZで実際に使用したものから汎用的に使えるように書き換えたものになります。
実際に使う際には、このアイテムは大量に落ちるので処理負荷削減を目的として、生成しておいたものを使いまわすような形で使用しています。
もしそういった処理負荷削減や使いまわしに関して興味のある方がいましたら記事を作成しますのでコメントをいただけると嬉しいです。

コスモプレイヤーZについて

お着替えシューティングアクションゲームのカジュアルアクションゲームです!
iOS,Android,Steam,Switchで配信中ですので興味を持った方は触ってみてください。
(iOS、Androidは無料です!)

https://www.sommitgames.page/
Switch版ページはこちら
https://store-jp.nintendo.com/list/software/70010000052830.html

Discussion