在Unity中,我有一个带有触发器的游戏对象。此触发器侦听enter,exit和stay事件。
执行事件时,将检查碰撞对象的特定接口组件。如果此接口组件不为null /已附加,则代码应从该接口组件调用方法。
目前我正在这样做
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
。
我将组件类型作为参数传递,并将组件作为out参数。
如何创建这样的方法?
答案 0 :(得分:2)
您可以像现有的GetComponent
方法一样创建通用扩展方法。
public static class ColliderExtensions
{
public static bool TryGetComponent<T>(this Collider collider, out T component) where T : class
{
component = collider.GetComponent<T>();
return component != null;
}
}
用法:
ILightAffectable component;
if (col.TryGetComponent(out component))
{
component.ExitLight();
}