You can use interfaces with the RequireComponent or RequiredInterface attribute. But when a GameObject has no Monobehaviour attached - which implements this interface - Unity error message only says: NullReferenceException: Object reference not set to an instance of an object.
Here’s an example:
EnemyBrain implementing IMoveInput interface:
using Character.Input;
using UnityEngine;
namespace Character.Enemy
{
public class EnemyBrain : MonoBehaviour, IMoveInput
{
[SerializeField] private Transform enemyTarget;
public Vector2 MoveVector { get; private set; }
private void Update()
{
ReadMoveVectorToTarget();
}
private void ReadMoveVectorToTarget()
{
var dir = enemyTarget.transform.position - transform.position;
MoveVector = dir.normalized;
}
}
}
ChaserEnemy which require an IMoveInput on the Gameobject:
using Character.Input;
using Character.Movement;
using UnityEngine;
namespace Character.Enemy
{
[RequireComponent(typeof(Rigidbody2DController))]
[RequireComponent(typeof(IMoveInput))]
public class ChaserEnemy : EnemyBase
{
[SerializeField] private float speed;
private Rigidbody2DController _rigidbodyController;
private IMoveInput _moveInput;
private void Awake()
{
_rigidbodyController = GetComponent<Rigidbody2DController>();
_moveInput = GetComponent<IMoveInput>();
}
private void FixedUpdate()
{
ChaseTarget();
}
private void ChaseTarget()
{
_rigidbodyController.Move(_moveInput.MoveVector * (speed * Time.fixedDeltaTime));
}
}
}
Full error message:
NullReferenceException: Object reference not set to an instance of an object
Character.Enemy.ChaserEnemy.ChaseTarget () (at Assets/Scripts/Character/Enemy/ChaserEnemy.cs:29)
Character.Enemy.ChaserEnemy.FixedUpdate () (at Assets/Scripts/Character/Enemy/ChaserEnemy.cs:24)