Если вы не хотите помещать это в обновление, потому что оно не будет использоваться часто, возможно, вы можете рассмотреть подход конечного автомата.Я хотел бы рассмотреть это, только если производительность действительно важнее, чем читабельность.Поскольку этот подход добавит много дополнительного кода.
Для простоты приведенный ниже код является более подробным, чем должен быть.
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.,В противном случае вы в конечном итоге получите тонны государственных классов. Этот приличный.