I've created an abstract class called PlayerComponent
for all components that need to interact with my PlayerController
to inherit from. This class holds the reference to the PlayerController
, the Player
(responsible for input), and I wanted to add a bit of functionality by setting up a method to trigger when the PlayerController
"lands" on the ground.
public abstract class PlayerComponent : MonoBehaviour
{
protected static PlayerController playerController;
protected Player player; //the Rewired player
protected void Start()
{
player = ReInput.players.GetPlayer(0);
if (playerController == null)
playerController = FindObjectOfType<PlayerController>();
playerController.onLanding.AddListener(OnPlayerLanding);
}
public abstract void OnPlayerLanding();
}
In Start()
, I subscribe an abstract method to the UnityEvent
that the PlayerController
invokes upon landing. It works great and I quite like how I've structured this, but in practice, I ended up creating some PlayerComponent
s that don't need the OnPlayerLanding
method at all. Since its an abstract method, these PlayerComponent
s are required to have this blank method sitting there, and possibly taking up resources by being invoked (idk if that's even true, is it?). Is there a best practice for how I can make this method optional? Should I make an additional class to act in between the 2 which is responsible for making the Landing calls, and have only the components that require it inherit from it? I'm a little out of my comfort zone but trying to learn how to do this nice and tidy.
Make method by virtual, and override it for need in heir.
public abstract class SomeClass : MonoBehaviour
{
public virtual void Start()
{
// Base code
}
public virtual void Mehtod()
{
//
}
}
Make Start() virtual too. To call the method where necessary, override Start()
with the base implementation and complete the subscription
public abstract class SomeHeir : SomeClass
{
protected static PlayerController playerController;
public override void Start()
{
base.Start();
playerController.onLanding.AddListener(OnPlayerLanding);
}
}
You can virtualize all MonoBenaviour methods