Андрей

Assertion failed on expression: ‘m_InstanceID != InstanceID_None’

Сегодня нашел очень злой баг в юнити…

 

Assertion failed on expression: ‘m_InstanceID != InstanceID_None’
UnityEngine.Networking.DownloadHandlerTexture:get_texture()
Assets.Scripts.UI.Utils.<StartLoad>c__Iterator0:MoveNext() (at Assets/Scripts/UI/Utils/ImageLoader.cs:43)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

В общем DownloadHandlerTexture:get_texture — по мануалу должно вернуть текстуру или null, если юнити не смог воссоздать текстуру из полученных данных ИЛИ!!! если не успел распаковать картинку. Так вот в версии 5.4.4p3 юнити просто крашилась на попытке достать текстуру. Я заслал баг-репорт, на что получил ответ, что в 5,5 все уже починили…

Но оказалось они просто обернули это в try/catch, а баг по прежнему есть… В итоге выливается это в то, что даже имея в буфере валидные данные, юнити не отдаст по этому геттеру текстуру, даже если дергать его в цикле с тайматуом… пришлось сделать вот так вот:

                    var dh = (DownloadHandlerTexture) _request.downloadHandler;

                    var texture = dh.texture;

                    // bug workaround, when unity can't create texture even has correct data inside DownloadHandlerTexture
                    // ----- BEGIN ------
                    var tryCounter = 1;

                    const int maxTryCount = 10;

                    while (texture == null && tryCounter < maxTryCount)
                    {
                        Debug.LogWarningFormat("Received texture is null for url = {0}", _lastTriedUrl);
                        yield return new WaitForSeconds(0.2f);
                        texture = dh.texture;
                        ++tryCounter;
                    }
                    if (texture == null && dh.data != null && dh.data.Length > 0)
                    {
                        var t2D = new Texture2D(3,3);
                        t2D.LoadImage(dh.data);
                        texture = t2D;
                    }
                    // ----- END ------