166 lines
4.4 KiB
C#
166 lines
4.4 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Runtime.InteropServices;
|
||
using System.Text;
|
||
using TMPro;
|
||
using Unity.VisualScripting;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
public class GetNumberState : IState
|
||
{
|
||
const string NUMBER_KEY = "Number";
|
||
//Иерархия для панели: Панель -> 10 Image -> У каждого tmpro
|
||
GameObject entryPanel;
|
||
Color normalColor = Color.gray;
|
||
Color highlightedColor = new Color(0.7f, 0.7f, 0.7f, 1);
|
||
|
||
string[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",};
|
||
int currentDigitIndex;
|
||
|
||
|
||
Image[] slots;
|
||
|
||
private int currentSlotIndex = 0;
|
||
private int length = 11;
|
||
|
||
public void enter()
|
||
{
|
||
//включить панель, получить доступ ко всем слотам
|
||
entryPanel = GameManager.instance.NumberPanel;
|
||
Debug.Log(entryPanel);
|
||
entryPanel.SetActive(true);
|
||
collectSlots();
|
||
|
||
//подгрузить данные если были
|
||
string currentNumber = getCurrentNumberOrNull();
|
||
if (currentNumber != null) fillNumber(currentNumber);
|
||
|
||
currentDigitIndex = getDigitIndex(text(currentSlotIndex).text);
|
||
if (currentDigitIndex == -1) currentDigitIndex = 0;
|
||
|
||
|
||
switchSlot(1); switchSlot(-1);//чтобы отобразилась подсветка
|
||
colorSlots();
|
||
}
|
||
|
||
public void update()
|
||
{
|
||
|
||
//Меняем слот
|
||
if (In.GetButtonDown(ButtonPinMapping.left1))
|
||
{
|
||
switchSlot(-1);
|
||
}
|
||
if (In.GetButtonDown(ButtonPinMapping.right1))
|
||
{
|
||
switchSlot(1);
|
||
}
|
||
|
||
|
||
//меняем букву в слоте
|
||
if (In.GetButtonDown(ButtonPinMapping.left2))
|
||
{
|
||
switchDigit(-1);
|
||
}
|
||
if (In.GetButtonDown(ButtonPinMapping.right2))
|
||
{
|
||
switchDigit(1);
|
||
}
|
||
|
||
//записываем и выходим
|
||
if (In.GetButtonDown(ButtonPinMapping.down2))
|
||
{
|
||
GameManager.instance.stateMachine.ChangeState(new SettingsState());
|
||
}
|
||
|
||
}
|
||
public void exit()
|
||
{
|
||
//сохранить данные закрыть панельку
|
||
string res = collectResult();
|
||
PlayerPrefs.SetString(NUMBER_KEY, res);
|
||
entryPanel.SetActive(false);
|
||
}
|
||
|
||
|
||
private void collectSlots()
|
||
{
|
||
slots = new Image[length];
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
slots[i] = entryPanel.transform.GetChild(i).GetComponent<Image>();
|
||
}
|
||
}
|
||
private TextMeshProUGUI text(int index)
|
||
{
|
||
return slots[index].transform.GetChild(0).GetComponent<TextMeshProUGUI>();
|
||
}
|
||
|
||
private string getCurrentNumberOrNull()
|
||
{
|
||
if (PlayerPrefs.HasKey(NUMBER_KEY))
|
||
{
|
||
return PlayerPrefs.GetString(NUMBER_KEY);
|
||
}
|
||
else
|
||
{
|
||
return null;
|
||
}
|
||
}
|
||
|
||
private void fillNumber(string number)
|
||
{
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
text(i).text = number[i].ToString();
|
||
}
|
||
}
|
||
|
||
private void switchSlot(int direction)
|
||
{
|
||
//старый слот не подсвечиваем
|
||
slots[currentSlotIndex].color = normalColor;
|
||
|
||
//циклично перемещаем индекс
|
||
direction = (int)Mathf.Sign(direction);
|
||
currentSlotIndex = (currentSlotIndex + direction + length) % length;
|
||
|
||
//новый слот подсвечиваем
|
||
slots[currentSlotIndex].color = highlightedColor;
|
||
currentDigitIndex = getDigitIndex(text(currentSlotIndex).text);
|
||
|
||
//??все?
|
||
}
|
||
|
||
private void switchDigit(int direction)
|
||
{
|
||
direction = (int)Mathf.Sign(direction);
|
||
currentDigitIndex = (currentDigitIndex + digits.Length + direction) % digits.Length;
|
||
|
||
text(currentSlotIndex).text = digits[currentDigitIndex];
|
||
}
|
||
|
||
private int getDigitIndex(string symbol) => Array.IndexOf(digits, symbol);
|
||
|
||
private string collectResult()
|
||
{
|
||
StringBuilder sb = new();
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
sb.Append(text(i).text);
|
||
}
|
||
return sb.ToString();
|
||
}
|
||
|
||
void colorSlots()
|
||
{
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
slots[i].color = normalColor;
|
||
}
|
||
slots[0].color = highlightedColor;
|
||
}
|
||
}
|