예제 #1
0
    public PatrolRoute CreatePatrolRoute()
    {
        PatrolRoute pr = Instantiate(patrolRoute, transform).GetComponent <PatrolRoute>();

        patrolRoutes.Add(pr);
        return(pr);
    }
        public void PatralRoute_SingleSegmentRoutesWithDifferentStartsMatch_False()
        {
            var route1 = new PatrolRoute(new Path(new XYZ(1, 1, 1), new XYZ(2, 2, 2)));
            var route2 = new PatrolRoute(new Path(new XYZ(3, 3, 3), new XYZ(2, 2, 2)));

            Assert.IsFalse(route1.Matches(route2));
        }
예제 #3
0
    void FindClosestPatrol()
    {
        /*Find all patrol points
         * Get Closest
         * Find the parent patrol
         * Start patrol
         */
        PatrolPoint[] allPatrolPoints      = GameObject.FindObjectsOfType <PatrolPoint>();
        float         closestPointDistance = 1000.0f;

        if (allPatrolPoints.Length != 0)
        {
            if (allPatrolPoints.Length == 1)
            {
                closestPoint = allPatrolPoints[0];
            }
            else if (allPatrolPoints.Length > 1)
            {
                foreach (PatrolPoint pp in allPatrolPoints)
                {
                    float dist = Vector3.Distance(transform.position, pp.transform.position);
                    if (dist < closestPointDistance)
                    {
                        closestPointDistance = dist;
                        closestPoint         = pp;
                    }
                }
            }
            closestRoute = closestPoint.GetParentRoute();
        }
    }
예제 #4
0
 public Guard(IGuardBody guard, XYZ startLocation, IEvents eventNotification)
 {
     _guard           = guard;
     _currentLocation = startLocation;
     _patrolRoute     = new PatrolRoute(new Path(startLocation));
     _patrolSegments.Add(new Path(startLocation));
     eventNotification.Subscribe <GameStartEvent>(start => Go());
 }
 public AIStateSystemMove(PatrolRoute patrolRoute)
 {
     PatrolRoute = patrolRoute;
     if (patrolRoute)
     {
         PatrolPoints = patrolRoute.patrolPoints;
     }
 }
 public override void ExecuteState(Person person)
 {
     if (person.dest == person.curr)
     {
         PatrolRoute route = person.obj.GetComponent <PatrolRoute>();
         route.SetCurrIndex(route.currIndex + 1);
         SetDest(person, route);
     }
 }
    private void OnEnable()
    {
        PatrolRoute patrolRoute = target as PatrolRoute;

        if (patrolRoute.patrolPoints == null)
        {
            patrolRoute.patrolPoints = new List <Vector3>();
        }
    }
        public void PatrolRouteProposal_ConstructedWithPatrolRoute_UsesRoute()
        {
            var oldRoute = new PatrolRoute(new Path(new XYZ(0, 1, 0)), new Path(new XYZ(0, 0, 0)));
            var proposal = new PatrolRouteProposal(_map, oldRoute, path => { });

            var newRoute = proposal.Finalize();

            new RouteComparison(oldRoute, newRoute).EnsureMatches();
        }
예제 #9
0
        /// <summary>Создаёт монстров в секторе по указанной схеме.</summary>
        /// <param name="sector">Целевой сектор.</param>
        /// <param name="monsterPlayer">Бот, управляющий монстрами. По сути, команда монстров.</param>
        /// <param name="monsterRegions">Регионы сектора, где могут быть монстры.</param>
        /// <param name="sectorScheme">Схема сектора. Отсюда берутся параметры генерации монстров.</param>
        public void CreateMonsters(ISector sector,
                                   IBotPlayer monsterPlayer,
                                   IEnumerable <MapRegion> monsterRegions,
                                   ISectorSubScheme sectorScheme)
        {
            var rarityCounter    = new int[3];
            var rarityMaxCounter = new[] { -1, 10, 1 };

            foreach (var region in monsterRegions)
            {
                var freeNodes = new List <IMapNode>(region.Nodes);

                var monsterCount = _generatorRandomSource.RollRegionCount(sectorScheme.RegionMonsterCount);

                for (int i = 0; i < monsterCount; i++)
                {
                    // если в комнате все места заняты
                    if (!freeNodes.Any())
                    {
                        break;
                    }

                    var currentRarity       = GetMonsterRarity(rarityCounter, rarityMaxCounter);
                    var availableSchemeSids = GetAvailableSchemeSids(sectorScheme, currentRarity);

                    var availableMonsterSchemes = availableSchemeSids.Select(x => _schemeService.GetScheme <IMonsterScheme>(x));

                    var monsterScheme = _generatorRandomSource.RollMonsterScheme(availableMonsterSchemes);

                    // первый монстр ходит по маршруту
                    // остальные бродят произвольно
                    if (i == 0)
                    {
                        // генерируем маршрут обхода
                        var startPatrolNode = region.Nodes.First();
                        var endPatrolNode   = region.Nodes.Last();

                        // генерируем моснтра
                        var patrolRoute = new PatrolRoute(startPatrolNode, endPatrolNode);
                        var monster     = CreateMonster(monsterScheme, startPatrolNode, monsterPlayer);
                        sector.PatrolRoutes[monster] = patrolRoute;

                        freeNodes.Remove(monster.Node);
                    }
                    else
                    {
                        var rollIndex   = _generatorRandomSource.RollNodeIndex(freeNodes.Count);
                        var monsterNode = freeNodes[rollIndex];
                        var monster     = CreateMonster(monsterScheme, monsterNode, monsterPlayer);

                        freeNodes.Remove(monster.Node);
                    }
                }
            }
        }
    public PatrolState(AIAgent agent, PatrolRoute route, float movementSpeed, float waitDuration)
    {
        _agent           = agent;
        _route           = route;
        _navAgent        = _agent.GetComponent <NavMeshAgent>();
        _fov             = _agent.GetComponent <FieldOfView>();
        _soundPerception = _agent.GetComponentInChildren <SoundPerception>();

        _waitDuration   = waitDuration;
        _navAgent.speed = movementSpeed;
    }
예제 #11
0
 public void CreateCheckpoint(PatrolRoute pr, int x, int y)
 {
     if (x > 0 && x < level_grid_size && y >= 0 && y < level_grid_size)
     {
         if (levelGrid[x, y] != null)
         {
             GameObject newCheckPoint = Instantiate(checkpoint, levelGrid[x, y].transform);
             newCheckPoint.transform.localPosition = new Vector3(0, 0, 0);
             pr.checkpoints.Add(newCheckPoint);
         }
     }
 }
예제 #12
0
 private void GotoPoint(PatrolPoint targetPoint)
 {
     if (targetPoint != null)
     {
         navAgent.destination = targetPoint.transform.position;
         point = targetPoint;
     }
     else
     {
         route = PatrolRoute.GetNewRoute(route);
     }
 }
예제 #13
0
    public static PatrolRoute GetNewRoute(PatrolRoute previousRoute = null)
    {
        if (previousRoute != null)
        {
            previousRoute.DismissGuard();
        }

        PatrolRoute avilableRoute = routes.RandomWeighted(x => totalGuardsOnPatrol - x.guardsOnPatrol);

        avilableRoute.RegisterGuard();
        Debug.Log(avilableRoute);
        return(avilableRoute);
    }
        public void PatrolRouteProposal_AddNodeToExistingRoute_SegmentAddedCorrectly()
        {
            var oldRoute = new PatrolRoute(new Path(new XYZ(0, 0, 0), new XYZ(0, 1, 0)));
            var proposal = new PatrolRouteProposal(_map, oldRoute, path => { });

            proposal.AddPathToDestination(new XYZ(0, 2, 0));

            var route = proposal.Finalize();

            AssertRouteOrginsMatch(new List <XYZ> {
                new XYZ(0, 0, 0), new XYZ(0, 1, 0), new XYZ(0, 2, 0),
                new XYZ(0, 1, 0)
            }, route);
        }
예제 #15
0
    private void SpawnPeople()
    {
        int           spawnAmt = Random.Range(spawnMin, spawnMax + 1);
        List <Person> people   = new List <Person>();
        PatrolRoute   route    = GetComponent <PatrolRoute>();

        for (int i = 0; i < spawnAmt; i++)
        {
            people.Add(PeopleManager.Instance.SpawnPerson(transform.position, type, gameObject.name, CameraManager.Instance.col, defaultState, route));
            people[i].SetDir((dir == -1 ? Random.Range(0, 4) : dir));
        }
        PeopleManager.Instance.AddCurrPeople(people);
        currTime = spawnRate;
    }
예제 #16
0
    // Start is called before the first frame update
    public void StartNewPatrol(PatrolRoute route, int unitAP)
    {
        isPatroling  = true;
        patrolPoints = route.GetPatrolPositions();
        //From their current position, they need to find the closest waypoint.
        //Get its index, that is the first destination point.
        nextPatrolPointIndex = FindClosestPatrolPointIndex();
        curDestination       = patrolPoints[nextPatrolPointIndex];

        //patrol has been initiated. Unit needs to being loop of moving to next waypoint.
        //If  not at a waypoint, get path to next waypoint from pathfinder.If path is longer than AP, means wont get there, Truncate path to the end of available AP. Get it cleaned up by path requester. Tell nav agent to move there up to its move speed. End turn
        //If not at a waypoint, get path to next waypoint ... if path is =to or less than available AP, means you will arrive there this turn. clean up path, tell nav agent to move. Set Destination reached flag to true.
        //If destination reached flag is true, Set destination to next waypoint. Get path, get it cleaned up, tell nav agent to move up to its move speed.
        ContinuePatrol(unitAP);
    }
예제 #17
0
    public void Enter()
    {
        PatrolRoute newRoute = PatrolRoute.GetNewRoute();

        navAgent.isStopped = false;
        navAgent.speed     = SPEED;

        if (newRoute != route)
        {
            route = newRoute;
            point = null;
        }

        GotoPoint(point);
    }
예제 #18
0
        private void CreateRoomMonsters(ISector sector, IEnumerable <Room> rooms)
        {
            var monsterScheme = _schemeService.GetScheme <MonsterScheme>("rat");

            foreach (var room in rooms)
            {
                var person    = new MonsterPerson(monsterScheme);
                var startNode = room.Nodes.FirstOrDefault();
                var actor     = new Actor(person, _botPlayer, startNode);
                _actorManager.Add(actor);

                var finishPatrolNode = room.Nodes.Last();
                var patrolRoute      = new PatrolRoute(new[] { startNode, finishPatrolNode });
                sector.PatrolRoutes[actor] = patrolRoute;
            }
        }
예제 #19
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        PatrolRoute patrol = (PatrolRoute)target;

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("+"))
        {
            patrol.AddPoint();
        }
        if (GUILayout.Button("-"))
        {
            patrol.RemovePoint();
        }
        EditorGUILayout.EndHorizontal();
    }
    public override void OnInspectorGUI()
    {
        PatrolRoute patrolRoute = target as PatrolRoute;

        if (patrolRoute.patrolPoints.Count == 0)
        {
            if (GUILayout.Button("Add Patrol Point") && patrolRoute.patrolPoints.Count == 0)
            {
                patrolRoute.patrolPoints.Add(patrolRoute.transform.position + Vector3.right * 2);
            }
            return;
        }

        for (int i = 0; i < patrolRoute.patrolPoints.Count; i++)
        {
            GUILayout.Label(patrolRoute.patrolPoints[i] + "");
            if (GUILayout.Button("Remove Point " + (i + 1), GUILayout.Width(150)))
            {
                patrolRoute.patrolPoints.RemoveAt(i);
            }
        }
        GUILayout.Space(10);

        if (GUILayout.Button("Add Patrol Point"))
        {
            patrolRoute.patrolPoints.Add(patrolRoute.transform.position + Vector3.right * 2);
        }

        GUILayout.Space(10);

        if (GUILayout.Button("Stick Points to Ground"))
        {
            patrolRoute.StickToGround();
        }

        GUILayout.Space(20);

        if (GUILayout.Button("Remove All Points"))
        {
            patrolRoute.patrolPoints.Clear();
        }

        EditorUtility.SetDirty(target);
    }
예제 #21
0
    public override void Initialise()
    {
        myController = this.gameObject.GetComponent <NPCController> ();

        if (myRoute == null)
        {
            if (myController.memory.myRoute == null)
            {
                myRoute = LevelController.me.getRandomRoute();
            }
            else
            {
                myRoute = myController.memory.myRoute;
            }
        }
        myController.memory.myRoute = myRoute;
        myType = behaviourType.patrol;
        myController.pf.getPath(this.gameObject, myRoute.pointsInRoute [counter]);
        //////Debug.LogError ("get path 1");
        radioMessageOnStart();
        isInitialised = true;
    }
예제 #22
0
    private void OnSceneGUI()
    {
        PatrolRoute route           = target as PatrolRoute;
        Transform   handleTransform = route.transform;
        Quaternion  handleRotation  = Tools.pivotRotation == PivotRotation.Local ? handleTransform.rotation : Quaternion.identity;

        if (null == route.m_aPoints)
        {
            return;
        }

        for (uint i = 0; i < route.m_aPoints.Length - 1; ++i)
        {
            Vector3 p0 = handleTransform.TransformPoint(route.m_aPoints[i]);
            Vector3 p1 = handleTransform.TransformPoint(route.m_aPoints[i + 1]);

            Handles.color = Color.white;
            Handles.DrawLine(p0, p1);
            Handles.DoPositionHandle(p0, handleRotation);
            Handles.DoPositionHandle(p1, handleRotation);

            EditorGUI.BeginChangeCheck();
            p0 = Handles.DoPositionHandle(p0, handleRotation);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(route, "Move Point");
                EditorUtility.SetDirty(route);
                route.m_aPoints[i] = handleTransform.InverseTransformPoint(p0);
            }
            EditorGUI.BeginChangeCheck();
            p1 = Handles.DoPositionHandle(p1, handleRotation);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(route, "Move Point");
                EditorUtility.SetDirty(route);
                route.m_aPoints[i + 1] = handleTransform.InverseTransformPoint(p1);
            }
        }
    }
예제 #23
0
        public void GivenДляМонстраIdЗаданМаршрут(int monsterId, Table table)
        {
            var sector = Context.GetSector();

            var patrolPoints = new List <IGraphNode>();

            foreach (var tableRow in table.Rows)
            {
                tableRow.TryGetValue("x", out var routeX);
                tableRow.TryGetValue("y", out var routeY);

                var routeNode = sector.Map.Nodes.Cast <HexNode>()
                                .Single(node => node.OffsetCoords.X == int.Parse(routeX) && node.OffsetCoords.Y == int.Parse(routeY));

                patrolPoints.Add(routeNode);
            }

            var route = new PatrolRoute(patrolPoints.ToArray());

            var monster = Context.GetMonsterById(monsterId);

            sector.PatrolRoutes[monster] = route;
        }
    private void OnSceneGUI()
    {
        PatrolRoute patrolRoute = target as PatrolRoute;

        if (patrolRoute.patrolPoints.Count == 0)
        {
            return;
        }

        for (int i = 0; i < patrolRoute.patrolPoints.Count; i++)
        {
            Vector3 point = patrolRoute.patrolPoints[i];
            point = Handles.DoPositionHandle(point, Quaternion.identity);
            patrolRoute.patrolPoints[i] = Handles.PositionHandle(point, Quaternion.identity);

            Handles.color = Color.green;
            Handles.DrawWireDisc(point, Vector3.up, 1);

            if (GUI.changed)
            {
                EditorUtility.SetDirty(target);
            }
        }
    }
 private void SetDest(Person person, PatrolRoute route)
 {
     person.SetDest(new Vector2(Mathf.RoundToInt(route.patrolStops[route.currIndex].stopPos.position.x), Mathf.RoundToInt(route.patrolStops[route.currIndex].stopPos.position.y)));
 }
예제 #26
0
 public override void passInGameobject(GameObject passIn)
 {
     myRoute = passIn.GetComponent <PatrolRoute> ();
 }
예제 #27
0
 public void setRoute(PatrolRoute route)
 {
     myRoute = route;
 }
예제 #28
0
 private void Awake()
 {
     parentRoute = transform.parent.GetComponent <PatrolRoute>();
 }
예제 #29
0
 public void YourPatrolRouteIs(PatrolRoute route)
 {
     _patrolRoute    = route;
     _patrolSegments = route.ToList();
 }
 public AIShooterStateSystemMove(ShooterMoveProps _moveProps, PatrolRoute patrolRoute) : base(patrolRoute)
 {
     moveProps = _moveProps;
 }