написать собственный метод с параметром - PullRequest
0 голосов
/ 24 сентября 2018

В 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, который соответствует приведенному выше примеру кода.

Я передаю тип компонента в качестве параметра и получаю компонент в качестве выходного параметра.

Как я могусоздать такой метод?

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете создать общий метод расширения так же, как существующий метод 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...