Proper way to use tagMask + graphMask

Hi, what’s the proper way to use a tagMask + a graphMask in a Path? I have the following code where I’m trying to constrain the path to nodes with tag 3, but I am seeing nodes with tag 1 in the returned path as well.

// request path using city graph
                var graph = targetTown.WaterUnitGraph;
                var graphMask = 1 << (int)graph.graphIndex;

                var path = ABPath.Construct(
                    //Utils.Double3ToVector(startPos - targetCity.absCenter),
                    //Utils.Double3ToVector(endPos - targetCity.absCenter),
                    CCVoxelFarmHelper.SimSpaceToRender(Utils.Double3ToVector(startPos - targetCity.absCenter)),
                    CCVoxelFarmHelper.SimSpaceToRender(Utils.Double3ToVector(endPos - targetCity.absCenter)),
                    delegate (Path p)
                    {
                        // todo : funnel simplification

                        foreach (var node in p.path)
                        {
                            Debug.Log("node.Tag: " + node.Tag);
                        }

                        if (!p.error && p.vectorPath.Count > 0)
                        {
                            pathPoints.Add(startPos);
                            foreach (var point in p.vectorPath)
                            {
                                var transformed = CCVoxelFarmHelper.RenderSpaceToSimSpace(Utils.Vector3ToDouble3(point)) + targetCity.absCenter;
                                pathPoints.Add(transformed);

                                //pathPoints.Add(Utils.Vector3ToDouble3(point) + targetCity.absCenter);
                            }
                            pathPoints.Add(endPos);

                            status = PathStatus.Finished;
                        }
                        else
                        {
                            status = PathStatus.Failure;
                        }
                    }
                );

                var tagMask = CCNavMeshIntegration.Instance.GetWaterUnitTagBitmask();
                path.nnConstraint = new NNConstraint()
                {
                    tags = tagMask,
                    distanceMetric = Pathfinding.DistanceMetric.ClosestAsSeenFromAbove(),
                    graphMask = graphMask,
                    constrainTags = true,
                    constrainWalkability = true,
                    walkable = true,
                };

                //path.nnConstraint = new NNConstraint() { distanceMetric = DistanceMetric.ClosestAsSeenFromAbove(), graphMask = graphMask };

                string binaryString = Convert.ToString(tagMask, 2).PadLeft(32, '0');
                Debug.Log("tag mask: " + binaryString);

                binaryString = Convert.ToString(graphMask, 2).PadLeft(32, '0');
                Debug.Log("graph mask: " + binaryString);

                AstarPath.StartPath(path);

Hi

A bit counterintuitive, but you’ll also need to assign path.enabledTags = tagMask. The nnConstraint only affects how the path searches for the nodes closest to the start and end points.

1 Like