using UnityEngine;
///
/// 材质状态保持器
/// 用于在界面切换、场景重载等情况下保持材质的状态
///
public class MaterialStateKeeper : MonoBehaviour
{
private static MaterialStateKeeper instance;
[Header("状态保持设置")]
public bool keepBodyAlpha = true;
public bool keepBrainMaterialState = true;
public bool autoRestoreOnSceneLoad = true;
// 保存的状态数据
private float savedBodyAlpha = 0.6f;
private Color savedBrainColor = Color.green;
// 组件引用
private ProcessModelMatData materialProcessor;
private BodyAlphaController alphaController;
public static MaterialStateKeeper Instance
{
get
{
if (instance == null)
{
var go = new GameObject("MaterialStateKeeper");
instance = go.AddComponent();
DontDestroyOnLoad(go);
}
return instance;
}
}
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
return;
}
// 查找组件
FindComponents();
// 如果启用了自动恢复,则恢复状态
if (autoRestoreOnSceneLoad)
{
// 延迟一帧执行,确保所有组件都已初始化
StartCoroutine(RestoreStateDelayed());
}
}
private void FindComponents()
{
materialProcessor = FindObjectOfType();
alphaController = FindObjectOfType();
}
private System.Collections.IEnumerator RestoreStateDelayed()
{
yield return null; // 等待一帧
// 再次查找组件,以防初始查找时组件还未创建
if (materialProcessor == null)
{
materialProcessor = FindObjectOfType();
}
if (alphaController == null)
{
alphaController = FindObjectOfType();
}
RestoreStates();
}
///
/// 保存当前材质状态
///
public void SaveCurrentStates()
{
if (keepBodyAlpha && materialProcessor != null)
{
savedBodyAlpha = materialProcessor.GetBodyAlpha();
Debug.Log($"MaterialStateKeeper: 保存Body透明度状态 {savedBodyAlpha:F2}");
}
if (keepBrainMaterialState)
{
var addMaterialScript = FindObjectOfType();
if (addMaterialScript != null && addMaterialScript.brainMat != null)
{
savedBrainColor = addMaterialScript.brainMat.color;
Debug.Log($"MaterialStateKeeper: 保存大脑材质颜色状态 {savedBrainColor}");
}
}
}
///
/// 恢复保存的材质状态
///
public void RestoreStates()
{
if (keepBodyAlpha && materialProcessor != null)
{
materialProcessor.SetBodyAlpha(savedBodyAlpha);
// 如果有UI控制器,同步UI状态
if (alphaController != null)
{
if (alphaController.alphaSlider != null)
{
alphaController.alphaSlider.value = savedBodyAlpha;
}
}
Debug.Log($"MaterialStateKeeper: 恢复Body透明度状态 {savedBodyAlpha:F2}");
}
if (keepBrainMaterialState)
{
var addMaterialScript = FindObjectOfType();
if (addMaterialScript != null && addMaterialScript.brainMat != null)
{
addMaterialScript.brainMat.color = savedBrainColor;
Debug.Log($"MaterialStateKeeper: 恢复大脑材质颜色状态 {savedBrainColor}");
}
}
}
///
/// 在界面切换前调用此方法保存状态
///
public void OnUISwitch()
{
SaveCurrentStates();
}
///
/// 在界面切换后调用此方法恢复状态
///
public void OnUISwitchComplete()
{
// 延迟恢复,给新界面时间加载
StartCoroutine(RestoreStateDelayed());
}
///
/// 重置所有状态到默认值
///
public void ResetToDefaults()
{
savedBodyAlpha = 0.6f;
savedBrainColor = Color.green;
RestoreStates();
}
///
/// 设置Body透明度并保存状态
///
/// 透明度值
public void SetAndSaveBodyAlpha(float alpha)
{
if (materialProcessor != null)
{
materialProcessor.SetBodyAlpha(alpha);
savedBodyAlpha = alpha;
}
}
void OnApplicationPause(bool pauseStatus)
{
if (pauseStatus)
{
SaveCurrentStates();
}
else
{
RestoreStates();
}
}
void OnApplicationFocus(bool hasFocus)
{
if (!hasFocus)
{
SaveCurrentStates();
}
else
{
RestoreStates();
}
}
}