diff --git a/Assets/ModelRenderer/Scripts/Terrain/GlobalShaderVariableSetting.cs b/Assets/ModelRenderer/Scripts/Terrain/GlobalShaderVariableSetting.cs
index 5eb1a87961..c394b41e6d 100644
--- a/Assets/ModelRenderer/Scripts/Terrain/GlobalShaderVariableSetting.cs
+++ b/Assets/ModelRenderer/Scripts/Terrain/GlobalShaderVariableSetting.cs
@@ -1,27 +1,33 @@
using UnityEngine;
-[ExecuteAlways]
-public class GlobalShaderVariableSetting : MonoBehaviour
+///
+/// 全局昼夜着色参数(由 CECSunMoon 在刷新 m_fDNFactor 后调用 Apply)。
+/// Global day/night shader globals; CECSunMoon calls Apply after updating m_fDNFactor.
+///
+[System.Serializable]
+public class GlobalShaderVariableSetting
{
- [Range(0, 1)]
- public float nightColorControl;
- public Color ambientDayColor;
- public Color dirLtColorDayColor;
- public Color ambientNightColor;
- public Color dirLtColorNightColor;
- int AmbientDayColorHash = Shader.PropertyToID("_AmbientDayColor");
- int DirLtColorDayColorHash = Shader.PropertyToID("_DirLtColorDayColor");
- int AmbientNightColorHash = Shader.PropertyToID("_AmbientNightColor");
- int DirLtColorNightColorHash = Shader.PropertyToID("_DirLtColorNightColor");
- int NightColorControlHash = Shader.PropertyToID("_NightColorControl");
+ [Range(0.0f, 1.0f)]
+ public float nightControl;
+ public Color ambientDayColor = Color.white;
+ public Color dirLtColorDayColor = Color.white;
+ public Color ambientNightColor = new Color(0.113f, 0.113f, 0.113f, 1f);
+ public Color dirLtColorNightColor = new Color(0.123f, 0.123f, 0.123f, 1f);
- // Update is called once per frame
- void Update()
+ static readonly int AmbientDayColorHash = Shader.PropertyToID("_AmbientDayColor");
+ static readonly int DirLtColorDayColorHash = Shader.PropertyToID("_DirLtColorDayColor");
+ static readonly int AmbientNightColorHash = Shader.PropertyToID("_AmbientNightColor");
+ static readonly int DirLtColorNightColorHash = Shader.PropertyToID("_DirLtColorNightColor");
+ static readonly int NightColorControlHash = Shader.PropertyToID("_NightColorControl");
+
+ /// 0=昼 1=夜,与 PC m_fDNFactor 一致 // 0=day, 1=night, same as PC m_fDNFactor
+ public void Apply(float nightColorControl)
{
+ nightControl = Mathf.Clamp01(nightColorControl);
Shader.SetGlobalColor(AmbientDayColorHash, ambientDayColor);
Shader.SetGlobalColor(DirLtColorDayColorHash, dirLtColorDayColor);
Shader.SetGlobalColor(AmbientNightColorHash, ambientNightColor);
Shader.SetGlobalColor(DirLtColorNightColorHash, dirLtColorNightColor);
- Shader.SetGlobalFloat(NightColorControlHash, nightColorControl);
+ Shader.SetGlobalFloat(NightColorControlHash, nightControl);
}
}
diff --git a/Assets/PerfectWorld/Scene/Bootstrap.unity b/Assets/PerfectWorld/Scene/Bootstrap.unity
index bc0fc63f29..b929af8d85 100644
--- a/Assets/PerfectWorld/Scene/Bootstrap.unity
+++ b/Assets/PerfectWorld/Scene/Bootstrap.unity
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:118edff57ce13d46edc50acb1387bca1d79d66795958be304ef1e9d017cff634
-size 309966
+oid sha256:c325d0a7bc280929b09c64b5ed3ba47eb1b4d50a46850a97cdd7b752527e808a
+size 312713
diff --git a/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs b/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs
index 1a12a48c1a..786db03760 100644
--- a/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs
+++ b/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs
@@ -311,7 +311,7 @@ namespace PerfectWorld.Scripts
Mathf.Abs(meshBounds.size.z * scale.z));
var currentBounds = new Bounds(worldCenter, worldSize);
- Debug.Log($"[Cuong] [CECMatter] renderer={renderer.name} meshLocalCenter={meshBounds.center} meshLocalSize={meshBounds.size} worldCenter={worldCenter} worldSize={worldSize} worldMaxY={currentBounds.max.y}");
+ BMLogger.Log($"[Cuong] [CECMatter] renderer={renderer.name} meshLocalCenter={meshBounds.center} meshLocalSize={meshBounds.size} worldCenter={worldCenter} worldSize={worldSize} worldMaxY={currentBounds.max.y}");
if (!hasAny)
{
diff --git a/Assets/PerfectWorld/Scripts/World/CECSunMoon.cs b/Assets/PerfectWorld/Scripts/World/CECSunMoon.cs
index c7585ae3fa..bbe9074aa0 100644
--- a/Assets/PerfectWorld/Scripts/World/CECSunMoon.cs
+++ b/Assets/PerfectWorld/Scripts/World/CECSunMoon.cs
@@ -17,6 +17,8 @@ namespace BrewMonster.Scripts
public float m_fDNFactor; // day or night factor
public float m_fDNFactorDest; // day or night factor dest
+ [SerializeField] GlobalShaderVariableSetting _globalShaderVariables;
+
protected override void Initialize()
{
base.Initialize();
@@ -28,8 +30,65 @@ namespace BrewMonster.Scripts
public void Update()
{
m_vTimeOfTheDay += Time.deltaTime / 3600.0 / 24.0 * TIME_SCALE;
- while( m_vTimeOfTheDay > 1.0 )
- m_vTimeOfTheDay -= 1.0;
+ while (m_vTimeOfTheDay > 1.0)
+ m_vTimeOfTheDay -= 1.0;
+ RefreshDayNightFactorsFromPhase();
+ }
+
+ public float GetTimeOfTheDay() => (float)m_vTimeOfTheDay;
+ public float GetDNFactor() => m_fDNFactor;
+ public float GetDNFactorDest() => m_fDNFactorDest;
+
+ ///
+ /// 设置一天中的时刻(与 PC 版 CECSunMoon::SetTimeOfTheDay 对齐) // Set time-of-day phase [0,1), aligned with PC CECSunMoon::SetTimeOfTheDay
+ ///
+ public bool SetTimeOfTheDay(float vTime)
+ {
+ while (vTime < 0f)
+ vTime += 1f;
+ while (vTime > 1f)
+ vTime -= 1f;
+ m_vTimeOfTheDay = vTime;
+ RefreshDayNightFactorsFromPhase();
+ return true;
+ }
+
+ ///
+ /// PC EC_SunMoon::UpdateWithTime 中昼夜因子段(供 minimap 与场景一致) // DN factor block from PC EC_SunMoon::UpdateWithTime
+ ///
+ void RefreshDayNightFactorsFromPhase()
+ {
+ float v = (float)m_vTimeOfTheDay;
+
+ // update day night factor — same branches as PC EC_SunMoon.cpp UpdateWithTime (lines 894–918)
+ if (v < NIGHT_DAY_START)
+ {
+ m_fDNFactor = 1.0f;
+ m_fDNFactorDest = 1.0f;
+ }
+ else if (v < NIGHT_DAY_END)
+ {
+ m_fDNFactor = 1.0f - (v - NIGHT_DAY_START) / (NIGHT_DAY_END - NIGHT_DAY_START);
+ m_fDNFactorDest = 0.0f;
+ }
+ else if (m_vTimeOfTheDay < DAY_NIGHT_START)
+ {
+ // PC 使用 m_vTimeOfTheDay 与 DAY_NIGHT_START 比较 // PC compares m_vTimeOfTheDay to DAY_NIGHT_START (see EC_SunMoon.cpp)
+ m_fDNFactor = 0.0f;
+ m_fDNFactorDest = 0.0f;
+ }
+ else if (v < DAY_NIGHT_END)
+ {
+ m_fDNFactor = (v - DAY_NIGHT_START) / (DAY_NIGHT_END - DAY_NIGHT_START);
+ m_fDNFactorDest = 1.0f;
+ }
+ else
+ {
+ m_fDNFactor = 1.0f;
+ m_fDNFactorDest = 1.0f;
+ }
+
+ _globalShaderVariables?.Apply(m_fDNFactor);
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/Prefabs/GlobalShaderVariableSetting.meta b/Assets/Prefabs/GlobalShaderVariableSetting.meta
new file mode 100644
index 0000000000..1c8c028ba4
--- /dev/null
+++ b/Assets/Prefabs/GlobalShaderVariableSetting.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0bc8e618be49c2a43ba51b29d88b0d89
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab b/Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab
new file mode 100644
index 0000000000..61bc779602
--- /dev/null
+++ b/Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab
@@ -0,0 +1,55 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &8484668850765921357
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 175233104343345793}
+ - component: {fileID: 8122841735406317771}
+ m_Layer: 0
+ m_Name: prefab_GlobalShaderVariableSetting
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &175233104343345793
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8484668850765921357}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8122841735406317771
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8484668850765921357}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 427757edde4d4aa4c8f1f0f45d926e40, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_vTimeOfTheDay: 0
+ m_fDNFactor: 0
+ m_fDNFactorDest: 0
+ _globalShaderVariables:
+ nightControl: 1
+ ambientDayColor: {r: 1, g: 1, b: 1, a: 1}
+ dirLtColorDayColor: {r: 1, g: 1, b: 1, a: 1}
+ ambientNightColor: {r: 0.052064802, g: 0.17590977, b: 0.2830189, a: 1}
+ dirLtColorNightColor: {r: 0.050980397, g: 0.1764706, b: 0.28235295, a: 1}
diff --git a/Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab.meta b/Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab.meta
new file mode 100644
index 0000000000..fbea7f8887
--- /dev/null
+++ b/Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8306e3d623c54e346bad9ae88a7725b7
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: