private void CalculateCurve_3D(ref SMagneticInfo sMagneticInfo, ref Vector3 vecDirection)
    {
        float fX = Mathf.Abs(vecDirection.x);
        float fY = Mathf.Abs(vecDirection.y);
        float fZ = Mathf.Abs(vecDirection.z);

        if (fX > fY)
        {
            if (fX > fZ)
            {
                vecDirection.x *= CalculateCurveSpeed(ref sMagneticInfo);
            }
            else
            {
                vecDirection.z *= CalculateCurveSpeed(ref sMagneticInfo);
            }
        }
        else
        {
            if (fY > fZ)
            {
                vecDirection.y *= CalculateCurveSpeed(ref sMagneticInfo);
            }
            else
            {
                vecDirection.z *= CalculateCurveSpeed(ref sMagneticInfo);
            }
        }
    }
    private Vector3 CalculateMagneticForce(ref SMagneticInfo sMagneticInfo, Vector3 vecDirection, bool bUseCurve)
    {
        float fDistancePower;

        if (p_eMagnetReactType == EMagneticType.Pull)
        {
            fDistancePower = (_fSqrMagneticRange - vecDirection.sqrMagnitude);
        }
        else
        {
            fDistancePower = vecDirection.sqrMagnitude * p_fMagnetPower;
        }

        float fMagnetPower = fDistancePower + p_fMagnetPower_Min;

        if (fMagnetPower > p_fMagnetPower_Max)
        {
            fMagnetPower = p_fMagnetPower_Max;
        }

        vecDirection.Normalize();
        if (bUseCurve)
        {
            vecDirection = CalculateCurve(ref sMagneticInfo, vecDirection);
        }

        return((vecDirection * fMagnetPower * sMagneticInfo.fRandomSpeed * Time.deltaTime) * (int)p_eMagnetReactType);
    }
    private float CalculateCurveSpeed(ref SMagneticInfo sMagneticInfo)
    {
        float fProgress_0_1 = (Time.time - sMagneticInfo.fMagneticStartTime) / p_fCurvePower;

        if (fProgress_0_1 < 0.5f)
        {
            return(((1 - fProgress_0_1) * -2f) + 1f);
        }
        else
        {
            return((fProgress_0_1 * 2f) - 1f);
        }
    }
    private void OnStay(int iHashCode, Transform pTrans)
    {
        if (_mapMagneticPool.ContainsKey(iHashCode) == false)
        {
            return;
        }

        SMagneticInfo sMagneticInfo          = _mapMagneticPool[iHashCode];
        Vector3       vecDirection           = transform.position - pTrans.position;
        Vector3       vecMagneticForce       = CalculateMagneticForce(ref sMagneticInfo, vecDirection, p_bUseCurvePull);
        Vector3       vecNewPosition         = pTrans.position + vecMagneticForce;
        float         fAfterSimulateDistance = (transform.position - vecNewPosition).sqrMagnitude;

        if (CheckIs_FinishMagnetic(vecDirection, fAfterSimulateDistance))
        {
            if (sMagneticInfo.bIsStartMagnetic && p_eMagnetReactType == EMagneticType.Pull)
            {
                pTrans.position = transform.position;
            }

            sMagneticInfo.Event_OnDestroy();
            _mapMagneticPool.Remove(iHashCode);
            p_Event_OnMagneticFinish.DoNotify(pTrans);
        }
        else
        {
            if (sMagneticInfo.bIsStartMagnetic)
            {
                if (p_bUsePhysics)
                {
                    sMagneticInfo.AddForce(vecMagneticForce);
                }
                else
                {
                    pTrans.position = vecNewPosition;
                }
            }
        }
    }
    private Vector3 CalculateCurve(ref SMagneticInfo sMagneticInfo, Vector3 vecDirection)
    {
        // Trigger 경계선에 가깝다면 일단 그대로 빨려들게 하기
        // 이걸 적용 안하면 경계선에서 자꾸 밀린다.
        if (Mathf.Abs(vecDirection.sqrMagnitude - _fSqrMagneticRange) < vecDirection.sqrMagnitude * p_fRangePercent_EffectCurve)
        {
            return(vecDirection);
        }

        if (sMagneticInfo.fMagneticStartTime + p_fCurvePower > Time.time)
        {
            if (_bIs2D)
            {
                CalculateCurve_2D(ref sMagneticInfo, ref vecDirection);
            }
            else
            {
                CalculateCurve_3D(ref sMagneticInfo, ref vecDirection);
            }
        }

        return(vecDirection);
    }