使用参数out

时间:2018-09-24 09:07:50

标签: c# unity3d

在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参数。

如何创建这样的方法?

1 个答案:

答案 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();
}