// ======================================================================================================================== private static IEnumerator ScatterCoroutine <T>(MonoBehaviour pCoroutineExecuter, T[] arrScatterObject, Vector3 vecPos, float fRange, float fDuration, delMovePositionCoroutine <T> OnScatteredObject_Coroutine, System.Action <T[]> OnFinishScatter, bool bUse2D) where T : Component { float fHalfRange = fRange * 0.5f; int iCount = arrScatterObject.Length; float fDelayAverage = fDuration / iCount; if (fDelayAverage < const_MinistDelay) { fDelayAverage = const_MinistDelay; } int iSpawnCount_PerFrame = Mathf.Clamp((int)(fDelayAverage * iCount), 1, iCount); System.Func <Vector3, float, Vector3> OnGetRandomPos = bUse2D ? (System.Func <Vector3, float, Vector3>)GetRandomPos_2D : GetRandomPos; if (OnScatteredObject_Coroutine == null) { OnScatteredObject_Coroutine = OnScatteredObject_Coroutine_Default; } for (int i = 0; i < iCount;) { for (int j = 0; j < iSpawnCount_PerFrame; j++) { int iIndex = i + j; if (iIndex >= iCount) { break; } T pObject = arrScatterObject[iIndex]; Vector3 vecRandomPos = OnGetRandomPos(vecPos, fHalfRange); pCoroutineExecuter.StartCoroutine(OnScatteredObject_Coroutine(pObject, vecPos, vecRandomPos)); } i += iSpawnCount_PerFrame; yield return(new WaitForSeconds(fDelayAverage)); } OnFinishScatter?.Invoke(arrScatterObject); }
/// <summary> /// 해당 위치에 흩뿌리기 /// </summary> public static Coroutine DoScattterCoroutine_2D <T>(MonoBehaviour pCoroutineExecuter, T pScatterObject, Vector3 vecPosition, float fRange, float fDuration, delMovePositionCoroutine <T> OnScatteredObject_Coroutine, System.Action <T[]> OnFinishScatter) where T : Component { return(pCoroutineExecuter.StartCoroutine(ScatterCoroutine(pCoroutineExecuter, new T[] { pScatterObject }, vecPosition, fRange, fDuration, OnScatteredObject_Coroutine, OnFinishScatter, true))); }