public static bool TryFindPath(this LocalPlayerCharacterView instance, AStarPathfinder pathfinder, SimulationObjectView target, StopFunction <Vector2> stopFunction, out List <Vector3> results) { results = new List <Vector3>(); if (instance.TryFindPath(pathfinder, target.transform.position, stopFunction, out results)) { /* * var collider = target.GetComponent<Collider>(); * * if (collider != null) * { * while (collider.bounds.Contains(results.Last())) * results.RemoveAt(results.Count - 1); * * var lastNode = results.Last(); * var closestNode = collider.ClosestPointOnBounds(lastNode); * var direction = (closestNode - lastNode).normalized / 2; * * results.Add(closestNode - direction); * } * * results.Insert(0, instance.transform.position); */ } else { return(false); } return(true); }
public static bool TryFindPath(this LocalPlayerCharacterView instance, AStarPathfinder pathfinder, SimulationObjectView target, StopFunction <Vector2> stopFunction, out List <Vector3> results) { return(instance.TryFindPath(pathfinder, target.transform.position, stopFunction, out results)); }
public void Continue() { switch (_state.State) { case State.Pause: { var previousNode = _completedpath[_completedpath.Count - 1]; var playerPosV2 = new Vector2(_player.transform.position.x, _player.transform.position.z); var previousNodeV2 = new Vector2(previousNode.x, previousNode.z); var target2D = new Vector2(_target.x, _target.z); var distanceToTarget = Vector2.Distance(playerPosV2, target2D); var distancePreviousToNode = (playerPosV2 - previousNodeV2).sqrMagnitude; var minimumDistance = 2f; _landscape = _client.GetLandscapeManager(); Core.Log("Paused"); if (DateTime.Now < _notMovingTimer) { Core.Log("Checking for movement restart"); isMovingUpdate(); if (IsMoving) { Core.Log("MOVING AGAIN"); _state.Fire(Trigger.ApproachTarget); break; } break; } if (distanceToTarget < 40 && _allowMinDistCheck) { Core.Log($"The target {target2D} is {distanceToTarget} from this position {playerPosV2}"); Core.Log("@ target"); _state.Fire(Trigger.ReachedTarget); break; } if (DateTime.Now > _pauseTimer) { _state.Fire(Trigger.ReachedTarget); break; } if (_completedpath.Count < 1) { Vector3 randomSpot = new Vector3(UnityEngine.Random.Range(-100f, 100f), 0, UnityEngine.Random.Range(-100f, 100f)) + _player.transform.position; _completedpath.Add(randomSpot); break; } if (_path.Count < 2) { _player.RequestMove(_player.transform.position + new Vector3(UnityEngine.Random.Range(-100f, 100f), 0, UnityEngine.Random.Range(-100f, 100f))); } if (distancePreviousToNode < minimumDistance) { if (_player.TryFindPath(new ClusterPathfinder(), _target, IsBlockedWithExitCheck, out List <Vector3> pathing)) { Core.Log("Reached Previous Node and found path"); _path = pathing; _state.Fire(Trigger.Restart); break; } else { Core.Log("Reached Previous Node and didnt find path. Moving to next previous node"); _completedpath.RemoveAt(_completedpath.Count - 1); _pauseTimer = DateTime.Now + TimeSpan.FromSeconds(15); } } else { _player.RequestMove(previousNode); } break; } case State.Start: { Core.Log($"Position pathing request path count {_path.Count}"); if (_path.Count > 0) { _state.Fire(Trigger.ApproachTarget); } else { _state.Fire(Trigger.ReachedTarget); } break; } case State.Running: { //Early exit if player is null. if (_player == null) { _state.Fire(Trigger.ReachedTarget); break; } isMovingUpdate(); // Core.Log($"Position pathing request is Moving {IsMoving} at { _player.transform.position}"); if (!IsMoving) { _notMovingTimer = DateTime.Now + TimeSpan.FromSeconds(1.5); _pauseTimer = DateTime.Now + TimeSpan.FromSeconds(15); Core.Log($"Stuck Position Pathing Request During Running. State is {_state}"); _state.Fire(Trigger.Stuck); Core.Log($"Position Pathing Request During Running 2. State is {_state}"); } var currentNode = _path[0]; var minimumDistance = 3f; if (_path.Count < 2 && _useCollider) { minimumDistance = _player.GetColliderExtents(); var directionToPlayer = (_player.transform.position - _target).normalized; var bufferDistance = directionToPlayer * minimumDistance; currentNode = _target + bufferDistance; } var playerPosV2 = new Vector2(_player.transform.position.x, _player.transform.position.z); var currentNodeV2 = new Vector2(currentNode.x, currentNode.z); var distanceToNode = (playerPosV2 - currentNodeV2).sqrMagnitude; if (distanceToNode < minimumDistance) { _completedpath.Add(_path[0]); _path.RemoveAt(0); } else { _player.RequestMove(currentNode); } if (_path.Count > 0) { break; } _state.Fire(Trigger.ReachedTarget); break; } } }