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