using System; using System.Numerics; using System.Text; using UnityEngine; public static class Utility { static StringBuilder _stringBuilder = new StringBuilder(); public static StringBuilder StringBuilder => _stringBuilder; public static string Color2StringWithoutAlpha(Color color) { string red = ((int)(color.r * 255)).ToString("X2"); string green = ((int)(color.g * 255)).ToString("X2"); string blue = ((int)(color.b * 255)).ToString("X2"); _stringBuilder.Clear(); _stringBuilder.Append(red); _stringBuilder.Append(green); _stringBuilder.Append(blue); return _stringBuilder.ToString(); } public static Color String2Color(string colorString) { Color result = Color.white; colorString = colorString.ToUpper(); const int stride = 2; int[] rgba = new int[] { 0, 0, 0, 0 }; int offset = 0; for (int i = 0; i < colorString.Length; i++) { char c = colorString[i]; if (c >= 'A' && c <= 'F') { rgba[offset / stride] += (int)Mathf.Pow(16, (stride - (offset % stride) - 1)) * (10 + (c - 'A')); offset++; } else if (c >= '0' && c <= '9') { rgba[offset / stride] += (int)Mathf.Pow(16, (stride - (offset % stride) - 1)) * (c - '0'); offset++; } } result.r = rgba[0] / 255f; result.g = rgba[1] / 255f; result.b = rgba[2] / 255f; result.a = rgba[3] / 255f; return result; } public static string GetMergeStringWithColor(Color color, string targetStr) { string colorStr = Color2StringWithoutAlpha(color); _stringBuilder.Clear(); _stringBuilder.AppendFormat("{1}", colorStr, targetStr); return _stringBuilder.ToString(); } public static bool IsLittleEndian() { uint tmp = 0x000000ff; byte[] bytes = System.BitConverter.GetBytes(tmp); return bytes[0] == 0xff; } public static uint PermutationAdd(uint goal, uint start = 1) { if(start != 1) return PermutationAdd(goal) - PermutationAdd(start - 1); else return goal * (goal + 1) / 2; } public static BigInteger PermutationAdd(BigInteger goal, BigInteger start) { if(goal < 0 || start < 0) throw new ArgumentException("goal and start must be positive number."); if(start != 1) return PermutationAdd(goal, 1) - PermutationAdd(start - 1, 1); else return goal * (goal + 1) / 2; } } [Serializable] public struct EditableKeyValue { public TKey key; public TValue value; }