public void RemoveUnit(IUnitEnemy unit) { Units.Remove(unit); GameUnitManager.RemoveUnit(unit); UnitChainEvaluator.Instance.RemoveUnit(unit); OnRemoveUnit(unit); }
public UnitPathRequestManager(IUnitEnemy unitEnemy) { _pathRequestTracker = new PathRequestTracker(); _unitEnemy = unitEnemy; _unitEnemyMover = new EnemyUnitMover(_unitEnemy.MonoBehaviour); _unitEnemy.KillHandler.OnDeath += ClearQueue; }
public static Vector2[] Path(IUnitEnemy unitEnemy, Vector2 targetPosition) { if (Player == null) { Player = Object.FindObjectOfType <Player>(); } var startingNode = NodeGrid.Instance.NodeFromWorldPosition(unitEnemy.Transform.position); var targetNode = NodeGrid.Instance.NodeFromWorldPosition(targetPosition); if (GameUnitManager.IsValidNodeFromUnit(targetNode, unitEnemy) && targetNode.IsWalkable) { var openSet = new Heap <Node>(NodeGrid.Instance.MaxSize); var closedSet = new HashSet <Node>(); openSet.Add(startingNode); while (openSet.Count > 0) { var currentNode = openSet.RemoveFirst(); closedSet.Add(currentNode); if (currentNode == targetNode) { return(RetracePath(startingNode, targetNode)); } foreach (var neighbor in NodeGrid.Instance.Neighbors(currentNode, _defaultNeighborScalar)) { if (!GameUnitManager.IsValidNodeFromUnit(neighbor, unitEnemy) || NodeGrid.Instance.NodeTooCloseToSafetyGrid(Player.transform.position, neighbor) || !GameUnitManager.IsValidNodeFromPlayer(neighbor, Player) || !neighbor.IsWalkable || closedSet.Contains(neighbor)) { continue; } var newMovementCostToNeighbor = currentNode.GCost + GetDistance(currentNode, neighbor); if (newMovementCostToNeighbor < neighbor.GCost || !openSet.Contains(neighbor)) { neighbor.GCost = newMovementCostToNeighbor; neighbor.HCost = GetDistance(neighbor, targetNode); neighbor.Parent = currentNode; if (!openSet.Contains(neighbor)) { openSet.Add(neighbor); } else { openSet.UpdateItem(neighbor); } } } } } return(null); }
public void RegisterUnit(IUnitEnemy unit) { Units.Add(unit); GameUnitManager.RegisterUnit(unit); UnitChainEvaluator.Instance.AddUnit(unit); OnRegisterUnit(unit); }
public UnitEventSpecificMovements(IUnitEnemy unitEnemy) { _unitEnemy = unitEnemy; Mover = unitEnemy.Transform; _player = Object.FindObjectOfType <Player>(); _fearPathValues = new PathValues(2f, 0.25f, 0.4f, PathType.EventBased); _fearTimer = _fearCoolDownTime; }
public static Vector2[] Path(IUnitEnemy unitEnemy, RingNode startingNode, RingNode targetRingNode) { if (!targetRingNode.IsWalkable() || !startingNode.IsWalkable()) { return(null); } Vector2[] pathToStartingRingNode = null; if (unitEnemy != null) { pathToStartingRingNode = Pathfinder.Path(unitEnemy, startingNode.RingPosition.transform.position); } var openSet = new Heap <RingNode>(RingManager.Instance.AllPositions.Count); var closedSet = new HashSet <RingNode>(); openSet.Add(startingNode); while (openSet.Count > 0) { var currentNode = openSet.RemoveFirst(); closedSet.Add(currentNode); if (currentNode == targetRingNode) { return(RetracePath(startingNode, targetRingNode, pathToStartingRingNode)); } foreach (var neighbor in RingManager.Instance.GetNeighborsFor(currentNode)) { if (!neighbor.IsWalkable() || closedSet.Contains(neighbor)) { continue; } var newMovementCostToNeighbor = currentNode.GCost + GetDistance(currentNode, neighbor); if (newMovementCostToNeighbor < neighbor.GCost || !openSet.Contains(neighbor)) { neighbor.GCost = newMovementCostToNeighbor; neighbor.HCost = GetDistance(neighbor, targetRingNode); neighbor.ParentRing = currentNode; if (!openSet.Contains(neighbor)) { openSet.Add(neighbor); } else { openSet.UpdateItem(neighbor); } } } } return(null); }
public UnitWayPointMover(IUnitEnemy enemyUnit) { _enemyUnit = enemyUnit; Mover = enemyUnit.Transform; _enemyUnit.KillHandler.OnDeath += () => { enemyUnit.UnitManager.TurnInRingPosition(_currentWayPoint as RingPosition); }; _ringPathValues = new PathValues(4, .1f, 1f, PathType.Ring); _spawnPathValues = new PathValues(3.5f, 0f, 0f, PathType.Spawn); }
public EnemyUnitMovementController(IUnitEnemy unitEnemy) { _unitPathRequestManager = new UnitPathRequestManager(unitEnemy); _wayPointMover = new UnitWayPointMover(unitEnemy); _wayPointMover.PathCompleted += RequestWayPointPath; RegisterPathRequester(_wayPointMover); _unitEventSpecificMovements = new UnitEventSpecificMovements(unitEnemy); _unitEventSpecificMovements.PathCompleted += RequestWayPointPath; RegisterPathRequester(_unitEventSpecificMovements); _unitEventSpecificMovements.PathCompleted += RequestWayPointPath; foreach (var pathRequestComponent in unitEnemy.MonoBehaviour.GetComponents <IPathRequester>()) { RegisterPathRequester(pathRequestComponent); pathRequestComponent.PathCompleted += RequestWayPointPath; } }
public void ResetClaim() { _unitEnemyMover = null; }
public void Claim(IUnitEnemy enemyUnitMover) { _unitEnemyMover = enemyUnitMover; }
protected abstract void OnRemoveUnit(IUnitEnemy unitEnemy);
protected abstract void OnRegisterUnit(IUnitEnemy unitEnemy);
protected override void OnRemoveUnit(IUnitEnemy unitEnemy) { }
protected override void OnRegisterUnit(IUnitEnemy unitEnemy) { }
protected override void OnRemoveUnit(IUnitEnemy unitEnemy) { unitEnemy.UnitAttack.OnAttackFinished -= IncreaseFinishedAttacks; }
protected override void OnRegisterUnit(IUnitEnemy unitEnemy) { unitEnemy.UnitAttack.OnAttackFinished += IncreaseFinishedAttacks; SetAttackingParameters(); }