POI Filter Manager
Overview
POI Filter Manager is the singleton gatekeeper that decides which Points of Interest are visible on the minimap, compass, and world map. Rather than having each navigation surface manage its own visibility logic, every surface calls ShouldDisplayPOI() and defers the decision entirely to this component.
Filters are organised into four independent layers evaluated in sequence: quick filters (broad overrides), category filters (per-type toggles), and a distance filter. When Remember Filters is enabled, the player's last-used state is persisted between sessions via PlayerPrefs, so the map remembers which icon types they had toggled off.

Scene Setup
Add a single POI Filter Manager component to any persistent GameObject (typically alongside POIManager). The component is a singleton — duplicate instances are silently destroyed in Awake. The component does not call DontDestroyOnLoad, so place it in your persistent scene.
POIFilterManager is optional. If no instance is present in the scene, navigation UIs treat all POIs as visible (no filtering is applied).
Inspector Sections
Filter Settings
Top-level controls for the entire system.
Enable Filtering
bool
true
Master toggle. When off, ShouldDisplayPOI() returns true for every POI unconditionally. All other settings are ignored.
Remember Filters
bool
true
When enabled, every filter change is immediately written to PlayerPrefs and the saved state is loaded in Start. Preserves the player's map preferences across play sessions.
The inspector confirms filtering is active, or warns when it has been disabled.
Category Filters
One toggle per POICategory. When a category is disabled, every POI of that type is hidden on all navigation surfaces.
Quest Objectives
POICategory.QuestObjective
Quest Givers
POICategory.QuestGiver
Waypoints
POICategory.Waypoint (includes all CustomWaypoint objects)
Locations
POICategory.Location
Enemies
POICategory.Enemy
NPCs
POICategory.NPC
Items
POICategory.Item
Merchants
POICategory.Merchant
Fast Travel
POICategory.FastTravel
Custom
POICategory.Custom
The inspector shows a live count confirming how many of the 10 categories are currently enabled (e.g. ✓ 7 of 10 categories visible).
Quick Filters
Broad override rules that operate independently of the category toggles. Each quick filter is applied before category filters are checked.
Only Quest Markers
bool
false
When on, only POIs with category QuestObjective pass through. All other categories — including ones enabled in Category Filters — are hidden.
Hide Completed Objectives
bool
true
Suppresses any POIMarker whose linked objective is currently marked as completed in QuestManager. POIs without a linked objective are unaffected.
Only Tracked Quests
bool
false
Only shows POIs whose linked quest has isTracked = true on its QuestInstance. POIs without a linked objective are hidden when this is on.
Active quick filters are confirmed with an info message in the inspector.
Distance Filter
An optional global distance cap applied on top of the per-POI MaxDisplayDistance setting.
Use Distance Filter
bool
false
Activates the global distance cap.
Max Display Distance
float
200 m
Any POI whose CurrentDistance exceeds this value is hidden, regardless of its own MaxDisplayDistance setting. Only shown when Use Distance Filter is enabled.
Distance filter vs. POI asset range — The per-POI
MinDisplayDistance/MaxDisplayDistancesettings on thePointOfInterestasset are enforced by the minimap and compass rendering code, not here. POI Filter Manager's distance filter is an additional global cap; both limits must be satisfied for a POI to appear.
Events
On Filters Changed
UnityEvent (no args)
Fired after any filter is modified via the public API. All navigation surfaces (minimap, compass, world map) subscribe to this and refresh their icon pools in response.
Validation & Testing
In edit mode: Warns if filtering is disabled; confirms configuration is valid otherwise.
In Play mode, the section shows live runtime status and provides testing buttons:
Show All Categories
Calls ShowAllCategories() — enables all 10 category filters.
Hide All Categories
Calls HideAllCategories() — disables all 10 category filters.
Preset: Quests Only
Calls PresetQuestsOnly().
Preset: Exploration
Calls PresetExplorationOnly().
Filter Evaluation Order
ShouldDisplayPOI(IPOITarget target) evaluates gates in this sequence and returns false at the first failing gate:
0
Filtering disabled
enableFiltering is false → returns true immediately (no filtering).
1
Null check
target is null.
2
Only Quest Markers
onlyShowQuestMarkers is true and the POI's category is not QuestObjective.
3
Only Tracked Quests
onlyShowTrackedQuests is true and the POI is not linked to a tracked quest.
4
Hide Completed Objectives
hideCompletedObjectives is true and the linked objective is completed.
5
Category filter
The POI's category has its category filter set to false.
6
Distance filter
useDistanceFilter is true and target.CurrentDistance > maxDisplayDistance.
—
Pass
All gates passed → returns true.
Built-In Presets
Three preset methods provide one-call configuration for common map modes:
PresetQuestsOnly()
Hides all categories, then enables: QuestObjective, QuestGiver, Waypoint.
PresetExplorationOnly()
Hides all categories, then enables: Location, FastTravel, Waypoint.
PresetCombatOnly()
Hides all categories, then enables: Enemy only.
All three call HideAllCategories() first and then selectively re-enable categories, so they produce a clean slate regardless of prior state. If rememberFilters is true, the preset state is saved immediately.
PlayerPrefs Keys
When Remember Filters is enabled, the following keys are written on every filter change and read on Start:
POIFilter_{CategoryName}
1 or 0 for each of the 10 categories (e.g. POIFilter_QuestObjective)
POIFilter_OnlyQuests
1 / 0
POIFilter_HideCompleted
1 / 0
POIFilter_OnlyTracked
1 / 0
POIFilter_UseDistance
1 / 0
POIFilter_MaxDistance
float
To reset a player's saved filter preferences, call PlayerPrefs.DeleteAll() or target the specific keys above.
Public API
Core Query
ShouldDisplayPOI(IPOITarget target)
bool
The primary query used by all navigation surfaces. Returns true if the target passes all active filter gates.
Category Filters
SetCategoryFilter(POICategory category, bool isVisible)
Sets a specific category to shown or hidden. Fires OnFiltersChanged and saves if rememberFilters is on.
GetCategoryFilter(POICategory category)
Returns the current visibility state for a category. Defaults to true if the category is not in the dictionary.
ToggleCategoryFilter(POICategory category)
Flips the current state of a category. Fires OnFiltersChanged and saves.
ShowAllCategories()
Enables all 10 category filters. Fires OnFiltersChanged.
HideAllCategories()
Disables all 10 category filters. Fires OnFiltersChanged.
Quick Filters
SetOnlyQuestMarkers(bool value)
Sets the Only Quest Markers quick filter.
SetHideCompletedObjectives(bool value)
Sets the Hide Completed Objectives quick filter.
SetOnlyTrackedQuests(bool value)
Sets the Only Tracked Quests quick filter.
Distance Filter
SetDistanceFilter(bool enabled, float maxDistance = 200f)
Enables or disables the global distance cap and sets the maximum distance.
Presets
PresetQuestsOnly()
Applies the Quests Only preset.
PresetExplorationOnly()
Applies the Exploration Only preset.
PresetCombatOnly()
Applies the Combat Only preset.
Connecting the Filter UI
POIFilterManager provides the runtime state; the in-game filter panel that the player interacts with is a separate POIFilterUI component. That UI component calls these API methods in response to player button presses, and the OnFiltersChanged event propagates the change to all navigation surfaces.
Other Tips
OnFiltersChangedis the refresh signal — Every map, minimap, and compass surface subscribes to this event and rebuilds its visible icon set when it fires. If you set filter state by modifying serialized fields directly (e.g. in a save/load system restoring a game state), callOnFiltersChanged.Invoke()manually afterwards to ensure navigation UIs update.Only Tracked Quests hides unlinked POIs — When
onlyShowTrackedQuestsis true, any POI with nolinkedObjectiveIdis considered "not tracked" and hidden. This means merchants, ambient NPCs, and other non-quest markers all disappear. Combine withPresetQuestsOnly()if that's the intended behaviour, but be aware of it if only some markers have quest links.Hide Completed Objectives needs QuestManager — If
QuestManageris not in the scene,IsCompletedObjective()always returns false, so this quick filter has no effect even when enabled.Distance filter stacks, not replaces —
maxDisplayDistancehere is a secondary hard cap. A POI withMaxDisplayDistance = 500min its asset will still be hidden by this filter if the player sets it to 200m. Design the per-POI distance settings as "intended range" and the filter distance as "player preference".Clearing saved preferences — During development, filter state saved by
PlayerPrefscan cause unexpected map behaviour after changing default inspector values. Use Edit → Clear All PlayerPrefs or thePlayerPrefs.DeleteAll()console command to reset to inspector defaults.
Last updated