public void OnEnter(DynamicBoneBeta target, ref DynamicBoneBeta.HeadInfo headInfo, NativeArray <DynamicBoneBeta.Particle> particleInfo, Transform[] particleTransformList)
 {
     m_loadingQueue.Enqueue(target);
 }
 public void OnExit(DynamicBoneBeta target, ref DynamicBoneBeta.HeadInfo headInfo)
 {
     m_removeQueue.Enqueue(target);
 }
    void UpdateQueue()
    {
        while (m_loadingQueue.Count > 0)
        {
            DynamicBoneBeta target = m_loadingQueue.Dequeue();

            int idx = m_dynamicBoneList.IndexOf(target);
            if (idx == -1)
            {
                m_dynamicBoneList.Add(target);



                target.m_headInfo.m_jobDataOffset = m_particleInfo.Length;

                int headIndex = m_headInfo.Length;
                target.m_headInfo.ResetHeadIndex(headIndex);

                m_headInfo.Add(target.m_headInfo);
                m_particleInfo.AddRange(target.m_Particles);
                m_headRootTransform.Add(target.m_rootParentTransform);

                for (int i = 0; i < DynamicBoneBeta.MAX_TRANSFORM_LIMIT; i++)
                {
                    m_particleTransformArr.Add(target.m_particleTransformArr[i]);
                }

                m_DbDataLen++;
            }
        }

        while (m_removeQueue.Count > 0)
        {
            DynamicBoneBeta target = m_removeQueue.Dequeue();

            int idx = m_dynamicBoneList.IndexOf(target);
            if (idx != -1)
            {
                m_dynamicBoneList.RemoveAt(idx);

                int curHeadIndex = target.m_headInfo.GetHeadIndex();

                //是否是队列中末尾对象
                bool isEndTarget = curHeadIndex == m_headInfo.Length - 1;
                if (isEndTarget)
                {
                    m_headInfo.RemoveAtSwapBack(curHeadIndex);
                    m_headRootTransform.RemoveAtSwapBack(curHeadIndex);

                    for (int i = DynamicBoneBeta.MAX_TRANSFORM_LIMIT - 1; i >= 0; i--)
                    {
                        int dataOffset = curHeadIndex * DynamicBoneBeta.MAX_TRANSFORM_LIMIT + i;
                        m_particleInfo.RemoveAtSwapBack(dataOffset);
                        m_particleTransformArr.RemoveAtSwapBack(dataOffset);
                    }
                }
                else
                {
                    //将最末列的HeadInfo 索引设置为当前将要移除的HeadInfo 索引
                    DynamicBoneBeta lastTarget = m_dynamicBoneList[m_dynamicBoneList.Count - 1];

                    DynamicBoneBeta.HeadInfo lastHeadInfo = lastTarget.ResetHeadIndexAndDataOffset(curHeadIndex);

                    m_headInfo.RemoveAtSwapBack(curHeadIndex);

                    m_headInfo[curHeadIndex] = lastHeadInfo;

                    m_headRootTransform.RemoveAtSwapBack(curHeadIndex);

                    for (int i = DynamicBoneBeta.MAX_TRANSFORM_LIMIT - 1; i >= 0; i--)
                    {
                        int dataOffset = curHeadIndex * DynamicBoneBeta.MAX_TRANSFORM_LIMIT + i;
                        m_particleInfo.RemoveAtSwapBack(dataOffset);
                        m_particleTransformArr.RemoveAtSwapBack(dataOffset);
                    }
                }

                m_DbDataLen--;
            }

            target.ClearJobData();
        }
    }