Если ваша строка выглядит как заданная
RGBA(0.272, 0.272, 0.272, 0.500)
, вы можете использовать
string.IndexOf
, чтобы найти (
и )
string.Substring
, чтобы затем извлечь строку между этими двумя string.Split
, чтобы окончательно разрезать ее на отдельные компоненты цвета Single.Parse
для синтаксического анализа данной строки на float
значений - Передайте их конструктору
Color
Что-то вроде, например,
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;
}
}
Таким образом, вы можете использовать его, например, например,
if(TryParse("RGBA(0.272, 0.272, 0.272, 0.500)", out var color))
{
// success -> use color
someMaterial.color = color;
}
В качестве альтернативы Генерал упомянул в комментариях, вы также можете сократить это bit и используйте Regex.Matches
, чтобы напрямую найти отдельные компоненты цвета. Например,
var colorParts = Regex.Matches(input, @"[0-9](\.[0-9]+)");
// = MatchCollection{"0.272", "0.272", "0.272", "0.500"}
В этом случае вам не нужно использовать string.Trim()
, так как они уже без пробелов.
И да, вы также можете использовать Linq Select
для выполнения float.Parse
всех элементов в одном go например,
// 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
Примечание, набранное на смартфоне, так что проявите терпение, но Надеюсь, идея прояснится :)