add new code controller color night

This commit is contained in:
CuongNV
2026-05-28 17:47:13 +07:00
parent 01098d913c
commit 42f0cded84
7 changed files with 157 additions and 22 deletions
@@ -1,27 +1,33 @@
using UnityEngine;
[ExecuteAlways]
public class GlobalShaderVariableSetting : MonoBehaviour
/// <summary>
/// 全局昼夜着色参数(由 CECSunMoon 在刷新 m_fDNFactor 后调用 Apply)。
/// Global day/night shader globals; CECSunMoon calls Apply after updating m_fDNFactor.
/// </summary>
[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");
/// <param name="nightColorControl">0=昼 1=夜,与 PC m_fDNFactor 一致 // 0=day, 1=night, same as PC m_fDNFactor</param>
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);
}
}
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:118edff57ce13d46edc50acb1387bca1d79d66795958be304ef1e9d017cff634
size 309966
oid sha256:c325d0a7bc280929b09c64b5ed3ba47eb1b4d50a46850a97cdd7b752527e808a
size 312713
@@ -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)
{
@@ -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;
/// <summary>
/// 设置一天中的时刻(与 PC 版 CECSunMoon::SetTimeOfTheDay 对齐) // Set time-of-day phase [0,1), aligned with PC CECSunMoon::SetTimeOfTheDay
/// </summary>
public bool SetTimeOfTheDay(float vTime)
{
while (vTime < 0f)
vTime += 1f;
while (vTime > 1f)
vTime -= 1f;
m_vTimeOfTheDay = vTime;
RefreshDayNightFactorsFromPhase();
return true;
}
/// <summary>
/// PC EC_SunMoon::UpdateWithTime 中昼夜因子段(供 minimap 与场景一致) // DN factor block from PC EC_SunMoon::UpdateWithTime
/// </summary>
void RefreshDayNightFactorsFromPhase()
{
float v = (float)m_vTimeOfTheDay;
// update day night factor — same branches as PC EC_SunMoon.cpp UpdateWithTime (lines 894918)
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);
}
}
}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0bc8e618be49c2a43ba51b29d88b0d89
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -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}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8306e3d623c54e346bad9ae88a7725b7
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: