Skip to main content

Scripting with Tagger

Welcome to the scripting documentation for the Tagger System, your gateway to managing and querying tags on GameObjects in Unity. This document serves as a comprehensive guide to help you leverage the TaggerSystem and related classes effectively.

info

Unity's built-in tag field and CompareTag method are intended for quick, simple tagging of GameObjects, while Final Tagger is designed for more complex scenarios where a GameObject can have multiple tags and belong to organized tag groups. Final Tagger also supports powerful querying capabilities, unlike Unity's single-tag system.

danger

DO NOT USE METHODS OR FIELDS WITH THE 'INTERNAL' PREFIX. These are intended for internal use and may disrupt the functionality of the system if accessed directly.

Introduction to TaggerSystem​

The TaggerSystem class is the main entry point for all tag-related operations in your Unity project. It provides static methods for adding, removing, searching, and managing tags on GameObjects.

Core Concepts​

  • Tags and Groups: Tags are used to label GameObjects, while groups categorize tags for more organized management. Groups can also be used to perform bulk operations.
  • TaggerData Class: Stores tag and group information, including tag associations and unique identifiers. It is recommended to maintain a single TaggerData instance to avoid conflicts. The TaggerData class also has more methods than TaggerSystem for managing tags themselves, making it suitable for advanced tag management operations.
  • FinalTagger Component: Automatically attached to GameObjects when tags are added, facilitating tag management.
  • TaggerId (short as tagId): A unique int32 identifier that represents a combination of tags. This identifier allows for efficient searches and comparisons based on precomputed tag collections, optimizing tag-based operations.

Adding Tags to GameObjects​

The TaggerSystem provides methods to add tags to GameObjects individually or in bulk. Tags that do not exist will be automatically created and added to the "Ungrouped" group.

Adding a Single Tag​

TaggerSystem.AddTag(gameObject, "Player");

Adds the tag "Player" to the specified gameObject.

Adding Multiple Tags​

TaggerSystem.AddTags(gameObject, "Enemy", "Boss");

Adds both "Enemy" and "Boss" tags to the gameObject. If any of these tags belong to singleton groups, the other tags from that group are automatically removed.

Removing Tags​

Tags can be removed individually or in bulk.

Removing a Single Tag​

TaggerSystem.RemoveTag(gameObject, "Player");

Removes the "Player" tag from the specified gameObject.

Removing Multiple Tags​

TaggerSystem.RemoveTag(gameObject, "Enemy", "Boss");

Removes the tags "Enemy" and "Boss" from the gameObject.

Removing Tags by Group​

TaggerSystem.RemoveAllTagsOfGroup(gameObject, "Enemies");

Removes all tags from the group named "Enemies" from the gameObject.

Setting Tags​

Use SetTag or SetTags to replace all current tags on a GameObject with new ones.

Setting a Single Tag​

TaggerSystem.SetTag(gameObject, "Collectible");

Replaces all tags on the gameObject with the "Collectible" tag.

Setting Tags from a Group​

TaggerSystem.SetTagsOfGroup(gameObject, "Collectibles");

Replaces all tags on the gameObject with the tags from the "Collectibles" group.

Searching GameObjects by Tag​

The TaggerSystem includes powerful search functions to find GameObjects based on their tags.

Finding a GameObject with a Tag​

GameObject player = TaggerSystem.FindGameObjectWithTag("Player");

Finds the first GameObject with the tag "Player".

Finding All GameObjects with a Specific Tag​

HashSet<GameObject> enemies = TaggerSystem.FindGameObjectsWithTag("Enemy");

Finds all GameObjects tagged as "Enemy".

Searching with Multiple Tags​

TaggerSystem allows searches with multiple tags using different search modes.

Search Modes​

  • AND (TaggerSearchMode.And): Returns only GameObjects that have all specified tags.
  • OR (TaggerSearchMode.Or): Returns GameObjects that have at least one of the specified tags.
  • NOT (TaggerSearchMode.Not): Returns GameObjects that do not have any of the specified tags.
  • EXACT (TaggerSearchMode.Exact): Returns GameObjects that have exactly the specified tags and no others.

Example Usage​

GameObject[] collectibles = TaggerSystem.FindGameObjectsWithTags(TaggerSearchMode.Or, "Gold", "Silver").ToArray();

Finds all GameObjects tagged as "Gold" or "Silver".

Searching GameObjects by TaggerId​

Each combination of tags can be uniquely represented by an int32 identifier called taggerId. This taggerId allows for efficient searches and comparisons based on precomputed tag collections.

Finding a GameObject with a TaggerId​

GameObject enemy = TaggerSystem.FindGameObjectWithId(taggerId);

Finds the first GameObject that matches the given taggerId.

Finding All GameObjects with a TaggerId​

HashSet<GameObject> enemies = TaggerSystem.FindGameObjectsWithId(taggerId);

Finds all GameObjects that match the given taggerId.

Example: Converting Tags to TaggerId​

To convert a list of tags into a taggerId, you can use the TaggerSystem:

int taggerId = TaggerSystem.GetIdOfTags("Enemy", "Boss");

This will generate an int32 identifier (taggerId) that represents the combination of tags "Enemy" and "Boss".

Example: Converting TaggerId to Tags​

To convert a taggerId back into the tags it represents, use the following method:

HashSet<string> tags = TaggerSystem.GetTagsOfId(taggerId);

This will return a set of tags associated with the given taggerId.

Practical Usage​

Using taggerId can be especially useful when you need to store or compare tag combinations efficiently. Instead of managing multiple string comparisons, you can use the int32 identifier, which simplifies and optimizes the process.

int collectibleId = TaggerSystem.GetIdOfTags("Collectible", "Gold");
GameObject collectible = TaggerSystem.FindGameObjectWithId(collectibleId);

This example converts the tags "Collectible" and "Gold" to a taggerId and then finds the first matching GameObject.

Advanced Search with TaggerAdvancedSearch​

TaggerSystem supports advanced search patterns through the TaggerAdvancedSearch class.

Creating an Advanced Search from Pattern​

TaggerAdvancedSearch search = TaggerSystem.CreateAdvancedSearchFromPattern("Red & Blue | !Green");

Creates a search for GameObjects that have both "Red" and "Blue" tags, but not "Green".

Managing Tags at Runtime​

The TaggerSystem class provides access to tag management operations such as adding, removing, or managing tags dynamically.

Accessing All Tags​

string[] allTags = TaggerSystem.GetAllTags();

Retrieves an array of all tags defined in the project.

TaggerData Class​

The TaggerData class is responsible for managing all tags and tag groups within the Tagger system. It stores all tag information, including tag names, groups, colors, and unique identifiers. It also facilitates operations such as adding, deleting, and modifying tags and groups. The TaggerData class contains more methods than TaggerSystem, making it ideal for advanced tag management needs, such as directly manipulating tag structures or managing groups.

Core Features of TaggerData​

  • Tag Management: Add, remove, and modify tags, ensuring they are correctly indexed and assigned to appropriate groups.
  • Group Management: Create, delete, and rename groups, allowing you to organize tags into logical categories.
  • Serialization Support: The TaggerData class supports serialization, making it easy to save and load tag configurations.

Adding Tags to TaggerData​

Tags can be added to the TaggerData instance, and optionally assigned to specific groups.

Adding a Tag​

bool added = TaggerSystem.Data.AddTag("Enemy", "Enemies");

Adds the tag "Enemy" to the group "Enemies". Returns true if the tag was successfully added.

Adding Multiple Tags​

TaggerSystem.Data.AddTags(new[] { "Gold", "Silver" }, "Collectibles");

Adds the tags "Gold" and "Silver" to the group "Collectibles".

Removing Tags from TaggerData​

Tags can also be removed from TaggerData, which will automatically remove them from any associated GameObjects.

Deleting a Tag​

TaggerSystem.Data.DeleteTag("Boss");

Deletes the tag "Boss" from TaggerData and removes it from all associated GameObjects.

Group Management​

Groups are used to categorize tags, allowing for better organization and bulk operations.

Creating or Getting a Group​

TaggerGroup enemiesGroup = TaggerSystem.Data.GetOrAddGroup("Enemies");

Retrieves the group named "Enemies", or creates it if it does not exist.

Renaming a Group​

TaggerSystem.Data.RenameGroup("Enemies", "Hostiles");

Renames the group "Enemies" to "Hostiles".

Deleting a Group​

TaggerSystem.Data.DeleteGroup("Collectibles", deleteTags: false);

Deletes the group "Collectibles". If deleteTags is false, the tags are moved to the "Ungrouped" group.

Accessing Tag Data​

The TaggerData class provides methods to retrieve information about tags and groups at runtime.

Get All Tags​

string[] allTags = TaggerSystem.Data.GetAllTags();

Retrieves all tags managed by TaggerData.

Get Tags by Group​

TaggerGroup collectiblesGroup = TaggerSystem.Data.GetOrAddGroup("Collectibles");
string[] tagsInGroup = collectiblesGroup.GetTags();

Retrieves all tags within the "Collectibles" group.

Setting Tag Colors​

Tags can be assigned colors for better visual distinction in the editor.

Set Tag Color​

TaggerSystem.Data.SetColor("Enemy", Color.red);

Sets the color of the "Enemy" tag to red.

Serialization and Versioning​

The TaggerData class supports serialization to save and load tag configurations, and maintains a version number that increments with each change.

Accessing the Version​

int version = TaggerSystem.Data.Version;

Retrieves the current version of the TaggerData, which increments with every modification.

Type-Safe Tags with Auto-Generation​

Tagger provides auto-generation of type-safe constants for tags. The generated scripts allow for easy and mistake-free access to tags in your code.

Example Generated Script​

public static class Tags
{
public const string Player = "Player";
public const string Enemy = "Enemy";
public const string Collectible = "Collectible";
}

Example Usage​

GameObject player = TaggerSystem.FindGameObjectWithTag(Tags.Player);

Using auto-generated constants helps avoid errors due to mistyped strings and provides better code maintainability.