У меня просто панель с цифрами и индикатор этажей лифта. Нажимаешь кнопку - лифт едет на выбранный этаж. Плавное перемещение головки реализовывал с помощью корутины. Но при ее запуске юнити виснет. Следствие бесконечного цикла. Корутина внизу кода. Подскажите что я не так сделал
Синтаксис:
Используется csharp
public class Initializator : MonoBehaviour
{
private byte choisesFloor = 1;
private byte currentFloot = 1;
private const byte maxFloor = 9;
private float divisionOfFloor;
private List<Button> panelOfButtons;
public List<Button> PanelOfButtons { get { return panelOfButtons; } set { panelOfButtons = value; } }
private GameObject floorIndicator;
public GameObject FloorIndicator { get { return floorIndicator; } set { floorIndicator = value; } }
private RectTransform lineFloorRectTransform;
private static Initializator instance;
public static Initializator Instance { get { return instance; } }
void Awake()
{
instance = this;
panelOfButtons = transform.FindChild("ButtonsOfElevator").GetComponentsInChildren<Button>().ToList();
foreach (Button buttonOfFloor in panelOfButtons)
{
byte floor = byte.Parse(buttonOfFloor.GetComponentInChildren<Text>().text);
buttonOfFloor.onClick.AddListener(()=>SetNumberOfFloor(floor));
buttonOfFloor.onClick.AddListener(StartCoroutineProgressForFloor);
}
floorIndicator = transform.FindChild("FloorIndicator").gameObject;
lineFloorRectTransform = floorIndicator.transform.FindChild("ProgressLine").GetComponent<RectTransform>();
CalculateRectForFloorIndicator();
}
public void SetNumberOfFloor(byte _number)
{
choisesFloor = _number;
}
void CalculateRectForFloorIndicator()
{
RectTransform rectTransform = floorIndicator.GetComponent<RectTransform>();
divisionOfFloor = Mathf.Abs(rectTransform.sizeDelta.x / panelOfButtons.Count);
}
void StartCoroutineProgressForFloor()
{
lineFloorRectTransform.gameObject.SetActive(true);
StartCoroutine(ProgressForFloorIndicator());
}
IEnumerator ProgressForFloorIndicator()
{
float selectedFloor = Mathf.Abs( divisionOfFloor * (currentFloot - choisesFloor));
Vector3 v3 = lineFloorRectTransform.transform.localPosition;
Debug.Log(lineFloorRectTransform.transform.localPosition.x + " begin");
if (choisesFloor >= currentFloot)
while (lineFloorRectTransform.transform.localPosition.x < v3.x + selectedFloor)
{
lineFloorRectTransform.transform.localPosition = new Vector3(v3.x + 1f, v3.y);
}
else
{
while (lineFloorRectTransform.transform.localPosition.x > v3.x + selectedFloor)
{
lineFloorRectTransform.transform.localPosition = new Vector3(v3.x - selectedFloor*0.1f, v3.y);
}
}
Debug.Log(lineFloorRectTransform.transform.localPosition.x + " end");
currentFloot = choisesFloor;
yield return null;
}
void CheckForCurrentFloor()
{
}
}
{
private byte choisesFloor = 1;
private byte currentFloot = 1;
private const byte maxFloor = 9;
private float divisionOfFloor;
private List<Button> panelOfButtons;
public List<Button> PanelOfButtons { get { return panelOfButtons; } set { panelOfButtons = value; } }
private GameObject floorIndicator;
public GameObject FloorIndicator { get { return floorIndicator; } set { floorIndicator = value; } }
private RectTransform lineFloorRectTransform;
private static Initializator instance;
public static Initializator Instance { get { return instance; } }
void Awake()
{
instance = this;
panelOfButtons = transform.FindChild("ButtonsOfElevator").GetComponentsInChildren<Button>().ToList();
foreach (Button buttonOfFloor in panelOfButtons)
{
byte floor = byte.Parse(buttonOfFloor.GetComponentInChildren<Text>().text);
buttonOfFloor.onClick.AddListener(()=>SetNumberOfFloor(floor));
buttonOfFloor.onClick.AddListener(StartCoroutineProgressForFloor);
}
floorIndicator = transform.FindChild("FloorIndicator").gameObject;
lineFloorRectTransform = floorIndicator.transform.FindChild("ProgressLine").GetComponent<RectTransform>();
CalculateRectForFloorIndicator();
}
public void SetNumberOfFloor(byte _number)
{
choisesFloor = _number;
}
void CalculateRectForFloorIndicator()
{
RectTransform rectTransform = floorIndicator.GetComponent<RectTransform>();
divisionOfFloor = Mathf.Abs(rectTransform.sizeDelta.x / panelOfButtons.Count);
}
void StartCoroutineProgressForFloor()
{
lineFloorRectTransform.gameObject.SetActive(true);
StartCoroutine(ProgressForFloorIndicator());
}
IEnumerator ProgressForFloorIndicator()
{
float selectedFloor = Mathf.Abs( divisionOfFloor * (currentFloot - choisesFloor));
Vector3 v3 = lineFloorRectTransform.transform.localPosition;
Debug.Log(lineFloorRectTransform.transform.localPosition.x + " begin");
if (choisesFloor >= currentFloot)
while (lineFloorRectTransform.transform.localPosition.x < v3.x + selectedFloor)
{
lineFloorRectTransform.transform.localPosition = new Vector3(v3.x + 1f, v3.y);
}
else
{
while (lineFloorRectTransform.transform.localPosition.x > v3.x + selectedFloor)
{
lineFloorRectTransform.transform.localPosition = new Vector3(v3.x - selectedFloor*0.1f, v3.y);
}
}
Debug.Log(lineFloorRectTransform.transform.localPosition.x + " end");
currentFloot = choisesFloor;
yield return null;
}
void CheckForCurrentFloor()
{
}
}