203 lines
5.4 KiB
C#
203 lines
5.4 KiB
C#
using UnityEngine;
|
||
|
||
/// <summary>
|
||
/// 材质状态保持器
|
||
/// 用于在界面切换、场景重载等情况下保持材质的状态
|
||
/// </summary>
|
||
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<MaterialStateKeeper>();
|
||
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<ProcessModelMatData>();
|
||
alphaController = FindObjectOfType<BodyAlphaController>();
|
||
}
|
||
|
||
private System.Collections.IEnumerator RestoreStateDelayed()
|
||
{
|
||
yield return null; // 等待一帧
|
||
|
||
// 再次查找组件,以防初始查找时组件还未创建
|
||
if (materialProcessor == null)
|
||
{
|
||
materialProcessor = FindObjectOfType<ProcessModelMatData>();
|
||
}
|
||
|
||
if (alphaController == null)
|
||
{
|
||
alphaController = FindObjectOfType<BodyAlphaController>();
|
||
}
|
||
|
||
RestoreStates();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存当前材质状态
|
||
/// </summary>
|
||
public void SaveCurrentStates()
|
||
{
|
||
if (keepBodyAlpha && materialProcessor != null)
|
||
{
|
||
savedBodyAlpha = materialProcessor.GetBodyAlpha();
|
||
Debug.Log($"MaterialStateKeeper: 保存Body透明度状态 {savedBodyAlpha:F2}");
|
||
}
|
||
|
||
if (keepBrainMaterialState)
|
||
{
|
||
var addMaterialScript = FindObjectOfType<AddMaterialToBrainAndOrgans>();
|
||
if (addMaterialScript != null && addMaterialScript.brainMat != null)
|
||
{
|
||
savedBrainColor = addMaterialScript.brainMat.color;
|
||
Debug.Log($"MaterialStateKeeper: 保存大脑材质颜色状态 {savedBrainColor}");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 恢复保存的材质状态
|
||
/// </summary>
|
||
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<AddMaterialToBrainAndOrgans>();
|
||
if (addMaterialScript != null && addMaterialScript.brainMat != null)
|
||
{
|
||
addMaterialScript.brainMat.color = savedBrainColor;
|
||
Debug.Log($"MaterialStateKeeper: 恢复大脑材质颜色状态 {savedBrainColor}");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 在界面切换前调用此方法保存状态
|
||
/// </summary>
|
||
public void OnUISwitch()
|
||
{
|
||
SaveCurrentStates();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 在界面切换后调用此方法恢复状态
|
||
/// </summary>
|
||
public void OnUISwitchComplete()
|
||
{
|
||
// 延迟恢复,给新界面时间加载
|
||
StartCoroutine(RestoreStateDelayed());
|
||
}
|
||
|
||
/// <summary>
|
||
/// 重置所有状态到默认值
|
||
/// </summary>
|
||
public void ResetToDefaults()
|
||
{
|
||
savedBodyAlpha = 0.6f;
|
||
savedBrainColor = Color.green;
|
||
RestoreStates();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置Body透明度并保存状态
|
||
/// </summary>
|
||
/// <param name="alpha">透明度值</param>
|
||
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();
|
||
}
|
||
}
|
||
} |