예제 #1
0
        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);
                    }
                }
            });
        }
예제 #2
0
        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);
        }