From 42f0cded84c8d19a1a3ea0e5d5a00323775f0249 Mon Sep 17 00:00:00 2001 From: CuongNV Date: Thu, 28 May 2026 17:47:13 +0700 Subject: [PATCH] add new code controller color night --- .../Terrain/GlobalShaderVariableSetting.cs | 38 ++++++----- Assets/PerfectWorld/Scene/Bootstrap.unity | 4 +- .../PerfectWorld/Scripts/Objet/CECMatter.cs | 2 +- .../PerfectWorld/Scripts/World/CECSunMoon.cs | 65 ++++++++++++++++++- .../Prefabs/GlobalShaderVariableSetting.meta | 8 +++ .../prefab_GlobalShaderVariableSetting.prefab | 55 ++++++++++++++++ ...ab_GlobalShaderVariableSetting.prefab.meta | 7 ++ 7 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 Assets/Prefabs/GlobalShaderVariableSetting.meta create mode 100644 Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab create mode 100644 Assets/Prefabs/GlobalShaderVariableSetting/prefab_GlobalShaderVariableSetting.prefab.meta 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: