You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.5 KiB
164 lines
4.5 KiB
using BigFloatNumerics;
|
|
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("<color=#{0}>{1}</color>", colorStr, targetStr);
|
|
|
|
return _stringBuilder.ToString();
|
|
}
|
|
|
|
public static bool IsLittleEndian()
|
|
{
|
|
uint tmp = 0x000000ff;
|
|
byte[] bytes = 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;
|
|
}
|
|
|
|
public static double PermutaitionPowAdd(double v, double goalPow)
|
|
{
|
|
if(v == 1)
|
|
return goalPow;
|
|
|
|
return (v - Math.Pow(v, goalPow + 1)) / (1 - v);
|
|
}
|
|
|
|
public static float GetAngle2D(UnityEngine.Vector2 v)
|
|
{
|
|
return Mathf.Atan2(v.y, v.x) * Mathf.Rad2Deg;
|
|
}
|
|
|
|
public static UnityEngine.Vector2 GetDirection2D(float angle)
|
|
{
|
|
float rad = angle * Mathf.Deg2Rad;
|
|
return new UnityEngine.Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
|
|
}
|
|
|
|
public static BigInteger Clamp(BigInteger value, BigInteger min, BigInteger max)
|
|
{
|
|
if(value < min)
|
|
return min;
|
|
else if(value > max)
|
|
return max;
|
|
else
|
|
return value;
|
|
}
|
|
|
|
public static BigInteger Max(BigInteger a, BigInteger b)
|
|
{
|
|
return a > b ? a : b;
|
|
}
|
|
|
|
public static BigInteger Min(BigInteger a, BigInteger b)
|
|
{
|
|
return a < b ? a : b;
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public struct EditableKeyValue<TKey, TValue>
|
|
{
|
|
public TKey key;
|
|
public TValue value;
|
|
}
|
|
|
|
public static class Formula
|
|
{
|
|
/// <summary>
|
|
/// (이전 값 * 계수) + 가산 = 현재 값 을 계산하는 수식
|
|
/// </summary>
|
|
/// <param name="baseV">기본값</param>
|
|
/// <param name="multiplier">계수</param>
|
|
/// <param name="adder">가산</param>
|
|
/// <param name="level">현재 레벨</param>
|
|
public static BigFloat Calculate(BigFloat baseV, BigFloat multiplier, BigFloat adder, uint level)
|
|
{
|
|
if (level <= 1)
|
|
return baseV;
|
|
|
|
//NOTE : baseV * (multiplier ^ (level - 1)) + adder * (total add value of multiplier pow value to (level - 2))
|
|
BigFloat a = baseV * Math.Pow(multiplier, level - 1);
|
|
BigFloat b = adder * (1 + Utility.PermutaitionPowAdd(multiplier, level - 2));
|
|
|
|
return a + b;
|
|
}
|
|
}
|
|
|