// Update //---------------------------------------------------------- public void Update(float tDelta) { if (!_isAnyForceUnit) { return; } int nForce = _forceUnits.Count; apForceUnit curForce = null; bool isAnyRemoved = false; for (int i = 0; i < nForce; i++) { curForce = _forceUnits[i]; if (curForce.Update(tDelta)) { isAnyRemoved = true; //뭔가 없애야 할게 있다. } } if (isAnyRemoved) { //업데이트가 종료되어 Live가 아닌 것들을 삭제하자 _forceUnits.RemoveAll(delegate(apForceUnit a) { return(!a.IsLive); }); } //PulledTouch는 업데이트하지 않아요 }
public apForceUnit AddForce_Direction(Vector2 directionW, Vector2 waveSize, Vector2 waveTime) { apForceUnit newForce = apForceUnit.Make().SetShape(directionW, waveSize, waveTime); _forceUnits.Add(newForce); _isAnyForceUnit = true; return(newForce); }
// Functions //---------------------------------------------------------- // Make Force //---------------------------------------------------------- public apForceUnit AddForce_Point(Vector2 pointPosW, float radius) { apForceUnit newForce = apForceUnit.Make().SetShape(pointPosW, radius); _forceUnits.Add(newForce); _isAnyForceUnit = true; return(newForce); }
public Vector2 GetForce(Vector2 targetPosW) { if (!_isAnyForceUnit) { return(Vector2.zero); } _tmpF_Sum = Vector2.zero; int nForce = _forceUnits.Count; apForceUnit curForce = null; Vector2 vecPower2Target = Vector2.zero; for (int i = 0; i < nForce; i++) { curForce = _forceUnits[i]; if (!curForce.IsLive) { continue; } if (curForce.ShapeType == apForceUnit.SHAPE_TYPE.Point) { //Point 타입이면 //방향을 직접 계산해서 힘을 가해야한다. //거리에 따라 멀어지면 힘이 선형으로 줄어든다.. if (curForce.PointRadius < 0.001f) { continue; } vecPower2Target = (targetPosW - curForce.PointPos); float distItp = Mathf.Clamp01(1.0f - (vecPower2Target.magnitude / curForce.PointRadius)); float power = curForce.Power * distItp; _tmpF_Sum += vecPower2Target.normalized * power; } else { //Direction 타입이면 //그냥 그 자체로 사용하면 된다. _tmpF_Sum += curForce.Direction * curForce.Power; } } return(_tmpF_Sum); }