В Unity у меня есть игровой объект с прикрепленным триггером.Этот триггер прослушивает события входа, выхода и пребывания.
Когда события выполняются, сталкивающийся объект проверяется на наличие определенного компонента интерфейса.Если этот компонент интерфейса не является нулевым / присоединен, код должен вызывать метод из компонента интерфейса.
В настоящее время я делаю это
public class LightSource : MonoBehaviour
{
private void OnTriggerEnter(Collider col)
{
HandleLight(col, LightAffectableAction.Enter);
}
private void OnTriggerExit(Collider col)
{
HandleLight(col, LightAffectableAction.Exit);
}
private void OnTriggerStay(Collider col)
{
HandleLight(col, LightAffectableAction.Stay);
}
private void HandleLight(Collider col, LightAffectableAction action)
{
ILightAffectable lightAffectable = col.GetComponent<ILightAffectable>();
if (lightAffectable != null) // Is the component attached?
{
switch (action)
{
case LightAffectableAction.Enter:
lightAffectable.EnterLight();
break;
case LightAffectableAction.Exit:
lightAffectable.ExitLight();
break;
case LightAffectableAction.Stay:
lightAffectable.StayInLight();
break;
}
}
}
private enum LightAffectableAction
{
Enter,
Exit,
Stay
}
}
, но мне действительно не нравится использовать переключательи перечисление.Возможно, несколько игровых объектов внутри триггера вызовут проблемы с производительностью.
Некоторые методы содержат параметр out
, и я подумал о создании чего-то подобного
public class LightSource : MonoBehaviour
{
private void OnTriggerEnter(Collider col)
{
if(col.TryGetComponent(ILightAffectable, out ILightAffectable comp)) // Pass in the component type
{
comp.EnterLight();
}
}
private void OnTriggerExit(Collider col)
{
if(col.TryGetComponent(ILightAffectable, out ILightAffectable comp))
{
comp.ExitLight();
}
}
private void OnTriggerStay(Collider col)
{
if(col.TryGetComponent(ILightAffectable, out ILightAffectable comp))
{
comp.StayInLight();
}
}
}
, но я не знаюкак создать метод расширения, такой как TryGetComponent
, который соответствует приведенному выше примеру кода.
Я передаю тип компонента в качестве параметра и получаю компонент в качестве выходного параметра.
Как я могусоздать такой метод?