オブジェクトを吸い込めるようにする

オブジェクトを吸い込めるようにする_アイキャッチ
目次

はじめに

カービィなどでよく見る吸い込み、アイテムをゲットしたときにプレイヤーに向かって吸い込まれる演出などを実装したいと思い、今回はプレイヤーがオブジェクトを吸い込むような動きを実装していきたいと思います。

これを参考にすればアイテムがプレイヤーに吸い込まれるような動きも作ることができます。

この記事ではプレイヤーの操作などに関しての解説は予定しておらず、吸い込まれるオブジェクトの動きを実装する方法を解説するのみとなります。時間に余裕ができたらもう少し詳しくまとめ直そうと思います。

シーンにオブジェクトを設置する

まずはプレイヤーと吸い込むオブジェクトを設置します。

吸い込めるオブジェクト(Cube)には物理挙動を使うのでRigidbodyコンポーネントをアタッチしましょう。

シーンにオブジェクト設置

吸い込めるオブジェクトにスクリプトをアタッチする

オブジェクトを設置できたらスクリプトを作成しましょう。

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

/// <summary>
/// 吸い込み可能オブジェクト
/// </summary>
[RequireComponent(typeof(Rigidbody))]
public class InholeObject : MonoBehaviour
{
    public bool _isInhole = false;
    private Rigidbody _rb;
    [SerializeField]
    private Transform _playerPos;

    public float _accel;

    // Start is called before the first frame update
    void Start()
    {
        _rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if(_isInhole == true)
        {
            _accel += 0.1f;
            _rb.AddForce((_playerPos.position - transform.position).normalized * _accel, ForceMode.Force);
        }
    }
}

このスクリプトのポイントとしては、以下の3つです。

  1. RigidbodyをGetComponentで必ず取得するようにしているので、つけ忘れても大丈夫なようにクラス名の上にRequireComponent(typeof(Rigidbody))をつけておく。(これでRigidbodyを付け忘れてもこのスクリプトを付けた際に自動で追加してくれます。)
  2. 吸い込める状態になったら加速度を徐々に増やす。
  3. P2-P1(プレイヤーの座標ー自分の座標)でプレイヤーのいる方向を計算し、AddForce関数でその方向に向かって力が加わるようにしています。

上記のスクリプトをコピーして作成したら、なんでもいいので吸い込めるオブジェクトにアタッチして実行してみましょう。ボタンを押したら吸い込めるようにはしていないので先程のスクリプトをアタッチしたオブジェクト(Cube)のインスペクターからIs Inhole変数のチェックをtrueにして確認してみてください。

動かない場合はシリアライズした変数に情報が設定されていない可能性があります。プレイヤーのトランスフォームと加速度を設定してみてください。加速度の初期値は20~30ぐらいを目安にするといいと思います。

まとめ

想像通りの動きになったでしょうか?今はエフェクトも効果音もないですが、実際に作成して付け足してみるとよりそれっぽくなるのではないかと思います。

よかったらシェアしてね!
目次