0

По этому скрипту объект Background должен менять свою форму (что он и делает) но в методе Enter есть вычисление, которое находит разницу между настоящим размером и нужным и заканчивается только при условии, что разница равна нулю, что никогда не произойдёт из-за вычисления. Теперь мне нужно либо принудительно остановить метод, или каким-то образом осуществить условие завершения. Проблема в том, что переменная i (настоящий размер по оси x) никогда не равна 2 (нужный размер) и зацикливается на 1.999999... (А Change вообще выходит на 1.оченьМногоЦифриБукв) Можно что нибудь с этим сделать?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class Button : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { [Header("Set manualy")] [Tooltip("This is the backline, that will be activaited when the mouse is on button")] public GameObject Background; [Tooltip("Set how long the line will become, when mouse is on it")] public float Selected; public float Speed; [Header("Sets automatically")] public RectTransform rt; public float Change; public float i;

void Awake() {
    rt = Background.GetComponent<RectTransform>();
    i = 1;
}


public void OnPointerEnter(PointerEventData eventData) {
    Invoke("Enter", 0f);
}

void Enter() {
    print("Still using Enter");
    Change = Selected - i;

    i += Change * Speed;
    rt.anchorMax = new Vector2(i, 1);
    if (Change == 0) { Invoke("Enter", 0f);}
}


public void OnPointerExit(PointerEventData eventData) {
    Invoke("Exit", 0f);
}

void Exit() {

}

}

1 Answers1

1

Проблема с float такая, что у них есть некоторые особенности. Читайте про них тут: Вычисления на числах с плавающей точкой не работают

Поэтому как вариант: нужно сравнивать Change не с точным значением 0, а с некой дельтой, которая вас устраивала бы. Т.е. например if (Change < 0.1)