Unity|自動でRigidbodyなどのコンポーネントを追加する(アタッチ忘れ防止)

今回はUnityで「RequireComponentを使って、Rigidbodyを自動追加」するメモです。

Rigidbodyに限らずスクリプトやAnimatorなどのコンポーネントも同様に利用できます。

どんな時に使えるのか

例えば、PlayerオブジェクトにRigidbodyをアタッチし忘れてスクリプトで操作すると、下記エラーが出てきます。

MissingComponentException: There is no 'Rigidbody' attached to the "Player" game object, but a script is trying to access it.
You probably need to add a Rigidbody to the game object "Player". Or your script needs to check if the component is attached before using it.

Rigidbodyをつけ忘れたな。ってことでAddComponentからRigidbodyを追加すれば解決するのですが、多くのオブジェクトにアタッチ予定のスクリプトの場合、Rigidbodyを忘れがちになる事も。

RequireComponent

そんな時は下記の様にスクリプトに「RequireComponent(typeof(Rigidbody))」を記載しておきます。

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

[RequireComponent(typeof(Rigidbody))]
public class PlayerMovement : MonoBehaviour
{
    [SerializeField] private float PlayerSpeed;
    private Rigidbody _rigidbody;
    private Vector3 movement;

    void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
    }
    void OnMove(InputValue movementValue)
    {
        Vector2 movementVector = movementValue.Get<Vector2>();
        movement = new Vector3(movementVector.x, 0.0f, movementVector.y);
    }
    void Update()
    {
        _rigidbody.velocity = movement * PlayerSpeed;
    }
}

すると、Rigidbodyをアタッチ忘れたオブジェクトに自動で作成してくれます。下記の様にメッセージで教えてくれます。

Creating missing Rigidbody component for PlayerMovement in Player.

また、スクリプトをアタッチした状態でRigidbodyコンポーネントをRemove(削除)しようとすると下記のメッセージが出て削除ができなくなり、ミスで削除防止にもなります。

スクリプト内でプロパティの設定をしてもOKなので設定忘れも防止できるかも。

    void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
        _rigidbody.constraints = RigidbodyConstraints.FreezeRotation;
    }

下のような感じで自動で作成されます。

「FreezePosition」と「FreezeRotation」の2つ設定したい場合は、下記の様な感じに。

    void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
        _rigidbody.constraints = RigidbodyConstraints.FreezePositionY|
            RigidbodyConstraints.FreezeRotation;
    }

Rigidbodyの軸コントロールは下記のスクリプトリファレンスが参考になるかも

スクリプトや、Animatorとかも下記のような感じに追加できます。

[RequireComponent(typeof(Player))]
[RequireComponent(typeof(Animator))]

エラー防止にはなるけど、エラーでしっかり出て欲しい人もいると思うので、実際に使えるのかってのは人によるのかも。

タイトルとURLをコピーしました