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 }; }
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); }
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); }
private void ChangeSlot(DayTimeSlot slot) { _timeSlot = slot; }