using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
namespace Server
{
public class ObservableValues where T : ITuple
{
public event EventHandler<ValuesChangedEventArgs> ValuesChanged;
public T Values { get; private set; }
public ObservableValues(T initialValues){
#if UNITY_EDITOR
#endif
Values = initialValues;
}
public void SetValues(T newValues){if (!EqualityComparer<T>.Default.Equals(Values, newValues)){T oldValues = Values;Values = newValues;OnValuesChanged(new ValuesChangedEventArgs<T>(Values));}}protected virtual void OnValuesChanged(ValuesChangedEventArgs<T> e){ValuesChanged?.Invoke(this, e);}public void Invoke(){ValuesChanged?.Invoke(this, new ValuesChangedEventArgs<T>(Values));}
}public class ValuesChangedEventArgs<T> : EventArgs where T : ITuple
{public T NewValues { get; }public ValuesChangedEventArgs(T newValues){NewValues = newValues;}
}public static class Test
{public static void ObservableValuesTest(){// 创建一个单值元组ObservableValues<ValueTuple<int>> observableSingle1 = new ObservableValues<ValueTuple<int>>(ValueTuple.Create(5));observableSingle1.ValuesChanged += (sender, e) =>{DebugUtils.Log($"Single value updated to {e.NewValues.Item1}");};observableSingle1.SetValues(ValueTuple.Create(10));// 创建一个双值元组ObservableValues<(int, string)> observablePair1 = new ObservableValues<(int, string)>((10, "ten"));observablePair1.ValuesChanged += (sender, e) =>{DebugUtils.Log($"Pair values updated to ({e.NewValues.Item1}, {e.NewValues.Item2})");};observablePair1.SetValues((20, "twenty"));DebugUtils.Log($"{observablePair1.Values.Item1}");// 创建一个三值元组ObservableValues<(int, string, bool)> observableTriple1 = new ObservableValues<(int, string, bool)>((15, "fifteen", true));observableTriple1.ValuesChanged += (sender, e) =>{DebugUtils.Log($"Triple values updated to ({e.NewValues.Item1}, {e.NewValues.Item2}, {e.NewValues.Item3})");};observableTriple1.SetValues((30, "thirty", false));// 创建一个四值元组ObservableValues<(int, string, bool, double)> observableQuadruple1 = new ObservableValues<(int, string, bool, double)>((20, "twenty", false, 20.0));observableQuadruple1.ValuesChanged += (sender, e) =>{DebugUtils.Log($"Quadruple values updated to ({e.NewValues.Item1}, {e.NewValues.Item2}, {e.NewValues.Item3}, {e.NewValues.Item4})");};observableQuadruple1.SetValues((40, "forty", true, 40.0));}
}public static class DebugUtils
{public static void Log(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string filePath = "",[CallerLineNumber] int lineNumber = 0){string logMessage = FormatMessage("Info", message, memberName, filePath, lineNumber);Debug.Log(logMessage);if (Debug.isDebugBuild){CustomLogger.Instance.Log(logMessage);}}public static void LogError(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string filePath = "",[CallerLineNumber] int lineNumber = 0){string logMessage = FormatMessage("Error", message, memberName, filePath, lineNumber);Debug.LogError(logMessage);if (Debug.isDebugBuild){CustomLogger.Instance.LogError(logMessage);}}public static void LogWarning(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string filePath = "",[CallerLineNumber] int lineNumber = 0){string logMessage = FormatMessage("Warning", message, memberName, filePath, lineNumber);Debug.LogWarning(logMessage);if (Debug.isDebugBuild){CustomLogger.Instance.LogWarning(logMessage);}}private static string FormatMessage(string logType, string message, string memberName, string filePath, int lineNumber){string fileName = System.IO.Path.GetFileName(filePath);string projectName = Application.productName;return $"【{projectName}】 {logType} - {fileName}:{lineNumber} <{memberName}> : {message}";}
}
}