Unity - Анимированное свойство не достигает конечного значения? - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю над игрой, использующей игровой движок Unity. Я хотел анимировать свой пользовательский интерфейс alpha с помощью группы холстов и аниматора. Анимационный клип просто анимирует свойство alpha с 0 до 1 за одну секунду. Когда я тестировал его, казалось, что он работает в игре, но когда я осмотрел свой объект, я увидел, что значение свойства alpha равно 0.9999998. Это незаметно в игре, но очень раздражает меня. Ключевой кадр в окне «Анимация» четко говорит 1 через одну секунду, но в конце анимации значение не совсем одно. пустой анимации, которая ничего не делает. Время перехода установлено на 1, длительность и смещение установлены на 0. Таким образом, он должен дождаться окончания альфа-анимации sh.

Есть ли причина, по которой значение альфа не достигает ровно 1, и есть ли способ это исправить?
Заранее спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Для практических целей Unity 0.9999998 - это ровно 1 (из-за проблем с плавающей запятой - так называемое деление и т. Д. c это не говорит о 1). Подробнее об этом:

https://en.wikipedia.org/wiki/Floating-point_arithmetic

Вот как вы обрабатываете сравнения с плавающей запятой в Unity:

Mathf.Approximately()

Документация: https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html

Неточность с плавающей запятой делает сравнение чисел с использованием оператора равенства неточным.

Пример C# кода, вы можете попытаться увидеть, как это работает:

float f1 = 0.9999998f;
float f2 = 1;

Debug.Log($"f1: {f1}, f2: {f2}, f1 == f2: {f1 == f2}, Mathf.Approximately(f1,f2): {Mathf.Approximately(f1, f2)}");

Как видите, выход:

f1: 0.9999998, f2: 1, f1 == f2: False, Mathf. Приблизительно (f1, f2): True

Если вы необходимо отобразить значение, затем отформатировать / округлить его и т. д. c.

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