Unity5: Есть ли идея написать код FadeIn / Out без Coroutine? - PullRequest
0 голосов
/ 23 января 2019

Я думаю сделать эффект FadeIn / Out с помощью C #.

// Итак, если есть такой код:

    float targetAlpha = 0.7f;
    Color targetColor = new Color();

    public void FadeIn() {
    if(color.a < targetAlpha) { color.a += Time.deltaTime; }
    sprite.color = targetColor;
    }

1) Я не хочу помещать FadeIn () в Update (), потому что я не часто использую эту функцию FadeIn ().

2) Я не хочу использовать Coroutine, потому что StartCoroutine () создает мусор. Я буду активировать / выключать этот объект очень часто.

3) Аниматор ... Нет пути, да?

Итак, я собираюсь сделать 1 событие, которое всегда будет работать с Update (), а затем я все помещу в это событие. (добавить, когда OnEnable (), удалить, когда OnDisable ())

Есть ли лучшее решение?

1 Ответ

0 голосов
/ 24 января 2019

Если вы не хотите помещать это в обновление, потому что оно не будет использоваться часто, возможно, вы можете рассмотреть подход конечного автомата.Я хотел бы рассмотреть это, только если производительность действительно важнее, чем читабельность.Поскольку этот подход добавит много дополнительного кода.

Для простоты приведенный ниже код является более подробным, чем должен быть.

public interface IState
{
    void Update();
}

public class FadeInState : IState
{
    private readonly float targetAlpha;
    private readonly Sprite sprite;
    private readonly Action onComplete;

    public FadeInState(Sprite sprite, float targetAlpha, Action onComplete)
    {
        this.targetAlpha = targetAlpha;
        this.sprite = sprite;
        this.onComplete = onComplete;
    }

    public void Update()
    {
        // Your fade-in code
        if (sprite.color.a < targetAlpha)
        {
            Color tmp = sprite.color;
            tmp.a += Time.deltaTime;
            sprite.color = tmp;
        }
        else
        {
            this.onComplete.Invoke();
        }
    }
}

public class FadeOutState : IState
{
    private readonly float targetAlpha;
    private readonly Sprite sprite;
    private readonly Action onComplete;

    public FadeOutState(Sprite sprite, float targetAlpha, Action onComplete)
    {
        this.targetAlpha = targetAlpha;
        this.sprite = sprite;
        this.onComplete = onComplete;
    }

    public void Update()
    {
        // Your fade-out code
        if (sprite.color.a > targetAlpha)
        {
            Color tmp = sprite.color;
            tmp.a -= Time.deltaTime;
            sprite.color = tmp;
        }
        else
        {
            this.onComplete.Invoke();
        }
    }
}

public class DoNothingState : IState
{
    public void Update()
    {
        // Do nothing
    }
}

public class YourClass : MonoBehaviour
{
    private IState currentState;

    void Awake()
    {
        this.currentState = new DoNothingState();
    }

    void Update()
    {
        this.currentState.Update();
    }

    public void FadeIn(Sprite sprite, float targetAlpha)
    {
        this.currentState = new FadeInState(sprite, targetAlpha,
            () =>
            {
                this.currentState = new DoNothingState();
            });
    }

    public void FadeOut(Sprite sprite, float targetAlpha)
    {
        this.currentState = new FadeOutState(sprite, targetAlpha,
            () =>
            {
                this.currentState = new DoNothingState();
            });
    }
}

Изначально ваш класс находится в состоянии DoNothing,Таким образом, обновление фактически ничего не даст.

Если кто-то позвонит FadeIn, ваш FadeInState будет выполнять логику замирания, как если бы он был в MonoBehaviour.Update().

. Состояние принимает действиев конструкторе, который выполняется, когда он закончен.Таким образом, вы можете контролировать то, что происходит после завершения анимации из YourClass.В этом примере я просто установил состояние на DoNothing, но вы, вероятно, можете отключить gameObject.

Если вы придерживаетесь этого подхода и начинаете использовать его для других целей, вам следует просто взглянуть на некоторые лучшие реализации StateMachine.,В противном случае вы в конечном итоге получите тонны государственных классов. Этот приличный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...