Communication between interfaces and other components
As I understand it, one of the point of using interfaces is to allow flexibility in component implementations, so that a component on a gameobject can just do this to find the component that fires a weapon and the one that moves the object:
public override void Awake()
{
base.Awake();
moveComponent = GetComponent<IMove>();
fireComponent = GetComponent<IFire>();
}
This is nice, because I can then interchange different firing behaviours on the fly. However, this is used on my Player gameobject which has a property set up like this, which I use to hide the object and remove it from physics calculations when I display some messages on the screen (I don't want it to be destroyed, and I can't just disable the player with SetActive because the object handles its own respawning, lives left etc. ):
private bool _activeInScene;
public bool ActiveInScene
{
get
{
return _activeInScene;
}
set
{
_activeInScene = value;
// Following 3 are declared in base.Awake()
rend.enabled = value;
col.enabled = value;
rb.isKinematic = !value;
if (value)
{
EventManager.Instance.PlayerSpawned();
}
else
{
EventManager.Instance.PlayerDespawned();
}
Debug.Log("[SetActiveInScene] " + gameObject.name + " : " + value);
// Can't do this now:
// moveComponent.enabled = value;
// fireComponent.enabled = value;
}
}
Problem is, the two lines at the end don't work because they hold an interface, not a component. And I'd like to disable the IMove and IFire components (whichever ones are attached), so that the player can't fire or move when it's not "ActiveInScene". Does this mean I have to write specific "activate" methods for each implementation of both interfaces? There's probably a better solution... Thanks for your help.
Your answer

Follow this Question
Related Questions
Use of if(Component) 1 Answer
Making an object with a grid of very small blocks. 0 Answers
Problem with prefab 0 Answers
Components losing all references in inspector 3 Answers
Labels for components? 1 Answer