private void ResetAllWeights()
 {
     foreach (Node node in m_Grid.EnumerateAllNodes())
     {
         node.ResetWeight();
     }
 }
        public void UpdateField()
        {
            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                node.ResetWeight();
            }

            Queue <Vector2Int> queue = new Queue <Vector2Int>();

            queue.Enqueue(m_Target);
            m_Grid.GetNode(m_Target).PathWeight = 0f;

            while (queue.Count > 0)
            {
                Vector2Int current        = queue.Dequeue();
                Node       currentNode    = m_Grid.GetNode(current);
                float      weightToTarget = currentNode.PathWeight;

                foreach (Connection neighbour in GetNeighbours(current))
                {
                    Node neighbourNode = m_Grid.GetNode(neighbour.coordinate);
                    if (weightToTarget + neighbour.weight < neighbourNode.PathWeight)
                    {
                        neighbourNode.NextNode   = currentNode;
                        neighbourNode.PathWeight = weightToTarget + neighbour.weight;
                        queue.Enqueue(neighbour.coordinate);
                    }
                }
            }

            RecalculateAvailableFields();
        }
示例#3
0
        public void UpdateField()
        {
            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                node.ResetWeight();
                if (!node.IsOccupied)
                {
                    node.OccupationAvailability = OccupationAvailability.CanOccupy;
                }
                else
                {
                    node.OccupationAvailability = OccupationAvailability.CanNotOccupy;
                }
            }

            Node startNode  = m_Grid.GetNode(m_Start);
            Node targetNode = m_Grid.GetNode(m_Target);

            startNode.OccupationAvailability  = OccupationAvailability.CanNotOccupy;
            targetNode.OccupationAvailability = OccupationAvailability.CanNotOccupy;
            Queue <Vector2Int> queue = new Queue <Vector2Int>();

            queue.Enqueue(m_Target);
            m_Grid.GetNode(m_Target).PathWeight = 0f;

            while (queue.Count > 0)
            {
                Vector2Int current        = queue.Dequeue();
                Node       currentNode    = m_Grid.GetNode(current);
                float      weightToTarget = m_Grid.GetNode(current).PathWeight;
                foreach (Connection neighbour in GetNeighbours(current))
                {
                    Node neighbourNode = m_Grid.GetNode(neighbour.Coordinate);
                    if (weightToTarget + neighbour.Weight < neighbourNode.PathWeight)
                    {
                        neighbourNode.NextNode   = currentNode;
                        neighbourNode.PathWeight = weightToTarget + neighbour.Weight;
                        queue.Enqueue(neighbour.Coordinate);
                    }
                }
            }

            Node wayNode = startNode.NextNode;

            while (wayNode != targetNode)
            {
                wayNode.OccupationAvailability = OccupationAvailability.Undefined;
                wayNode = wayNode.NextNode;
            }
        }
示例#4
0
        private void OnDrawGizmos()
        {
            if (m_Grid == null)
            {
                return;
            }

            Gizmos.color = Color.red;

            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                if (node.NextNode == null)
                {
                    continue;
                }
                if (node.IsOccupied)
                {
                    Gizmos.color = Color.black;
                    Gizmos.DrawCube(node.Position, new Vector3(m_NodeSize, m_NodeSize, m_NodeSize));
                    continue;
                }
                Gizmos.color = Color.red;
                Vector3 start = node.Position;
                Vector3 end   = node.NextNode.Position;

                Vector3 dir = end - start;

                start -= dir * 0.25f;
                end   -= dir * 0.75f;

                Gizmos.DrawLine(start, end);
                Gizmos.DrawSphere(end, 0.1f);
            }
        }
示例#5
0
        private void OnDrawGizmos() //debug method
        {
            if (m_Grid == null)
            {
                return;
            }


            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                if (node.NextNode == null)
                {
                    continue;
                }

                /*
                 * if (node.IsOccupied)
                 * {
                 *  Gizmos.color = Color.blue;
                 *  Gizmos.DrawSphere(node.Position, 0.2f*m_NodeSize);
                 *  continue;
                 * }
                 */


                if (node.EnemyDatas.Count > 0)
                {
                    Gizmos.color = Color.magenta;
                    Vector3 center = node.Position;
                    Gizmos.DrawCube(center, Vector3.one);
                }


                if (node.OccupationAvailability == OccupationAvailability.CanOccupy)
                {
                    Gizmos.color = Color.green;
                }
                if (node.OccupationAvailability == OccupationAvailability.Undefined)
                {
                    Gizmos.color = Color.yellow;
                }
                if (node.OccupationAvailability == OccupationAvailability.CanNotOccupy)
                {
                    Gizmos.color = Color.red;
                }
                Vector3 start = node.Position;
                Vector3 end   = node.NextNode.Position;

                Vector3 direction = end - start;

                start -= direction * 0.25f;
                end   -= direction * 0.75f;

                Gizmos.DrawLine(start, end);
                Gizmos.DrawSphere(end, 0.1f * m_NodeSize);
            }
        }
        public void UpdateField()
        {
            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                node.Reset();
            }
            Queue <Connection> queue = new Queue <Connection>();

            queue.Enqueue(new Connection(m_Target, 0));
            m_Grid.GetNode(m_Target).PathWeight = 0;

            while (queue.Count > 0)
            {
                Connection current        = queue.Dequeue();
                Node       currentNode    = m_Grid.GetNode(current.Coordinate);
                float      weightToTarget = currentNode.PathWeight + current.Weight;

                foreach (Connection neighbour in GetNeighbours(current.Coordinate))
                {
                    Node neighbourNode = m_Grid.GetNode(neighbour.Coordinate);
                    if (weightToTarget < neighbourNode.PathWeight)
                    {
                        neighbourNode.NextNode   = currentNode;
                        neighbourNode.PathWeight = weightToTarget;
                        queue.Enqueue(neighbour);
                    }
                }
            }

            Node startNode  = m_Grid.GetNode(m_Start);
            Node targetNode = m_Grid.GetNode(m_Target);

            startNode.OccupationAvailability = OccupationAvailability.CanNotOccupy;
            Node nextNode = startNode.NextNode;

            while (nextNode != targetNode)
            {
                nextNode.OccupationAvailability = OccupationAvailability.Undefined;
                nextNode = nextNode.NextNode;
            }
            targetNode.OccupationAvailability = OccupationAvailability.CanNotOccupy;
        }
示例#7
0
        public void UpdateField()
        {
            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                node.ResetWeight();
                node.m_OccupationAvailability = OccupationAvailability.CanOccupy;
            }

            Queue <Vector2Int> queue = new Queue <Vector2Int>();

            queue.Enqueue(m_Target);

            Node start  = m_Grid.GetNode(m_Start);
            Node target = m_Grid.GetNode(m_Target);

            target.PathWeight = 0f;

            while (queue.Count > 0)
            {
                Vector2Int current     = queue.Dequeue();
                Node       currentNode = m_Grid.GetNode(current);

                foreach (Connection neighbour in GetNeighbours(current))
                {
                    float weightToTarget = currentNode.PathWeight + neighbour.Weight;
                    Node  neighbourNode  = m_Grid.GetNode(neighbour.Coordinate);
                    if (weightToTarget < neighbourNode.PathWeight)
                    {
                        neighbourNode.NextNode   = currentNode;
                        neighbourNode.PathWeight = weightToTarget;
                        queue.Enqueue(neighbour.Coordinate);
                    }
                }
            }

            start.m_OccupationAvailability  = OccupationAvailability.CanNotOccupy;
            target.m_OccupationAvailability = OccupationAvailability.CanNotOccupy;

            while (start != target && start != null) // rider ругается, но почему?
            {
                start = start.NextNode;
                start.m_OccupationAvailability = OccupationAvailability.Undefined;
            }
        }
示例#8
0
        public void UpdateField()
        {
            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                node.ResetWeight();
                node.OccupationAvailability = OccupationAvailability.CanOccupy;
            }

            Queue <Connection> queue = new Queue <Connection>();

            queue.Enqueue(new Connection(m_Target, 0f));
            m_Grid.GetNode(m_Target).PathWeight = 0f;

            while (queue.Count > 0)
            {
                Connection current     = queue.Dequeue();
                Node       currentNode = m_Grid.GetNode(current.coordinate);

                foreach (Connection neighbour in GetNeighbours(current.coordinate))
                {
                    Node neighbourNode = m_Grid.GetNode(neighbour.coordinate);
                    if (current.weight + neighbour.weight < neighbourNode.PathWeight - Mathf.Epsilon)
                    {
                        neighbourNode.NextNode   = currentNode;
                        neighbourNode.PathWeight = current.weight + neighbour.weight;
                        queue.Enqueue(new Connection(neighbour.coordinate, neighbourNode.PathWeight));
                    }
                }
            }

            Node curNode = m_Grid.GetNode(m_Start);

            curNode.OccupationAvailability = OccupationAvailability.CanNotOccupy;
            curNode = curNode.NextNode;
            while (curNode.PositionOnGrid != m_Target)
            {
                curNode.OccupationAvailability = OccupationAvailability.Undefined;
                curNode = curNode.NextNode;
            }
            curNode.OccupationAvailability = OccupationAvailability.CanNotOccupy;
        }
示例#9
0
        private void OnDrawGizmos()
        {
            // Draw gizmo grid
            foreach (Node node in m_Grid.EnumerateAllNodes())
            {
                if (node.EnemyDatas.Count == 0)
                {
                    continue;
                }
                Gizmos.color = Color.white;
                Gizmos.DrawWireSphere(node.Position, 1.1f);
            }

            Debug.Log(m_Offset);
            Gizmos.color = Color.black;
            float height = m_GridHeight * m_NodeSize;
            float width  = m_GridWidth * m_NodeSize;

            for (int i = 0; i <= m_GridWidth; i++)
            {
                Vector3 from = m_Offset + new Vector3(i * m_NodeSize, 0f, 0f);
                Vector3 to   = m_Offset + new Vector3(i * m_NodeSize, 0f, height);
                Gizmos.DrawLine(from, to);
            }
            for (int i = 0; i <= m_GridHeight; i++)
            {
                Vector3 from = m_Offset + new Vector3(0f, 0f, i * m_NodeSize);
                Vector3 to   = m_Offset + new Vector3(width, 0f, i * m_NodeSize);
                Gizmos.DrawLine(from, to);
            }

            //Gizmos.DrawSphere(m_Offset, 1f);


            Gizmos.DrawSphere(m_Grid.GetNode(0, 0).Position, 2f);
            if (m_Grid == null)
            {
                return;
            }

            foreach (var node in m_Grid.EnumerateAllNodes())
            {
                if (node.NextNode == null)
                {
                    continue;
                }

                if (node.IsOccupied)
                {
                    Gizmos.color = Color.black;
                    Gizmos.DrawSphere(node.Position, 5f);
                    continue;
                }
                Gizmos.color = Color.red;
                Vector3 start = node.Position;
                Vector3 end   = node.NextNode.Position;

                Vector3 dir = end - start;

                start -= dir * 0.25f;
                end   -= dir * 0.75f;

                Gizmos.DrawLine(start, end);
                Gizmos.DrawSphere(end, 0.01f);
            }
        }