Example #1
0
 public void Init()
 {
     _totalSeconds      = daySeconds + nightSeconds + morningSeconds + eveningSeconds;
     _increaseTimeArray = new float[] { morningSeconds, morningSeconds + daySeconds, _totalSeconds - nightSeconds, _totalSeconds };
     _slotArray         = new DayTimeSlot[] { DayTimeSlot.Morning, DayTimeSlot.Day, DayTimeSlot.Evening, DayTimeSlot.Night };
     _timeArray         = new float[] { morningSeconds, daySeconds, eveningSeconds, nightSeconds };
 }
Example #2
0
        private void Refresh()
        {
            float          oneCycleElapsedTime = _time % _totalCycleTime;
            int            cycles = (int)(_time / _totalCycleTime);
            int            daysPerCycle;
            TimeSlotConfig config;
            float          oneDayElapsedTime;

            if (oneCycleElapsedTime < _totalNormalCycleTime)
            {
                _isSpecialTime    = false;
                config            = normalTimeConfig;
                oneDayElapsedTime = oneCycleElapsedTime % config.TotalSeconds;
                daysPerCycle      = (int)(oneCycleElapsedTime / config.TotalSeconds) + 1;
            }
            else
            {
                _isSpecialTime    = true;
                config            = specialTimeConfig;
                oneDayElapsedTime = oneCycleElapsedTime - _totalNormalCycleTime;
                daysPerCycle      = normalTimeCycles + 1;
            }
            _days = cycles * (normalTimeCycles + 1) + daysPerCycle;
            DayTimeSlot curDayTimeSlot = config.GetSlot(oneDayElapsedTime, out _slotElapsedTime, out _slotTime);

            ChangeSlot(curDayTimeSlot);
        }
Example #3
0
        private void UpdateLightAndSun()
        {
            DayTimeSlot slot = DayNightTime.Instance.TimeSlot;

            SkyLightScaleParam skyLight;
            SphereMoveParam    sunNormalMove;
            SphereMoveParam    sunSpecialMove;

            switch (slot)
            {
            case DayTimeSlot.Day:
                skyLight       = skyBoxParams.skyParam.dayLight;
                sunNormalMove  = skyBoxParams.sunNormalParam.dayAngle;
                sunSpecialMove = skyBoxParams.sunSpecialParam.dayAngle;
                break;

            case DayTimeSlot.Evening:
                skyLight       = skyBoxParams.skyParam.eveningLight;
                sunNormalMove  = skyBoxParams.sunNormalParam.eveningAngle;
                sunSpecialMove = skyBoxParams.sunSpecialParam.eveningAngle;
                break;

            case DayTimeSlot.Night:
                skyLight       = skyBoxParams.skyParam.nightLight;
                sunNormalMove  = skyBoxParams.sunNormalParam.nightAngle;
                sunSpecialMove = skyBoxParams.sunSpecialParam.nightAngle;
                break;

            default:
                skyLight       = skyBoxParams.skyParam.morningLight;
                sunNormalMove  = skyBoxParams.sunNormalParam.morningAngle;
                sunSpecialMove = skyBoxParams.sunSpecialParam.morningAngle;
                break;
            }

            float lerp = DayNightTime.Instance.SlotElapsedTime / DayNightTime.Instance.SlotTime;

            //更新一般天空亮度(昼夜变化的时候)
            _curSunLightScale = Mathf.Lerp(skyLight.lightScaleFrom, skyLight.lightScaleTo, lerp);

            //根据昼夜变化的亮度来改变贴图
            float dayNightFactor;

            if (_curSunLightScale > skyBoxParams.skyParam.dayPicLightScaleMax)
            {
                dayNightFactor     = 0;
                _curSkyBoxMaterial = skyBoxMaterials.skyBoxDayToNightFall;
            }
            else if (_curSunLightScale < skyBoxParams.skyParam.nightPicScaleMin)
            {
                dayNightFactor     = 1;
                _curSkyBoxMaterial = skyBoxMaterials.skyBoxNightFallToNight;
            }
            else
            {
                if (_curSunLightScale > skyBoxParams.skyParam.nightFallScaleMiddle)
                {
                    dayNightFactor     = (skyBoxParams.skyParam.dayPicLightScaleMax - _curSunLightScale) / (skyBoxParams.skyParam.dayPicLightScaleMax - skyBoxParams.skyParam.nightFallScaleMiddle);
                    _curSkyBoxMaterial = skyBoxMaterials.skyBoxDayToNightFall;
                }
                else
                {
                    dayNightFactor     = (skyBoxParams.skyParam.nightFallScaleMiddle - _curSunLightScale) / (skyBoxParams.skyParam.nightFallScaleMiddle - skyBoxParams.skyParam.nightPicScaleMin);
                    _curSkyBoxMaterial = skyBoxMaterials.skyBoxNightFallToNight;
                }
//				dayNightFactor = (skyBoxParams.skyParam.dayPicLightScaleMax - _curSunLightScale) / (skyBoxParams.skyParam.dayPicLightScaleMax - skyBoxParams.skyParam.nightPicScaleMin);
            }
            RenderSettings.skybox = _curSkyBoxMaterial;
            _curSkyBoxMaterial.SetFloat("_DayNightFactor", dayNightFactor);

            //云对天空亮度的影响
            _curSunLightScale -= skyBoxParams.cloudParam.lightIntensityDecrease * skyBoxParams.cloudParam.lightIntensityFactor;
            if (_curSunLightScale < 0)
            {
                _curSunLightScale = 0;
            }
            //真正更新天空亮度
            Shader.SetGlobalFloat("MTB_SunLightScale", _curSunLightScale);

            //显示与隐藏太阳
            bool isSpecialTime = DayNightTime.Instance.IsSpecialTime;
            bool isOddDay      = DayNightTime.Instance.Days % 2 == 1;
            bool sunNormalShow = (skyBoxParams.sunNormalParam.oddDayShow == isOddDay && !isSpecialTime) ||
                                 (isSpecialTime);

            skyBoxTransforms.sunNormalTransform.gameObject.SetActive(sunNormalShow);

            bool sunSpecialShow = (skyBoxParams.sunSpecialParam.oddDayShow == isOddDay && !isSpecialTime) ||
                                  (isSpecialTime);

            skyBoxTransforms.sunSpecialTransform.gameObject.SetActive(sunSpecialShow);

            //更新一般太阳位置
            float sunXAngleDeg = Mathf.Lerp(sunNormalMove.angleFrom.x, sunNormalMove.angleTo.x, lerp);
            float sunYAngleDeg = Mathf.Lerp(sunNormalMove.angleFrom.y, sunNormalMove.angleTo.y, lerp);

            UpdateSunNormalPosition(skyBoxParams.sunNormalParam.sunRadius, sunYAngleDeg, sunXAngleDeg);

            //更新特殊太阳位置
            float sunSpecialXAngleDeg = Mathf.Lerp(sunSpecialMove.angleFrom.x, sunSpecialMove.angleTo.x, lerp);
            float sunSpecialYAngleDeg = Mathf.Lerp(sunSpecialMove.angleFrom.y, sunSpecialMove.angleTo.y, lerp);

            UpdateSunSpecialPosition(skyBoxParams.sunSpecialParam.sunRadius, sunSpecialYAngleDeg, sunSpecialXAngleDeg);
        }
Example #4
0
 private void ChangeSlot(DayTimeSlot slot)
 {
     _timeSlot = slot;
 }