#unity3d #slider #letter
Вопрос:
Я хочу вернуть отображаемое значение (a,b,c,d), а не числа (0.01-0.019 и т. Д.) Помощь будет приятной, и многие люди будут счастливы. Этот код выглядит как процентное отображение, но мне не нужен процент, мне нужен текст
Mathf.RoundToInt(value * 100) "%"
Комментарии:
1. Немного сбивает с толку то, что вы пытаетесь сделать, вы имеете в виду соотношение числа к тексту от » 50%» до «пятидесяти процентов»?
2. Нет, мне просто нужен текст, когда я перетаскиваю ползунок
3. @VaporMarin Я добавил два решения. Один специально для буквенно-цифрового вывода, а другой для более общих строковых значений, сопоставленных с числами.
4. Создайте массив текстов .. используйте ползунок только с полными целочисленными шагами -> каждый шаг является индексом вашего массива .. готово
Ответ №1:
Вместо того, чтобы создавать совершенно новый пользовательский слайдер, используйте то, что уже предоставляет Unity, а затем сопоставьте выходные данные в любом желаемом формате. Ползунки можно настроить так, чтобы они имели фиксированное количество выходов, а также фиксировались только на целых числах.
Если вы посмотрите на компонент слайдер в редакторе, поля Min Value
, Max Value
, и Whole Numbers
должны быть установлены. Самое важное-установить Whole Numbers
значение true и Max Value
максимально возможное значение — 1 из вашего нового сопоставленного набора.
Затем, когда значение ползунка изменится, вы захотите установить делегат обратного вызова для своего скрипта, чтобы получить значение.
Вы можете либо добавить обратный вызов в редакторе с помощью UnityAction
пользовательского интерфейса в редакторе, либо программно добавить обратный вызов, обратившись к onValueChange
прослушивателям и добавив нового прослушивателя. Для примера я сделаю все в коде, чтобы устранить любую путаницу.
Все, что осталось, — это сопоставить полученные значения, которые выводит наш слайдер, с некоторым желаемым результатом. Поскольку желаемые выходные данные кажутся просто буквенно-цифровыми значениями, вы действительно можете упростить решение, зная, что, взяв целое значение и добавив к нему символ «a», вы получите соответствующее буквенно-цифровое значение (где 0 соответствует a, а 25-z).
[SerializeField] private Slider slider = null;
private void Start()
{
slider.onValueChanged.AddListener(delegate { SliderValueChangedCallback(); });
}
/// <summary>
/// Called when our slider value changes
/// </summary>
private void SliderValueChangedCallback()
{
// grab out numeric value of the slider - cast to int as the value should be a whole number
int numericSliderValue = (int)slider.value;
// now, plot our value to an alphanumeric one
char alphaNumericValue = (char)(numericSliderValue 'a');
Debug.Log(alphaNumericValue);
}
Теперь это решение будет работать только в том случае, если вы хотите, чтобы ваши выводимые значения были буквенно-цифровыми. Если вам нужно более модульное решение, вот одно из них:
[SerializeField] private Slider slider = null;
[SerializeField] private Text currentValue = null;
[SerializeField] private List<string> yourValueList = new List<string> { "First Message", "Second Message", "Third Value", "4 for some reason", "the letter 6" };
private void Start()
{
slider.onValueChanged.AddListener(delegate { SliderValueChangedCallback(); });
// assuring that our slider is setup properly to map values
slider.minValue = 0;
slider.maxValue = yourValueList.Count - 1;
slider.wholeNumbers = true;
}
/// <summary>
/// Called when our slider value changes
/// </summary>
private void SliderValueChangedCallback()
{
// grab out numeric value of the slider - cast to int as the value should be a whole number
int numericSliderValue = (int)slider.value;
// debugging - do whatever you want with this value
currentValue.text = yourValueList[numericSliderValue];
}
Вот его gif в действии:
Дайте мне знать, если у вас возникнут вопросы. Я не был уверен, хотите ли вы визуально отображать эти маркеры и на слайдере, но это также можно сделать, используя нормализованные позиции и группу горизонтальной компоновки.