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}";
}
}
}