【问题标题】:ArgumentOutOfRangeException: Index and length must refer to a location within the stringArgumentOutOfRangeException:索引和长度必须引用字符串中的位置
【发布时间】:2021-07-19 07:13:07
【问题描述】:

我的脚本有问题,如果有人可以提供帮助,我将不胜感激。

问题来了:

ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。 参数名称:长度 System.String.Substring (System.Int32 startIndex, System.Int32 长度) (在 :0)

脚本是:

 public class ColorTypeConverter
 {
     public string ToRGBHex(Color c)
     {
         return string.Format("{0:X2}{1:X2}{2:X2}", ToByte(c.r), ToByte(c.g), ToByte(c.b));
     }
 
     private static byte ToByte(float f)
     {
         f = Mathf.Clamp01(f);
         return (byte)(f * 255);
     }
     
    private int HexToDec (string hex)
    {
        int dec = System.Convert.ToInt32(hex, 16);
        return dec;
    }
    
    private float HexToFloatNormalized(string hex) {
        return HexToDec(hex) / 255f;
    }

    public Color GetColorFromString(string hexString) {
        float red = HexToFloatNormalized(hexString.Substring(0, 2));
        float green = HexToFloatNormalized(hexString.Substring(2, 2));
        float blue = HexToFloatNormalized(hexString.Substring(4, 2));
        return new Color(red, green, blue);
    }
 }

UI 管理器脚本:

string s = PlayerPrefs.GetString("savecolorground");
ColorTypeConverter col = new ColorTypeConverter();
if(s != "")
    ground.GetComponent<SpriteRenderer>().color = col.GetColorFromString(s);
else
    ground.GetComponent<SpriteRenderer>().color = col.GetColorFromString("FFFFFF");

播放器脚本:

ColorTypeConverter colCon = new ColorTypeConverter();
string color = PlayerPrefs.GetString("savecolor");  
if(color != "")
    GetComponent<SpriteRenderer>().color = colCon.GetColorFromString(color);
else
    GetComponent<SpriteRenderer>().color = colCon.GetColorFromString("2AFCFF");

GetComponent<TrailRenderer>().startColor = new Color(
    GetComponent<SpriteRenderer>().color.r, 
    GetComponent<SpriteRenderer>().color.g, 
    GetComponent<SpriteRenderer>().color.b, 
    255);

【问题讨论】:

  • 那么,hexstring 的值是多少?它至少有 6 个字符长吗?
  • 那个编辑没有回答这个问题。当您调用GetColorFromString() 时,请确保hexstring 的长度至少为6 个字符。显然目前不是,因为这就是错误消息告诉您的内容。
  • 请使用正确的标签!请注意,unityscript 是或更好的是曾经是一种 JavaScript 风格,类似于早期 Unity 版本中使用的自定义语言,并且现在已经不推荐使用了!如果您不使用该语言,请不要使用该标签。同样,仅仅因为您使用某个 IDE (visual-studio) 并不意味着这个问题与该 IDE 有关

标签: c# unity3d


【解决方案1】:

您正在寻找的是ColorUtility,它已经提供了所有这些

ColorUtility.ToHtmlStringRGB

以“RRGGBB”格式的十六进制字符串返回颜色。

ColorUtility.TryParseHtmlString

尝试转换 html 颜色字符串。

以“#”开头的字符串将按以下方式解析为十六进制:

  • #RGB(变为 RRGGBB)
  • #RRGGBB
  • #RGBA(变为 RRGGBBAA)
  • #RRGGBBAA

所以你要使用

PlayerPrefs.SetString(KEY, "#" + ColorUtility.ToHtmlStringRGB);

Color color;

if(!PlayerPrefs.HasKey(KEY) && ColorUtility.TryParse(PlayerPrefs.GetString(KEY), out color)
{ 
    color = DEFAULT_COLOR;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多