Вы можете использовать простой флаг bool
, чтобы остановить выполнение Update
(или, по крайней мере, немедленно вернуться), пока не завершится Coroutines sh.
Также я бы использовал перечисление для отличия между сторонами и реализовать код только один раз в зависимости от стороны.
Кстати, вместо ==
вместо этого используйте CompareTag
, который является более безопасным и предотвращает сбои при опечатках.
private enum Side
{
Left,
Right
}
private bool IsAfterRun;
private void Update()
{
if(IsAfterRun) return;
if (Physics.Raycast(transform.position, transform.right, out hitR, 1))
{
if (hitR.transform.CompareTag("Wall"))
{
StartCoroutine(afterRun());
}
}
// Additionally use else here
// so this second Raycast is only done if the first one fails
else if (Physics.Raycast(transform.position, -transform.right, out hitL, 1))
{
if (hitL.transform.CompareTag("Wall"))
{
StartCoroutine(afterRun(Side.Left));
}
}
}
private IEnumerator afterRun(Side side)
{
// Just to be sure block concurrent routines
if(IsAfterRun) yield break;
IsAfterRun = true;
isWallR = side == Side.Right;
isWallL = side == Side.Left;
jumpCount += 1;
rb.useGravity = false;
playerCamera.transform.Rotate(new Vector3(0.0f, 0.0f, 12.5f * (side == Side.Right ? 1 : -1));
// Your routine
....
// in the end reset your values
rb.useGravity = false;
playerCamera.transform.Rotate(new Vector3(0.0f, 0.0f, 12.5f * (side == Side.Right ? -1 : 1));
isWallR = false;
isWallL = false;
IsAfterRun = false;
}