目次
はじめに
今回はプレイヤーがオブジェクトを吸い込むような動きを実装していきたいと思います。
この記事ではプレイヤーの操作などに関しての解説は予定しておらず、吸い込まれるオブジェクトの動きを実装する方法を解説するのみとなります。時間に余裕ができたらもう少し詳しくまとめ直そうと思います。
シーンにオブジェクトを設置する
まずはプレイヤーと吸い込むオブジェクトを設置します。吸い込めるオブジェクト(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);
}
}
}
このスクリプトのポイントとしては、
- RigidbodyをGetComponentしているので万が一、Rigidbodyをつけ忘れても大丈夫なようにRequireComponent(typeof(Rigidbody))をつけておく。
- そして吸い込める状態になったら加速度を増やす。
- AddForce関数を使用してP2-P1(プレイヤーの座標ー自分の座標)でプレイヤーの方向に向かって力が加わるようにしています。
スクリプトが作成できたら吸い込めるオブジェクトにアタッチして実行してみましょう。今回はボタンを押したら吸い込めるようにしていないのでアタッチしたオブジェクト(今回はCube)のインスペクターから
動かない場合はプレイヤーの座標と加速度をインスペクターから設定してください。加速度は初期値20~30ぐらいがいいと思います。
まとめ
いかがでしたか?想像通りの動きになったでしょうか?今はエフェクトも効果音もなにもないので実際に作成して付け足してみるとよりそれっぽくなるのではないかと思います。