private void Start() { _curMainColor = MainColor; _curIdleColor = IdleColor; Shader.SetGlobalFloat("_MIN", 1f); Shader.SetGlobalFloat("_MAX", ZCube.MaxHeight); Shader.SetGlobalColor("_MAIN", _curMainColor); Shader.SetGlobalColor("_IDLE", _curIdleColor); Application.targetFrameRate = 60; Tile(); Vector3 pos = Vector3.zero; MessageBroker.Default.Receive <GameStateChangeEvent>().Subscribe(ev => { if (ev.State == GameState.AwaitingTransmission) { SetUserCube(GameCore.Instance.Player.transform.position); if (_tweeners != null) { foreach (var tweener in _tweeners) { tweener.Kill(true); } Update(); } } else if (ev.State == GameState.Transmitting) { pos = GameCore.Instance.Player.transform.position; var playerDistance = _cubeParent.transform.InverseTransformPoint(pos).magnitude * 2f; _tweeners = new Tweener[Cubes.Count]; for (var i = 0; i < Cubes.Count; i++) { var cube = Cubes[i]; if (cube.Type == ZCubeType.Goal || cube.Type == ZCubeType.Player) { continue; } //var y = cube.transform.localScale.y; var dist = Vector3.Distance(cube.transform.position, pos); _tweeners[i] = cube.transform.DOScaleY(dist < 1.5f ? ZCube.MaxHeight : 1f, Mathf.Min(GameCore.TransmissionDuration - 0.1f, GameCore.TransmissionDuration * (1f - dist / playerDistance))).SetEase(Ease.InOutSine); } } else if (ev.State == GameState.GameOver) { _tweeners = new Tweener[Cubes.Count]; for (var i = 0; i < Cubes.Count; i++) { var cube = Cubes[i]; //if (cube.Type == ZCubeType.Player) //{ // continue; //} var dist = Vector3.Distance(cube.transform.position, pos); _tweeners[i] = cube.transform.DOScaleY(1f, GameCore.TransmissionDuration * dist / 5f).SetEase(Ease.InOutSine); } } else if (ev.State == GameState.LevelCompleted) { Update(); _tweeners = new Tweener[Cubes.Count]; for (var i = 0; i < Cubes.Count; i++) { var cube = Cubes[i]; var dist = Vector3.Distance(cube.transform.position, pos); //if (cube.Type == ZCubeType.Player || cube.Type == ZCubeType.Player) //{ // continue; //} _tweeners[i] = cube.transform.DOScaleY(1f, GameCore.TransmissionDuration * dist).SetEase(Ease.InOutSine); } } }); }
private void Update() { var level = GameCore.Instance.Player.Level; var globalTime = Time.time; var curSpeed = (Speed + level * 0.25f) * GameCore.Instance.GetSonarSpeedMultiplier(); var state = GameCore.Instance.State; var newIdle = Vector4.MoveTowards(_curIdleColor, state == GameState.Transmitting ? Color.black : IdleColor, Time.deltaTime * 2f); if (Vector4.Distance(newIdle, _curIdleColor) > 0.001f) { _curIdleColor = newIdle; Shader.SetGlobalColor("_IDLE", _curIdleColor); } if (state == GameState.AwaitingTransmission) { if (Timer < TimerLimit * (Speed / curSpeed)) { Timer += Time.deltaTime; } else if (state != GameState.LevelCompleted) { GameCore.Instance.State = GameState.GameOver; } GameCore.Instance.RemainingTime -= Time.deltaTime; if (GameCore.Instance.RemainingTime <= 0f) { GameCore.Instance.State = GameState.GameOver; } } else if (state != GameState.LevelCompleted && state != GameState.Menu) { return; } // ReSharper disable once TooWideLocalVariableScope float height; foreach (var cube in Cubes) { height = 1f - Mathf.PerlinNoise(cube.LocalPos.x * 0.5f + globalTime, cube.LocalPos.z * 0.5f + globalTime); if (cube.Type == ZCubeType.Player && state != GameState.Menu) { height = ZCube.MaxHeight * (1f - Timer / TimerLimit); } else if (cube.Type == ZCubeType.Goal) { height = ZCube.MaxHeight; } else { if (state == GameState.AwaitingTransmission) { height = CalculateHeight(cube.RadialDistance, Timer, curSpeed, RingWidth, height, ZCube.MaxHeight); } } cube.transform.localScale = new Vector3(1f, height, 1f); } var remainingTime = GameCore.Instance.RemainingTime; var prog = Mathf.Pow(15f - remainingTime, 2) * 0.25f; while (prog > 2f) { prog -= 2f; } _curMainColor = remainingTime < 15f ? (Color)Vector4.MoveTowards(MainColor, WarningBlinkColor, prog > 1f ? 2f - prog : prog) : MainColor; Shader.SetGlobalColor("_MAIN", _curMainColor); }