개발관련/Unity

클리커 게임 단위 구하기

Diademata 2023. 3. 15. 23:32
반응형

1000 = 1A

1000000 = 1B

namespace GameUtils
{
    public class BigNumberHelper
    {
        internal static readonly char[] MagnitudeUnits = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };

        private static string _numberFormat = "{0:F3}";
        public static void Init(string format)
        {
            _numberFormat = format;
        }
        public static string BigNumberToString(BigNumber bigNumber)
        {
            if(bigNumber.Magnitude >=0)
            {
                return $"{string.Format(_numberFormat, bigNumber.Value)}{bigNumber.MagnitudeLabel}";
            }
            else
            {
                return bigNumber.Value.ToString();
            }
        }
    }
}
using System;
using System.Text;

namespace GameUtils
{
    public struct BigNumber
    {
        public double Value { get; private set; }
        public int Magnitude { get; private set; }
        public string MagnitudeLabel { get; private set; }

        public string DisplayValue
        {
            get
            {
                if (string.IsNullOrEmpty(_displayValue))
                {
                    BigNumberHelper.BigNumberToString(this);
                }
                return _displayValue;
            }
        }

        private readonly string _displayValue;
        public BigNumber(double value) : this(value, -1)
        {
        }
        public BigNumber(double value, int digit = -1)
        {
            while (value >= 1000)
            {
                value /= 1000;
                digit++;
            }
            Magnitude = digit;
            Value = value;

            var sb = new StringBuilder();
            while (digit >= 0)
            {
                sb.Insert(0, BigNumberHelper.MagnitudeUnits[digit % BigNumberHelper.MagnitudeUnits.Length]);
                digit = digit / BigNumberHelper.MagnitudeUnits.Length - 1;
            }
            MagnitudeLabel = sb.ToString();
            _displayValue = string.Empty;
        }
        public static BigNumber operator +(BigNumber number1, BigNumber number2)
        {
            double convertedValue1 = number1.Value;
            double convertedValue2 = number2.Value;
            int finalMagnitude = number1.Magnitude;
            if (number1.Magnitude > number2.Magnitude)
            {
                for (int i = 0; i < (number1.Magnitude - number2.Magnitude); i++)
                {
                    convertedValue2 /= 1000;
                }
            }
            else if (number1.Magnitude < number2.Magnitude)
            {
                for (int i = 0; i < (number2.Magnitude - number1.Magnitude); i++)
                {
                    convertedValue1 /= 1000;
                }
                finalMagnitude = number2.Magnitude;
            }
            var value = convertedValue1 + convertedValue2;

            return new BigNumber(value, finalMagnitude);

        }
        public static BigNumber operator -(BigNumber number1, BigNumber number2)
        {
            double convertedValue1 = number1.Value;
            double convertedValue2 = number2.Value;
            int finalMagnitude = number1.Magnitude;

            if (number1.Magnitude > number2.Magnitude)
            {
                for (int i = 0; i < (number1.Magnitude - number2.Magnitude); i++)
                {
                    convertedValue2 /= 1000;
                }
            }
            else if (number1.Magnitude < number2.Magnitude)
            {
                for (int i = 0; i < (number2.Magnitude - number1.Magnitude); i++)
                {
                    convertedValue1 /= 1000;
                }
                finalMagnitude = number2.Magnitude;
            }

            var value = convertedValue1 - convertedValue2;
            if (Math.Abs(value) < 1)
            {
                value *= 1000;
                finalMagnitude--;
            }
            return new BigNumber(value, finalMagnitude);
        }
    }
}
반응형

'개발관련 > Unity' 카테고리의 다른 글

해상도 고정  (0) 2023.09.02
TextMeshPro 폰트 생성  (0) 2023.07.31
Addressables 동기 사용법 및 주의점  (0) 2022.09.12
곡사체 관련 공식  (0) 2021.03.20
could not create asset from file could not be read  (0) 2021.01.06