├── Changelog.md ├── Changelog.md.meta ├── LICENSE ├── LICENSE.meta ├── README.md ├── README.md.meta ├── Runtime.meta ├── Runtime ├── CompositeTag.cs ├── CompositeTag.cs.meta ├── Tag.cs ├── Tag.cs.meta ├── TagHelper.cs ├── TagHelper.cs.meta ├── Taggable.cs ├── Taggable.cs.meta ├── TaggableEditor.cs ├── TaggableEditor.cs.meta ├── com.intothedev.multitags.asmdef └── com.intothedev.multitags.asmdef.meta ├── package.json └── package.json.meta /Changelog.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Changelog.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e598c53b23ac45dbb6beafc4463450c1 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Vladislav Kinyashov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 02c28731c73e37c4f997d11bfd6e0a9e 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MultiTag System for Unity 2 | This package allows you to Tag Game Objects with ScriptableObjects. 3 | 4 | ### TODO 5 | - [x] Editor support with custom inspector 6 | - [ ] Add tag code generator to quickly access tags without referencing them in the inspector 7 | - [ ] Add API to get entity's runtime added tags 8 | 9 | ## Features 10 | - Allows you to put as many Tags on your GameObject as you want 11 | - Add and remove tags via code and inspector 12 | - Work with ScriptableObjects instead of strings 13 | - Faster than Unity's tag system. Keep in mind that such methods as AddTag, AddTags, RemoveTag and RemoveTags are way slower in Editor than in Build because of the Taggable component's updates and Custom Inspector 14 | - Editor support 15 | 16 | ## How to Install 17 | ### Git Installation (Best way to get latest version) 18 | 19 | If you have Git on your computer, you can open Package Manager indside Unity, select "Add package from Git url...", and paste link ```https://github.com/IntoTheDev/MultiTag-System-for-Unity.git``` 20 | 21 | or 22 | 23 | Open the manifest.json file of your Unity project. 24 | Add ```"com.intothedev.multitags": "https://github.com/IntoTheDev/MultiTag-System-for-Unity.git"``` 25 | 26 | ### Manual Installation (Version can be outdated) 27 | Download latest package from the Release section. 28 | Import MultiTags.unitypackage to your Unity Project 29 | 30 | ## Usage 31 | 32 | ### How to create a new Tag/CompositeTag 33 | Assets/Create/ToolBox/Tags 34 | 35 | ### Change Tags in Editor 36 | If you want to change tags only in Runtime via code then ```Taggable``` component is unnecessary. 37 | 38 | ![](https://i.imgur.com/4IMUydj.png) 39 | 40 | ### Runtime Operations (HasTag, HasTags, AddTag, RemoveTag, GetInstances, etc) 41 |
Code 42 |

43 | 44 | ```csharp 45 | using ToolBox.Tags; 46 | 47 | public class Test : MonoBehaviour 48 | { 49 | [SerializeField] private GameObject _enemy = null; 50 | [SerializeField] private Tag _zombieTag = null; 51 | [SerializeField] private CompositeTag _allEnemiesTags = null; 52 | 53 | private void Awake() 54 | { 55 | // Check for Tag 56 | if (_enemy.HasTag(_zombieTag)) 57 | { 58 | 59 | } 60 | 61 | // Check for Multiple Tags 62 | // You can also pass in simple array of tags 63 | if (_enemy.HasTags(_allEnemiesTags, allRequired: false)) 64 | { 65 | 66 | } 67 | 68 | // Add Tag 69 | // Be careful, if you create a copy of an existing object with added/removed tags via API (AddTag, RemoveTag, etc). 70 | // These tags will not be copied to the new object. 71 | // But I'll implement a way to copy tags in the future. 72 | _enemy.AddTag(_zombieTag); 73 | 74 | // Remove Tag 75 | _enemy.RemoveTag(_zombieTag); 76 | 77 | 78 | // Get all objects with tag 79 | var zombies = _zombieTag.GetInstances(); 80 | 81 | foreach (var zombie in zombies) 82 | { 83 | // Do something 84 | } 85 | 86 | // Instead of gameObject you can use any class that inherits from Component (transform, collider, etc) 87 | // Example: 88 | _enemy.transform.AddTag(_zombieTag); 89 | } 90 | } 91 | ``` 92 | 93 |

94 |
95 | 96 | ### CompositeTag Usage 97 | CompositeTag allows you to combine tags into single asset and use API with that asset (AddTags, RemoveTags, HasTags) 98 | 99 | Example: 100 | 101 | ![](https://i.imgur.com/nnxY4kj.png) 102 | 103 | 104 | ### Performance Test 105 |
Code 106 |

107 | 108 | ```csharp 109 | using Sirenix.OdinInspector; 110 | using System.Diagnostics; 111 | using ToolBox.Tags; 112 | using UnityEngine; 113 | 114 | namespace ToolBox.Test 115 | { 116 | [DefaultExecutionOrder(-100)] 117 | public class Tester : MonoBehaviour 118 | { 119 | [SerializeField] private Tag _myTag = null; 120 | [SerializeField] private string _unityTag = null; 121 | [SerializeField] private GameObject _object = null; 122 | 123 | private const int ITERATIONS = 100000; 124 | 125 | [Button] 126 | private void MyTagTest() 127 | { 128 | Stopwatch stopwatch = new Stopwatch(); 129 | stopwatch.Start(); 130 | 131 | for (int j = 0; j < ITERATIONS; j++) 132 | { 133 | _object.HasTag(_myTag); 134 | } 135 | 136 | stopwatch.Stop(); 137 | UnityEngine.Debug.Log($"Scriptable Object Tag Comparer: {stopwatch.ElapsedMilliseconds} milliseconds"); 138 | } 139 | 140 | [Button] 141 | private void UnityTagTest() 142 | { 143 | Stopwatch stopwatch = new Stopwatch(); 144 | stopwatch.Start(); 145 | 146 | for (int j = 0; j < ITERATIONS; j++) 147 | { 148 | _object.CompareTag(_unityTag); 149 | } 150 | 151 | stopwatch.Stop(); 152 | UnityEngine.Debug.Log($"Unity Tag Comparer: {stopwatch.ElapsedMilliseconds} milliseconds"); 153 | } 154 | } 155 | } 156 | 157 | ``` 158 |

159 |
160 | 161 |
Test Result 162 |

163 | 164 | ![Result](https://imgur.com/c8rnKdo.png) 165 | 166 |

167 |
168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b4a78aa68348467aa0b5cef269b44e77 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dbc387a6ebb047e789eef15607466f72 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Runtime/CompositeTag.cs: -------------------------------------------------------------------------------- 1 | #if ODIN_INSPECTOR 2 | using Sirenix.OdinInspector; 3 | #endif 4 | using System; 5 | using System.Collections.Generic; 6 | using UnityEngine; 7 | 8 | namespace ToolBox.Tags 9 | { 10 | [CreateAssetMenu(menuName = "ToolBox/Tags/Composite Tag")] 11 | #if ODIN_INSPECTOR 12 | [AssetSelector, Required] 13 | #endif 14 | public sealed class CompositeTag : ScriptableObject 15 | { 16 | [SerializeField] private Tag[] _tags = Array.Empty(); 17 | 18 | internal IEnumerable Tags => _tags; 19 | 20 | internal void Add(GameObject instance, int hash) 21 | { 22 | for (int i = 0; i < _tags.Length; i++) 23 | _tags[i].Add(instance, hash); 24 | } 25 | 26 | internal void Remove(GameObject instance, int hash) 27 | { 28 | for (int i = 0; i < _tags.Length; i++) 29 | _tags[i].Remove(instance, hash); 30 | } 31 | 32 | internal bool HasInstance(GameObject instance, bool allRequired) 33 | { 34 | return instance.HasTags(_tags, allRequired); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Runtime/CompositeTag.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dffc520b58c974c4dadaada8f46deec5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Tag.cs: -------------------------------------------------------------------------------- 1 | #if ODIN_INSPECTOR 2 | using Sirenix.OdinInspector; 3 | #endif 4 | using System.Collections.Generic; 5 | using UnityEngine; 6 | 7 | namespace ToolBox.Tags 8 | { 9 | [CreateAssetMenu(menuName = "ToolBox/Tags/Tag")] 10 | #if ODIN_INSPECTOR 11 | [AssetSelector, Required] 12 | #endif 13 | public sealed class Tag : ScriptableObject 14 | { 15 | private readonly HashSet _instancesHash = new HashSet(); 16 | private readonly List _instances = new List(128); 17 | 18 | internal void Add(GameObject instance, int hash) 19 | { 20 | if (_instancesHash.Contains(hash)) 21 | return; 22 | 23 | _instances.Add(instance); 24 | _instancesHash.Add(hash); 25 | } 26 | 27 | internal void Remove(GameObject instance, int hash) 28 | { 29 | if (!_instancesHash.Contains(hash)) 30 | return; 31 | 32 | _instances.Remove(instance); 33 | _instancesHash.Remove(hash); 34 | } 35 | 36 | internal bool HasInstance(int hash) 37 | { 38 | return _instancesHash.Contains(hash); 39 | } 40 | 41 | public IEnumerable GetInstances() 42 | { 43 | int instancesCount = _instances.Count - 1; 44 | for (int i = instancesCount; i >= 0; i--) 45 | { 46 | var instance = _instances[i]; 47 | 48 | if (instance == null) 49 | { 50 | _instances.RemoveAt(i); 51 | continue; 52 | } 53 | 54 | yield return instance; 55 | } 56 | } 57 | } 58 | } 59 | 60 | -------------------------------------------------------------------------------- /Runtime/Tag.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d6c70bddcdf126f428271c32cfc94f4d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 01c3464fb6c581845b7f0e386ebe0bc6, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/TagHelper.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace ToolBox.Tags 4 | { 5 | public static class TagHelper 6 | { 7 | public static void AddTag(this GameObject instance, Tag tag) 8 | { 9 | #if UNITY_EDITOR 10 | var taggable = GetComponent(instance); 11 | if (!taggable.Contains(tag)) 12 | taggable.Add(tag); 13 | #endif 14 | 15 | tag.Add(instance, instance.GetHashCode()); 16 | } 17 | 18 | public static void AddTag(this Component instance, Tag tag) 19 | { 20 | instance.gameObject.AddTag(tag); 21 | } 22 | 23 | public static void RemoveTag(this GameObject instance, Tag tag) 24 | { 25 | #if UNITY_EDITOR 26 | var taggable = GetComponent(instance); 27 | if (taggable.Contains(tag)) 28 | taggable.Remove(tag); 29 | #endif 30 | 31 | tag.Remove(instance, instance.GetHashCode()); 32 | } 33 | 34 | public static void RemoveTag(this Component instance, Tag tag) 35 | { 36 | instance.gameObject.RemoveTag(tag); 37 | } 38 | 39 | public static bool HasTag(this GameObject instance, Tag tag) 40 | { 41 | return tag.HasInstance(instance.GetHashCode()); 42 | } 43 | 44 | public static bool HasTag(this Component instance, Tag tag) 45 | { 46 | return instance.gameObject.HasTag(tag); 47 | } 48 | 49 | public static void AddTags(this GameObject instance, Tag[] tags) 50 | { 51 | #if UNITY_EDITOR 52 | var taggable = GetComponent(instance); 53 | #endif 54 | 55 | int hash = instance.GetHashCode(); 56 | 57 | for (int i = 0; i < tags.Length; i++) 58 | { 59 | var tag = tags[i]; 60 | 61 | #if UNITY_EDITOR 62 | if (!taggable.Contains(tag)) 63 | taggable.Add(tag); 64 | #endif 65 | 66 | tag.Add(instance, hash); 67 | } 68 | } 69 | 70 | public static void AddTags(this Component instance, Tag[] tags) 71 | { 72 | instance.gameObject.AddTags(tags); 73 | } 74 | 75 | public static void AddTags(this GameObject instance, CompositeTag composite) 76 | { 77 | #if UNITY_EDITOR 78 | var taggable = GetComponent(instance); 79 | 80 | foreach (var tag in composite.Tags) 81 | { 82 | if (taggable.Contains(tag)) 83 | continue; 84 | 85 | taggable.Add(tag); 86 | } 87 | #endif 88 | 89 | composite.Add(instance, instance.GetHashCode()); 90 | } 91 | 92 | public static void AddTags(this Component instance, CompositeTag composite) 93 | { 94 | instance.gameObject.AddTags(composite); 95 | } 96 | 97 | public static void RemoveTags(this GameObject instance, Tag[] tags) 98 | { 99 | #if UNITY_EDITOR 100 | var taggable = GetComponent(instance); 101 | #endif 102 | 103 | int hash = instance.GetHashCode(); 104 | 105 | for (int i = 0; i < tags.Length; i++) 106 | { 107 | var tag = tags[i]; 108 | 109 | #if UNITY_EDITOR 110 | if (taggable.Contains(tag)) 111 | taggable.Remove(tag); 112 | #endif 113 | 114 | tag.Remove(instance, hash); 115 | } 116 | } 117 | 118 | public static void RemoveTags(this Component instance, Tag[] tags) 119 | { 120 | instance.gameObject.RemoveTags(tags); 121 | } 122 | 123 | public static void RemoveTags(this GameObject instance, CompositeTag composite) 124 | { 125 | #if UNITY_EDITOR 126 | var taggable = GetComponent(instance); 127 | 128 | foreach (var tag in composite.Tags) 129 | { 130 | if (!taggable.Contains(tag)) 131 | continue; 132 | 133 | taggable.Remove(tag); 134 | } 135 | #endif 136 | 137 | composite.Remove(instance, instance.GetHashCode()); 138 | } 139 | 140 | public static void RemoveTags(this Component instance, CompositeTag composite) 141 | { 142 | instance.gameObject.RemoveTags(composite); 143 | } 144 | 145 | public static bool HasTags(this GameObject instance, Tag[] tags, bool allRequired) 146 | { 147 | int hash = instance.GetHashCode(); 148 | 149 | for (int i = 0; i < tags.Length; i++) 150 | { 151 | if (tags[i].HasInstance(hash) == !allRequired) 152 | return !allRequired; 153 | } 154 | 155 | return allRequired; 156 | } 157 | 158 | public static bool HasTags(this Component instance, Tag[] tags, bool allRequired) 159 | { 160 | return instance.gameObject.HasTags(tags, allRequired); 161 | } 162 | 163 | public static bool HasTags(this GameObject instance, CompositeTag composite, bool allRequired) 164 | { 165 | return composite.HasInstance(instance, allRequired); 166 | } 167 | 168 | public static bool HasTags(this Component instance, CompositeTag composite, bool allRequired) 169 | { 170 | return instance.gameObject.HasTags(composite, allRequired); 171 | } 172 | 173 | #if UNITY_EDITOR 174 | private static Taggable GetComponent(GameObject instance) 175 | { 176 | if (!instance.TryGetComponent(out Taggable taggable)) 177 | taggable = instance.AddComponent(); 178 | 179 | return taggable; 180 | } 181 | #endif 182 | } 183 | } -------------------------------------------------------------------------------- /Runtime/TagHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0a2128bc3d9756d408b18ba117712fae 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Taggable.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | #if UNITY_EDITOR 3 | using UnityEditor; 4 | #endif 5 | using UnityEngine; 6 | 7 | namespace ToolBox.Tags 8 | { 9 | [DisallowMultipleComponent, DefaultExecutionOrder(-9000), ExecuteInEditMode] 10 | internal sealed class Taggable : MonoBehaviour 11 | { 12 | [SerializeField] private Tag[] _tags = Array.Empty(); 13 | 14 | private void Awake() 15 | { 16 | gameObject.AddTags(_tags); 17 | } 18 | 19 | private void OnDestroy() 20 | { 21 | gameObject.RemoveTags(_tags); 22 | } 23 | 24 | #if UNITY_EDITOR 25 | internal void Add(Tag tag) 26 | { 27 | ArrayUtility.Add(ref _tags, tag); 28 | } 29 | 30 | internal void Remove(Tag tag) 31 | { 32 | ArrayUtility.Remove(ref _tags, tag); 33 | } 34 | 35 | internal bool Contains(Tag tag) 36 | { 37 | return ArrayUtility.Contains(_tags, tag); 38 | } 39 | #endif 40 | } 41 | } -------------------------------------------------------------------------------- /Runtime/Taggable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d7daa1e9731588e479a5142d62caf786 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: -90 8 | icon: {fileID: 2800000, guid: 551144b9f2e56ea4e8c439b3a9a7dfe0, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/TaggableEditor.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_EDITOR 2 | using System.Linq; 3 | using UnityEditor; 4 | using UnityEngine; 5 | 6 | namespace ToolBox.Tags.Editor 7 | { 8 | [CustomEditor(typeof(Taggable))] 9 | internal class TaggableEditor : UnityEditor.Editor 10 | { 11 | private Tag[] _tags = null; 12 | 13 | private void OnEnable() 14 | { 15 | _tags = GetAllTags(); 16 | } 17 | 18 | public override void OnInspectorGUI() 19 | { 20 | var taggable = target as Taggable; 21 | 22 | if (taggable == null) 23 | return; 24 | 25 | var instance = taggable.gameObject; 26 | int hash = instance.GetHashCode(); 27 | 28 | foreach (var tag in _tags) 29 | { 30 | bool contains = taggable.Contains(tag); 31 | EditorGUILayout.BeginHorizontal(); 32 | GUI.enabled = false; 33 | 34 | GUI.color = contains ? Color.green : Color.red; 35 | EditorGUILayout.ObjectField(tag, typeof(Tag), false); 36 | GUI.color = Color.white; 37 | 38 | GUI.enabled = !contains; 39 | if (GUILayout.Button("Add", EditorStyles.miniButtonLeft)) 40 | { 41 | Undo.SetCurrentGroupName("Add tag"); 42 | 43 | Undo.RecordObject(taggable, "Add gameObject to Tag"); 44 | tag.Add(instance, hash); 45 | 46 | Undo.RecordObject(taggable, "Add Tag in the Inspector"); 47 | taggable.Add(tag); 48 | 49 | Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); 50 | 51 | contains = true; 52 | 53 | EditorUtility.SetDirty(taggable); 54 | } 55 | 56 | GUI.enabled = contains; 57 | if (GUILayout.Button("Remove", EditorStyles.miniButtonLeft)) 58 | { 59 | Undo.SetCurrentGroupName("Remove tag"); 60 | 61 | Undo.RecordObject(taggable, "Remove gameObject from Tag"); 62 | tag.Remove(instance, hash); 63 | 64 | Undo.RecordObject(taggable, "Remove Tag in the Inspector"); 65 | taggable.Remove(tag); 66 | 67 | Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); 68 | 69 | EditorUtility.SetDirty(taggable); 70 | } 71 | 72 | GUI.enabled = true; 73 | EditorGUILayout.EndHorizontal(); 74 | } 75 | } 76 | 77 | private static Tag[] GetAllTags() 78 | { 79 | var paths = AssetDatabase.FindAssets("t:Tag").Select(AssetDatabase.GUIDToAssetPath); 80 | return paths.Select(AssetDatabase.LoadAssetAtPath).ToArray(); 81 | } 82 | } 83 | } 84 | #endif -------------------------------------------------------------------------------- /Runtime/TaggableEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0ed656af496edb4408fd68ff834dc8c1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/com.intothedev.multitags.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.intothedev.multitags" 3 | } 4 | -------------------------------------------------------------------------------- /Runtime/com.intothedev.multitags.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 17eae629bcde9bd459720c2ab80f4dd6 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.intothedev.multitags", 3 | "version": "1.4.0", 4 | "displayName": "MultiTags", 5 | "description": "This package allows you to Tag Game Objects with ScriptableObjects.", 6 | "author": { 7 | "name": "IntoTheDev", 8 | "email": "indraayy322@gmail.com", 9 | "url": "https://github.com/IntoTheDev" 10 | }, 11 | "type": "tool" 12 | } 13 | -------------------------------------------------------------------------------- /package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f8b6e89fda9d44c386292f2acdb269dc 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | --------------------------------------------------------------------------------