Пример #1
0
 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;
 }
Пример #3
0
    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);
    }
Пример #4
0
 public void RegisterUnit(IUnitEnemy unit)
 {
     Units.Add(unit);
     GameUnitManager.RegisterUnit(unit);
     UnitChainEvaluator.Instance.AddUnit(unit);
     OnRegisterUnit(unit);
 }
Пример #5
0
 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;
 }
Пример #6
0
    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);
    }
Пример #8
0
    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;
        }
    }
Пример #9
0
 public void ResetClaim()
 {
     _unitEnemyMover = null;
 }
Пример #10
0
 public void Claim(IUnitEnemy enemyUnitMover)
 {
     _unitEnemyMover = enemyUnitMover;
 }
Пример #11
0
 protected abstract void OnRemoveUnit(IUnitEnemy unitEnemy);
Пример #12
0
 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();
 }