protected override Vector2 DoForceCalculation() { if (pursuer == null) { return(Vector2.zero); } int layerMask = LayerMask.GetMask(obstacleLayer); int obstacleCount = GetNearbyObjects(maxHideDistance, obstaclesInRange, layerMask); float distanceToNearest = float.MaxValue; Vector2 nearest = Vector2.zero; bool validPosExists = false; for (int i = 0; i < obstacleCount; i++) { Vector2 hidePos = GetHidingPosition(obstaclesInRange[i]); float distance = Vector2.Distance(transform.position, hidePos); if (distance < distanceToNearest) { distanceToNearest = distance; nearest = hidePos; validPosExists = true; } } if (validPosExists) { return(evade.CalculateForce()); } return(arrive.CalculateForce(nearest)); }
protected override Vector2 DoForceCalculation() { if (path2D == null) { return(Vector2.zero); } float speedPerFrame = Controller.MaxSpeed * Time.fixedDeltaTime; if (!finished && Vector2.Distance(transform.position, path2D[curWaypoint]) <= speedPerFrame) { curWaypoint = (curWaypoint + 1) % path2D.Length; if (!loop && curWaypoint == path2D.Length - 1) //End of path { finished = true; } } if (finished) { return(arrive.CalculateForce(path2D[curWaypoint])); } return(seek.CalculateForce(path2D[curWaypoint])); }
protected override Vector2 DoForceCalculation() { if (leader == null) { return(Vector2.zero); } Vector2 worldOffsetPos = leader.transform.localToWorldMatrix.MultiplyPoint(offsetPos); Vector2 toOffset = worldOffsetPos - (Vector2)transform.position; float lookAheadTime = toOffset.magnitude / (Controller.MaxSpeed - leader.velocity.magnitude); return(arrive.CalculateForce(worldOffsetPos + leader.velocity * lookAheadTime)); }