private MovementActionStrategy GetStrategy(MovementAction action) { switch (action.Type) { case MovementType.StartPoint: return(new StartPointStrategy(_rigidbody, action.Point, _formationCell)); case MovementType.MoveToPoint: return(new MoveToPointStrategy(_rigidbody, action.Point, _speed, _rotationSpeed)); case MovementType.MoveToPlayer: return(new MoveToPlayerStrategy(_rigidbody, _player, action.Point, _speed, _rotationSpeed)); case MovementType.MoveToFormation: return(new MoveToFormationStrategy(_rigidbody, _formationCell, _speed, _rotationSpeed)); case MovementType.JoinFormation: return(new JoinFormationStrategy(_rigidbody, _formationCell)); case MovementType.GoOffscreen: return(new MoveOffscreenStrategy(_rigidbody, _speed, _rotationSpeed)); default: throw new ArgumentOutOfRangeException(); } }
private Task DoAction(MovementAction action) { var strategy = GetStrategy(action); var tcs = new TaskCompletionSource <Unit>(); strategy.Finished += () => tcs.TrySetResult(Unit.Default); _currentStrategy = strategy; return(tcs.Task); }