Как преобразовать значения цвета текста из текстового файла в цвет? - PullRequest
0 голосов
/ 17 июня 2020
StreamReader w = new StreamReader(@"d:\colors.txt");
w.ReadLine();
w.Close();

Пример содержимого строки текстового файла

RGBA (0,272, 0,272, 0,272, 0,500)

Я хочу преобразовать значения в цвет Итак, я смогу сделать позже например:

Color c = colorFromTextFile;

1 Ответ

2 голосов
/ 17 июня 2020

Если ваша строка выглядит как заданная

RGBA(0.272, 0.272, 0.272, 0.500)

, вы можете использовать

  1. string.IndexOf, чтобы найти ( и )
  2. string.Substring, чтобы затем извлечь строку между этими двумя
  3. string.Split, чтобы окончательно разрезать ее на отдельные компоненты цвета
  4. Single.Parse для синтаксического анализа данной строки на float значений
  5. Передайте их конструктору 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


Примечание, набранное на смартфоне, так что проявите терпение, но Надеюсь, идея прояснится :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...