protected override async ValueTask UpdateCore(GameContext game) { if (_path is null || (!_path.Any() && _currPathNode is null)) { return; } _currPathNode ??= _path.Next(); var tilePos = _mapRenderer.GetTilePos(_currPathNode); var newPos = Vector2Utils.MoveTowards(_transform.World.Position, tilePos, Speed); _transform.Local.Position = newPos; var dist = Vector2.DistanceSquared(newPos, tilePos); if (dist < Speed) { _currPathNode = null; _transform.Local.Position = tilePos; if (!_path.Any()) { _path = null; OnArrived?.Invoke(this); } } }
protected override ValueTask Init(GameContext game) { var map = game.SceneManager.Current.FindGameObjectByName(ObjectNames.Map); _mapRenderer = map.Components.Get <MapRenderComponent>(); _movementCursor = game.SceneManager.Current.FindGameObjectByName(ObjectNames.MovementCursor); var pathFollower = this.Owner.Components.Get <PathFollowerComponent>(); pathFollower.OnStartWalking += (_, from, to) => { var tilePos = _mapRenderer.GetTilePos(to); _movementCursor.Components.Get <TransformComponent>().Local.Position = tilePos; _movementCursor.Enabled = true; }; pathFollower.OnArrived += _ => { _movementCursor.Enabled = false; var newState = new AI.States.Idle(this.Owner, 0f); base.SetState(game, newState); }; _inputService = game.GetService <InputService>(); _inputService.Mouse.OnButtonStateChanged += (btn, state, oldState) => { if (btn != MouseButtons.Left) { return; } if (!state.IsClicked && oldState.IsClicked) { _movementCursor.Enabled = false; var destination = _mapRenderer.GetTileAt(_inputService.Mouse.X, _inputService.Mouse.Y); if (!destination.IsWalkable) { return; } var newState = new AI.States.Arrive(this.Owner); newState.SetDestination(destination); base.SetState(game, newState); } }; return(ValueTask.CompletedTask); }