StreamReader w = new StreamReader(@"d:\colors.txt");
w.ReadLine();
w.Close();
文本文件行内容示例
RGBA(0.272, 0.272, 0.272, 0.500)
我想把这些值转换为ColorSo,我以后就能够做到例如。
Color c = colorFromTextFile;
如果你的字符串看起来像给定的
RGBA(0.272, 0.272, 0.272, 0.500)
你可以用
string.IndexOf
来寻找 (
和 )
string.Substring
然后提取这两个字符串之间的string.Split
最后将其切割成各个颜色组件Single.Parse
将给定的字符串解析为 float
价值观Color
构造者类似e.g.的东西。
public static bool TryParse(string input, out Color color)
{
// e.g. input = "RGBA(0.272, 0.272, 0.272, 0.500)"
color = default;
try
{
var firstChar = input.IndexOf('(') + 1;
// = 5
var lastChar = input.IndexOf(')') - 1;
// = 31
var colorDataLength = lastChar - firstCharIndex;
// 26
var colorData = input.SubString(firstChar, colorDataLength);
// = "0.272, 0.272, 0.272, 0.500"
var colorParts = colorData.Split(',');
// = string[]{"0.272", " 0.272", " 0.272", " 0.500"}
var r = float.Parse(colorParts[0].Trim());
// = 0.272f
var g = float.Parse(colorParts[1].Trim());
// = 0.272f
var b = float.Parse(colorParts[2].Trim());
// = 0.272f
var a = float.Parse(colorParts[3].Trim());
// = 0.5f
color = new Color(r, g, b, a);
return true;
}
catch(Exception e)
{
Debug.LogError($"{e.GetType()} while trying to parse string \"{input}\"!\n{e.Message}\n{e.StackTrace}");
return false;
}
}
所以你可以用e.g.这样的方式。
if(TryParse("RGBA(0.272, 0.272, 0.272, 0.500)", out var color))
{
// success -> use color
someMaterial.color = color;
}
或者像 将军提到 在评论中,你也可以把这个缩短一点,用上 Regex.Matches
以直接找到各个颜色组件。像
var colorParts = Regex.Matches(input, @"[0-9](\.[0-9]+)");
// = MatchCollection{"0.272", "0.272", "0.272", "0.500"}
在这种情况下,你就不需要使用 string.Trim()
因为这些已经没有空格了。
是的,你也可以使用 线路 Select
以此 float.Parse
在所有元素上一气呵成
// This is basically a shortcut for doing something like
//var colorComponentsList = new List<float>();
//foreach(var part in colorParts)
//{
// colorComponentsList.Add(float.Parse(part.Value));
//}
//var colorComponents = colorComponentsList.ToArray();
var colorComponents = colorParts.Select(part => float.Parse(part.Value)).ToArray();
// = float[]{0.272f, 0.272f, 0.272f, 0.5f}
color = new Color(colorComponents[0], colorComponents[1], colorComponents[2], colorComponents[3]);
但是,如果你不拘泥于文件格式,你应该用HTML颜色格式(十六进制)存储你的颜色。
#45454580
并使用 ColorUtility.TryParseHtmlString
注释是在智能手机上打的,所以请耐心等待,但我希望这个想法能清楚:)