private void LaunchPlane(Plane plane, IReadOnlyList <AirportInfo> visibleAirports) { var centerWorld = GameMaster.Instance.MainCamera.transform.position; var center = WorldCoordinateHelper.WorldToLonLat(centerWorld); var cornerWorld = GameMaster.Instance.MainCamera.Camera.ViewportToWorldPoint(Vector3.one); var radius = Vector2.Distance(centerWorld, cornerWorld); var flight = _flightProvider.CreateFlight(visibleAirports, center, radius); plane.Fly(flight); }
//TODO Replace with spherical calculations private FlightInfo CreateTakeoffFlight(IReadOnlyList <AirportInfo> availableAirports, LonLat viewCenter, float radius) { var airport = availableAirports.PickRandom(); var dir = GetTakeoffDirection(airport); var startPoint = WorldCoordinateHelper.LonLatToWorld(airport.LonLat); var turnPoint = startPoint + dir * TakeoffDist; var turnPointSpherical = WorldCoordinateHelper.WorldToLonLat(turnPoint); var endPoint = WorldCoordinateHelper.LonLatToWorld(viewCenter) + Random.insideUnitCircle.normalized * (Settings.SafeDistanceMultiplier * radius); var endPointSpherical = WorldCoordinateHelper.WorldToLonLat(endPoint); return(new FlightInfo(new[] { airport.LonLat, turnPointSpherical, endPointSpherical }, true, false)); }
public void Fly(FlightInfo flightInfo) { RandomizeValues(); var waypoints = flightInfo.Points.Select(lat => (Vector3)WorldCoordinateHelper.LonLatToWorld(lat)); transform.position = waypoints.First(); var flyTween = transform .DOLocalPath(waypoints.Skip(1).ToArray(), _speed, pathMode: PathMode.TopDown2D, pathType: PathType.CatmullRom) .SetSpeedBased() .SetEase(Ease.Linear) .SetLookAt(0.01f) .OnComplete(() => this.WaitAndFire(() => OnFlightFinished?.Invoke(), _particleSystem.main.startLifetime.constant)); flyTween.OnStart(() => { if (flightInfo.EndsOnGround) { var duration = flyTween.Duration(); _spriteRenderer.transform .DOScale(_targetSize / 20, LandingDuration) .SetEase(Ease.InQuart) .SetDelay(duration - LandingDuration); } }); if (flightInfo.StartsOnGround) { _spriteRenderer.transform.localScale = Vector3.zero; _spriteRenderer.transform .DOScale(_targetSize, LandingDuration) .SetEase(Ease.OutCubic) ; } }
private FlightInfo CreatePassingFlight(IReadOnlyList <AirportInfo> availableAirports, LonLat viewCenter, float radius) { var center = WorldCoordinateHelper.LonLatToWorld(viewCenter); var startPoint = center + Random.insideUnitCircle.normalized * (Settings.SafeDistanceMultiplier * radius); var dir = (center - startPoint).normalized; var angle = Mathf.Atan2(dir.y, dir.x); Vector2?turnPoint = null; Vector2 endPoint; if (Random.Range(0, 1f) < Settings.PassingTurnProbability) { turnPoint = center + Random.insideUnitCircle * (0.3f * radius); const float halfPi = Mathf.PI / 2; endPoint = center + GetRandomVectorOnUnitCircle(angle - halfPi, angle + halfPi) * (Settings.SafeDistanceMultiplier * radius); } else { const float deg30 = Mathf.Rad2Deg * 30; endPoint = center + GetRandomVectorOnUnitCircle(angle - deg30, angle + deg30) * (Settings.SafeDistanceMultiplier * radius); } var startPointSpherical = WorldCoordinateHelper.WorldToLonLat(startPoint); var turnPointSpherical = turnPoint.HasValue ? WorldCoordinateHelper.WorldToLonLat(turnPoint.Value) : (LonLat?)null; var endPointSpherical = WorldCoordinateHelper.WorldToLonLat(endPoint); var points = turnPointSpherical.HasValue ? new[] { startPointSpherical, turnPointSpherical.Value, endPointSpherical } : new[] { startPointSpherical, endPointSpherical }; return(new FlightInfo(points)); }