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(); } }