IEnumerator MoveStage(int targetStepIndex) { FireSystemStep targetStep = Steps[targetStepIndex]; float time = Time.time - _startTime; SendStateDataToClients(_startTime + targetStep.StartTime, _startTime + targetStep.OverallStageTime, ZoneState.Movihg); float fromScale = transform.localScale.x; while (time <= targetStep.OverallStageTime) { var normalizedTime = Mathf.Clamp01((time - targetStep.StartTime) / targetStep.Duration); var scaleToSet = Mathf.Lerp(fromScale, targetStep.Scale, normalizedTime); if (transform.localScale.x != scaleToSet) { transform.localScale = new Vector3(scaleToSet, transform.localScale.y, scaleToSet); RpcSetScale(scaleToSet); } yield return(null); time = Time.time - _startTime; } transform.localScale = new Vector3(targetStep.Scale, transform.localScale.y, targetStep.Scale); RpcSetScale(targetStep.Scale); StartNextStep(); }
IEnumerator WaitStage(int targetStepIndex) { FireSystemStep targetStep = Steps[targetStepIndex]; float time = Time.time - _startTime; //to do спорно мб переписить var delay = targetStep.StartTime; if (targetStepIndex > 0) { delay -= Steps[targetStepIndex - 1].OverallStageTime; } SendStateDataToClients(_startStepTime, _startStepTime + delay, ZoneState.Wait); bool shouldDoAnnounce = true; while (time < targetStep.StartTime) { if (shouldDoAnnounce && targetStep.StartTime <= time + AnnounceInterval) { AnnounceFire(); shouldDoAnnounce = false; } yield return(new WaitForSecondsRealtime(0.5f)); time = Time.time - _startTime; } StartCoroutine(MoveStage(targetStepIndex)); }