예제 #1
0
    // ========================================================================================================================

    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);
    }
예제 #2
0
 /// <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)));
 }