Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Bug An exception occurs in IndexedSet.ToList

Discussion in 'UGUI & TextMesh Pro' started by Takaaki-Hoshiyama, Oct 16, 2022.

  1. Takaaki-Hoshiyama

    Takaaki-Hoshiyama

    Joined:
    Apr 6, 2014
    Posts:
    2
    Hello

    I write this code.

    var canvasGraphics = GraphicRegistry.GetRaycastableGraphicsForCanvas(_canvas).ToList();


    This code works fine the first time.
    But when, destroy some parts of the UI, An exception occurs.

    System.Collections.Generic.List`1[T].CopyTo (T[] array, System.Int32 arrayIndex) (at <c2a97e0383e8404c9fc0ae19d58f57f1>:0)
    UnityEngine.UI.Collections.IndexedSet`1[T].CopyTo (T[] array, System.Int32 arrayIndex) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/SpecializedCollections/IndexedSet.cs:121)
    System.Collections.Generic.List`1[T]..ctor (System.Collections.Generic.IEnumerable`1[T] collection) (at <c2a97e0383e8404c9fc0ae19d58f57f1>:0)
    System.Linq.Enumerable.ToList[TSource] (System.Collections.Generic.IEnumerable`1[T] source) (at <93223d662c2546d4b5d1784737504095>:0)
    SRD.Utils.SRDGraphicRaycaster.Raycast (UnityEngine.EventSystems.PointerEventData eventData, System.Collections.Generic.List`1[T] resultAppendList) (at Assets/SRDisplayUnityPlugin/Runtime/Utils/SRDGraphicRaycaster.cs:85)


    This is because you are trying to copy the empty part of m_List as well.
    However, the allocated array is only for m_EnabledObjectCount, so the capacity is not enough.

    I am getting around the exception with the source code below.

     
    var tempCanvasGraphics = GraphicRegistry.GetRaycastableGraphicsForCanvas(_canvas);
    if(tempCanvasGraphics == null || tempCanvasGraphics.Count == 0)
    {
    return;
    }
    var canvasGraphics = new Graphic[tempCanvasGraphics.Count];
    for (var i = 0; i < tempCanvasGraphics.Count; i++)
    {
    canvasGraphics[i] = tempCanvasGraphics[i];
    }


    Thanks.