{"id":14960496,"url":"https://github.com/codewriter-packages/tri-inspector","last_synced_at":"2025-05-14T15:07:08.734Z","repository":{"id":38342189,"uuid":"444799972","full_name":"codewriter-packages/Tri-Inspector","owner":"codewriter-packages","description":"Free inspector attributes for Unity [Custom Editor, Custom Inspector, Inspector Attributes, Attribute Extensions]","archived":false,"fork":false,"pushed_at":"2025-03-19T09:56:50.000Z","size":425,"stargazers_count":1085,"open_issues_count":11,"forks_count":56,"subscribers_count":17,"default_branch":"main","last_synced_at":"2025-04-01T00:38:31.261Z","etag":null,"topics":["attributes","extension","inspector","naughty","unity","unity-asset","unity-editor","unity3d","unity3d-plugin"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codewriter-packages.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-05T12:44:08.000Z","updated_at":"2025-03-31T14:35:30.000Z","dependencies_parsed_at":"2023-02-09T20:01:18.839Z","dependency_job_id":"12aea0ac-4306-4543-bc9d-947e712ded31","html_url":"https://github.com/codewriter-packages/Tri-Inspector","commit_stats":{"total_commits":303,"total_committers":8,"mean_commits":37.875,"dds":0.0363036303630363,"last_synced_commit":"67ee3d8adaf6f3faf50da8dc33b57ec7964f98bb"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewriter-packages%2FTri-Inspector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewriter-packages%2FTri-Inspector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewriter-packages%2FTri-Inspector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewriter-packages%2FTri-Inspector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codewriter-packages","download_url":"https://codeload.github.com/codewriter-packages/Tri-Inspector/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246563369,"owners_count":20797444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["attributes","extension","inspector","naughty","unity","unity-asset","unity-editor","unity3d","unity3d-plugin"],"created_at":"2024-09-24T13:22:23.286Z","updated_at":"2025-04-01T00:38:37.205Z","avatar_url":"https://github.com/codewriter-packages.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tri Inspector [![Github license](https://img.shields.io/github/license/codewriter-packages/Tri-Inspector.svg?style=flat-square)](#) [![Unity 2020.3](https://img.shields.io/badge/Unity-2020.3+-2296F3.svg?style=flat-square)](#) ![GitHub package.json version](https://img.shields.io/github/package-json/v/codewriter-packages/Tri-Inspector?style=flat-square) [![openupm](https://img.shields.io/npm/v/com.codewriter.triinspector?label=openupm\u0026registry_uri=https://package.openupm.com)](https://openupm.com/packages/com.codewriter.triinspector/)\n\n_Advanced inspector attributes for Unity_\n\n![Tri-Inspector-Demo](https://user-images.githubusercontent.com/26966368/187032895-8c41295b-dd82-40ad-80c3-1efaad202732.png)\n\n- [How to Install](#How-to-Install)\n- [Roadmap](#Roadmap-)\n- [Samples](#Samples)\n- [Attributes](#Attributes)\n    - [Misc](#Misc)\n    - [Validation](#Validation)\n    - [Decorators](#Decorators)\n    - [Styling](#Styling)\n    - [Collections](#Collections)\n    - [Conditionals](#Conditionals)\n    - [Buttons](#Buttons)\n    - [Debug](#Debug)\n    - [Groups](#Groups)\n- [Integrations](#Integrations)\n    - [Odin Inspector](#Odin-Inspector)\n    - [Odin Validator](#Odin-Validator)\n- [License](#License)\n\n## How to Install\n\nLibrary distributed as git package ([How to install package from git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html))\n\u003cbr\u003eGit URL: `https://github.com/codewriter-packages/Tri-Inspector.git`\n\n\u003e **Localization package dependency**\u003cbr/\u003e\n\u003e Tri Inspector automatically installs [Localization package](https://docs.unity3d.com/Packages/com.unity.localization@1.0/manual/index.html) as dependency.\u003cbr/\u003e\n\u003e If you are not using localization package and do not want to install it, you can install a stub package instead.\u003cbr/\u003e\n\u003e Git URL: https://github.com/codewriter-packages/Unity-Localization-Stub-for-Tri-Inspector.git\n\n## Roadmap ![GitHub Repo stars](https://img.shields.io/github/stars/codewriter-packages/Tri-Inspector?style=social)\nEach star ★ on the project page brings new features closer. \nYou can suggest new features in the [Discussions](https://github.com/codewriter-packages/Tri-Inspector/discussions).\n\n## Samples\n\nTriInspector has built-in samples at `Tools/Tri Inspector/Samples` menu.\n![Samples](https://user-images.githubusercontent.com/26966368/177045336-a3fcf438-3e70-45d0-b753-299e577b2010.png)\n\n## Attributes\n\n### Misc\n\n#### ShowInInspector\n\nShows non-serialized property in the inspector.\n\n![ShowInInspector](https://user-images.githubusercontent.com/26966368/168230693-a1a389a6-1a3b-4b94-b4b5-0764e88591f4.png)\n\n```csharp\nprivate float _field;\n\n[ShowInInspector]\nprivate bool _myToggle;\n\n[ShowInInspector]\npublic float ReadOnlyProperty =\u003e _field;\n\n[ShowInInspector]\npublic float EditableProperty\n{\n    get =\u003e _field;\n    set =\u003e _field = value;\n}\n```\n\n#### HideReferencePicker\n\nTri Inspector by default shows a polymorphic type picker for `[SerializeReference]` and `[ShowInInspector]`. It can be hidden with a `[HideReferencePicker]` attribute.\n\n![HideReferencePicker](https://user-images.githubusercontent.com/26966368/182633485-a7876052-afd4-40f4-bc6b-be61a04997a4.png)\n\n```csharp\n[SerializeReference]\npublic MyReferenceClass clazz1 = new MyReferenceClass();\n\n[SerializeReference, HideReferencePicker]\npublic MyReferenceClass clazz2 = new MyReferenceClass();\n\n[ShowInInspector, HideReferencePicker]\npublic MyReferenceClass Clazz3 { get; set; } = new MyReferenceClass();\n\n[Serializable]\npublic class MyReferenceClass\n{\n    public int inner;\n}\n```\n\n#### PropertyOrder\n\nChanges property order in the inspector.\n\n![PropertyOrder](https://user-images.githubusercontent.com/26966368/168231223-c6628a8d-0d0a-47c1-8850-dc4e789fa14f.png)\n\n```csharp\npublic float first;\n\n[PropertyOrder(0)]\npublic float second;\n```\n\n#### ReadOnly\n\nMakes property non-editable in the inspector.\n\n![ReadOnly](https://user-images.githubusercontent.com/26966368/168231817-948ef153-eb98-42fb-88ad-3e8d17925b43.png)\n\n```csharp\n[ReadOnly]\npublic Vector3 vec;\n```\n\n#### OnValueChanged\n\nInvokes callback on property modification.\n\n```csharp\n[OnValueChanged(nameof(OnMaterialChanged))]\npublic Material mat; \n\nprivate void OnMaterialChanged()\n{\n    Debug.Log(\"Material changed!\");\n}\n```\n\n#### HideMonoScript\n\nHides the default Script property in the inspector.\n\n```csharp\n[HideMonoScript]\npublic class NewBehaviour : MonoBehaviour\n{\n}\n```\n\n### Validation\n\nTri Inspector has some builtin validators such as `missing reference` and `type mismatch` error. Additionally you can mark out your code with validation attributes or even write own validators.\n\n![Builtin-Validators](https://user-images.githubusercontent.com/26966368/168232996-04de69a5-91c2-45d8-89b9-627b498db2ce.png)\n\n#### Required\n\n![Required](https://github.com/codewriter-packages/Tri-Inspector/assets/26966368/56a8d0ef-c88b-4b4b-8121-388b94d47841)\n\n```csharp\n[Required]\npublic Material material;\n\n[Required(FixAction = nameof(FixTarget), FixActionName = \"Assign self\")]\npublic Transform target;\n\nprivate void FixTarget()\n{\n    target = GetComponent\u003cTransform\u003e();\n}\n```\n\n#### ValidateInput\n\n![ValidateInput](https://user-images.githubusercontent.com/26966368/168233592-b4dcd4d4-88ec-4213-a2e5-667719feb0b8.png)\n\n```csharp\n[ValidateInput(nameof(ValidateTexture))]\npublic Texture tex;\n\nprivate TriValidationResult ValidateTexture()\n{\n    if (tex == null) return TriValidationResult.Error(\"Tex is null\");\n    if (!tex.isReadable) return TriValidationResult.Warning(\"Tex must be readable\");\n    return TriValidationResult.Valid;\n}\n\n```\n\n#### InfoBox\n\n![InfoBox](https://user-images.githubusercontent.com/26966368/169318171-d1a02212-48f1-41d1-b0aa-e2e1b25df262.png)\n\n```csharp\n[Title(\"InfoBox Message Types\")]\n[InfoBox(\"Default info box\")]\npublic int a;\n\n[InfoBox(\"None info box\", TriMessageType.None)]\npublic int b;\n\n[InfoBox(\"Warning info box\", TriMessageType.Warning)]\npublic int c;\n\n[InfoBox(\"Error info box\", TriMessageType.Error)]\npublic int d;\n\n[InfoBox(\"$\" + nameof(DynamicInfo), visibleIf: nameof(VisibleInEditMode))]\npublic Vector3 vec;\n\nprivate string DynamicInfo =\u003e \"Dynamic info box: \" + DateTime.Now.ToLongTimeString();\n\nprivate bool VisibleInEditMode =\u003e !Application.isPlaying;\n```\n\n#### AssetsOnly\n\n![AssetsOnly](https://user-images.githubusercontent.com/26966368/173064367-3cfb17f7-e050-4fcb-9b0c-f8710f1716e7.png)\n\n```csharp\n[AssetsOnly]\npublic GameObject obj;\n```\n\n#### SceneObjectsOnly\n\n![SceneObjectsOnly](https://user-images.githubusercontent.com/26966368/178470605-618c9796-054f-40bb-9c09-2d9c6f342faf.png)\n\n```csharp\n[SceneObjectsOnly]\npublic GameObject obj;\n```\n\n### Decorators\n\n#### Dropdown\n\n![Dropdown](https://user-images.githubusercontent.com/26966368/230157088-1fec3c38-7046-4fc8-8da1-aca63744ac37.png)\n\n```csharp\n[Dropdown(nameof(intValues))]\npublic int numberDropdown = 123;\n\n[Dropdown(nameof(GetVectorValues))]\npublic Vector3 vectorDropdown;\n\nprivate int[] intValues = {1, 2, 3, 4, 5};\n\nprivate IEnumerable\u003cTriDropdownItem\u003cVector3\u003e\u003e GetVectorValues()\n{\n    return new TriDropdownList\u003cVector3\u003e\n    {\n        {\"Zero\", Vector3.zero},\n        {\"One/Forward\", Vector3.forward},\n        {\"One/Backward\", Vector3.back},\n    };\n}\n```\n\n#### Scene\n\n![Scene](https://user-images.githubusercontent.com/26966368/179394466-a9397212-e3bc-40f1-b721-8f7c43aa3048.png)\n\n```csharp\n[Scene] public string scene;\n```\n\n#### InlineEditor\n\n![InlineEditor](https://user-images.githubusercontent.com/26966368/168234617-86a7f500-e635-46f8-90f2-5696e5ae7e63.png)\n\n```csharp\n[InlineEditor]\npublic Material mat;\n```\n\n#### DisplayAsString\n\n![DisplayAsString](https://user-images.githubusercontent.com/26966368/224530522-8aa24fbe-4bc7-4290-89d1-d88c5c502e2b.png)\n\n```csharp\n[DisplayAsString]\npublic string[] collection = {\"hello\", \"world\"};\n```\n\n#### Unit\n\n![Unit](https://github.com/user-attachments/assets/ad355200-150b-4a03-9b96-255f966a097b)\n\n```csharp\n[Unit(UnitAttribute.Meter)]\npublic float lengthInMeters;\n\n[Unit(\"My custom Unit\")]\npublic float freeTextUnit;\n```\n\n### Styling\n\n#### Title\n\n![Title](https://user-images.githubusercontent.com/26966368/168528842-10ba070e-74ab-4377-8f33-7a55609494f4.png)\n\n```csharp\n[Title(\"My Title\")]\npublic string val;\n\n[Title(\"$\" + nameof(_myTitleField))]\npublic Rect rect;\n\n[Title(\"$\" + nameof(MyTitleProperty))]\npublic Vector3 vec;\n\n[Title(\"Button Title\")]\n[Button]\npublic void MyButton()\n{\n}\n\nprivate string _myTitleField = \"Serialized Title\";\n\nprivate string MyTitleProperty =\u003e DateTime.Now.ToLongTimeString();\n```\n\n#### HideLabel\n\n![HideLabel](https://user-images.githubusercontent.com/26966368/168528934-353f2843-b6ea-4f4f-b56e-24e006eca6ae.png)\n\n```csharp\n[Title(\"Wide Vector\")]\n[HideLabel]\npublic Vector3 vector;\n\n[Title(\"Wide String\")]\n[HideLabel]\npublic string str;\n```\n\n#### LabelText\n\n![LabelText](https://user-images.githubusercontent.com/26966368/168529002-8fb17112-f74c-4535-b399-aefdb352f73a.png)\n\n```csharp\n[LabelText(\"Custom Label\")]\npublic int val;\n\n[LabelText(\"$\" + nameof(DynamicLabel))]\npublic Vector3 vec;\n\npublic string DynamicLabel =\u003e DateTime.Now.ToShortTimeString();\n```\n\n#### LabelWidth\n\n![LabelWidth](https://user-images.githubusercontent.com/26966368/168529051-c90bce09-92a7-4afd-b961-d19f03e826f3.png)\n\n```csharp\npublic int defaultWidth;\n\n[LabelWidth(40)]\npublic int thin;\n\n[LabelWidth(300)]\npublic int customInspectorVeryLongPropertyName;\n```\n\n#### GUIColor\n\n![GUIColor](https://user-images.githubusercontent.com/26966368/168529122-048cd964-358c-453b-ab3a-aa7137bab4f7.png)\n\n```csharp\n[GUIColor(0.8f, 1.0f, 0.6f)]\npublic Vector3 vec;\n\n[GUIColor(0.6f, 0.9f, 1.0f)]\n[Button]\npublic void BlueButton() { }\n\n[GUIColor(1.0f, 0.6f, 0.6f)]\n[Button]\npublic void RedButton() { }\n```\n\n#### Indent\n\n![Indent](https://user-images.githubusercontent.com/26966368/168528565-2972221d-2cb3-49f1-8000-a425e4ff6cea.png)\n\n```csharp\n[Title(\"Custom Indent\")]\n[Indent]\npublic int a;\n\n[Indent(2)]\npublic int b;\n\n[Indent(3)]\npublic int c;\n\n[Indent(4)]\npublic int d;\n```\n\n#### PropertySpace\n\n![PropertySpace](https://user-images.githubusercontent.com/26966368/168529641-ee61c950-cb15-4a4e-986b-c9fa8c82dd4d.png)\n\n```csharp\n[Space, PropertyOrder(0)]\npublic Vector3 vecField;\n\n[ShowInInspector, PropertyOrder(1)]\n[PropertySpace(SpaceBefore = 10, SpaceAfter = 30)]\npublic Rect RectProperty { get; set; }\n\n[PropertyOrder(2)]\npublic bool b;\n```\n\n#### PropertyTooltip\n\n![PropertyTooltip](https://user-images.githubusercontent.com/26966368/168530124-95609470-a495-4eb3-9059-f6203ead995f.png)\n\n```csharp\n[PropertyTooltip(\"This is tooltip\")]\npublic Rect rect;\n\n[PropertyTooltip(\"$\" + nameof(DynamicTooltip))]\npublic Vector3 vec;\n\npublic string DynamicTooltip =\u003e DateTime.Now.ToShortTimeString();\n```\n\n#### InlineProperty\n\n![InlineProperty](https://user-images.githubusercontent.com/26966368/168234909-1e6bec90-18ed-4d56-91ca-fe09118e1b72.png)\n\n```csharp\npublic MinMax rangeFoldout;\n\n[InlineProperty(LabelWidth = 40)]\npublic MinMax rangeInline;\n\n[Serializable]\npublic class MinMax\n{\n    public int min;\n    public int max;\n}\n```\n\n### Collections\n\n#### ListDrawerSettings\n\n![ListDrawerSettings](https://user-images.githubusercontent.com/26966368/171126103-4fab58a3-db6c-487b-b616-f7aad528e2ab.png)\n\n```csharp\n[ListDrawerSettings(Draggable = true,\n                    HideAddButton = false,\n                    HideRemoveButton = false,\n                    AlwaysExpanded = false)]\npublic List\u003cMaterial\u003e list;\n\n[ListDrawerSettings(Draggable = false, AlwaysExpanded = true)]\npublic Vector3[] vectors;\n\n```\n\n#### TableList\n\n![TableList](https://user-images.githubusercontent.com/26966368/171125460-679fe467-cf01-47e0-8674-b565ee3d4d7e.png)\n\n```csharp\n[TableList(Draggable = true,\n           HideAddButton = false,\n           HideRemoveButton = false,\n           AlwaysExpanded = false)]\npublic List\u003cTableItem\u003e table;\n\n[Serializable]\npublic class TableItem\n{\n    [Required]\n    public Texture icon;\n    public string description;\n\n    [Group(\"Combined\"), LabelWidth(16)]\n    public string A, B, C;\n\n    [Button, Group(\"Actions\")]\n    public void Test1() { }\n\n    [Button, Group(\"Actions\")]\n    public void Test2() { }\n}\n```\n\n### Conditionals\n\n#### ShowIf\n\n![ShowIf](https://user-images.githubusercontent.com/26966368/168531065-af5dad6a-8aea-4ca9-9730-da5feac0099a.png)\n\n```csharp\npublic Material material;\npublic bool toggle;\npublic SomeEnum someEnum;\n\n[ShowIf(nameof(material), null)]\npublic Vector3 showWhenMaterialIsNull;\n\n[ShowIf(nameof(toggle))]\npublic Vector3 showWhenToggleIsTrue;\n\n[ShowIf(nameof(toggle), false)]\npublic Vector3 showWhenToggleIsFalse;\n\n[ShowIf(nameof(someEnum), SomeEnum.Two)]\npublic Vector3 showWhenSomeEnumIsTwo;\n\npublic enum SomeEnum { One, Two, Three }\n```\n\n#### HideIf\n\n```csharp\npublic bool visible;\n\n[HideIf(nameof(visible))]\npublic float val;\n```\n\n#### EnableIf\n\n```csharp\npublic bool visible;\n\n[EnableIf(nameof(visible))]\npublic float val;\n```\n\n#### DisableIf\n\n```csharp\npublic bool visible;\n\n[DisableIf(nameof(visible))]\npublic float val;\n```\n\n#### HideInPlayMode / ShowInPlayMode\n\n```csharp\n[HideInPlayMode] [ShowInPlayMode]\n```\n\n#### DisableInPlayMode / EnableInPlayMode\n\n```csharp\n[DisableInPlayMode] [EnableInPlayMode]\n```\n\n#### HideInEditMode / ShowInEditMode\n\n```csharp\n[HideInEditMode] [ShowInEditMode]\n```\n\n#### DisableInEditMode / EnableInEditMode\n\n```csharp\n[DisableInEditMode] [EnableInEditMode]\n```\n\n### Buttons\n\n#### Button\n\n![Button](https://github.com/codewriter-packages/Tri-Inspector/assets/26966368/76f4a3a4-4bf9-4f58-8615-17adb986ab81)\n\n```csharp\n[Button(\"Click me!\")]\nprivate void Button() =\u003e Debug.Log(\"Button clicked!\");\n\n[Button(ButtonSizes.Large)]\nprivate void ButtonWithParameters(Vector3 vec, string str = \"default value\")\n{\n    Debug.Log($\"Button with parameters: {vec} {str}\");\n}\n```\n\n#### EnumToggleButtons\n\n![EnumToggleButtons](https://user-images.githubusercontent.com/26966368/171126422-79d6ba55-7928-4178-9cc9-a807e3cb8b53.png)\n\n```csharp\n[EnumToggleButtons] public SomeEnum someEnum;\n[EnumToggleButtons] public SomeFlags someFlags;\n\npublic enum SomeEnum { One, Two, Three }\n\n[Flags] public enum SomeFlags\n{\n    A = 1 \u003c\u003c 0,\n    B = 1 \u003c\u003c 1,\n    C = 1 \u003c\u003c 2,\n    AB = A | B,\n    BC = B | C,\n}\n```\n\n### Debug\n\n#### ShowDrawerChain\n\n![ShowDrawerChain](https://user-images.githubusercontent.com/26966368/168531723-5f2b2d7a-a4c1-4727-8ab5-e7b82a52182e.png)\n\n```csharp\n[ShowDrawerChain]\n[Indent]\n[PropertySpace]\n[Title(\"Custom Title\")]\n[GUIColor(1.0f, 0.8f, 0.8f)]\npublic Vector3 vec;\n```\n\n### Groups\n\nProperties can be grouped in the inspector using the `Group` attribute.\n\n```csharp\n[Group(\"one\")] public float a;\n[Group(\"one\")] public float b;\n\n[Group(\"two\")] public float c;\n[Group(\"two\")] public float d;\n\npublic float e;\n```\n\nIf you have a lot of properties and group attributes take up too much space, then you can combine multiple properties at once using the `GroupNext` attribute.\n\n```csharp\n[GroupNext(\"one\")]\npublic float a;\npublic float b;\n\n[GroupNext(\"two\")]\npublic float c;\npublic float d;\n\n[UnGroupNext]\npublic float e;\n```\n\n#### Box Group\n\n![BoxGroup](https://user-images.githubusercontent.com/26966368/177552426-8124b445-e235-43a2-9143-dd5d954dd9f8.png)\n\n```csharp\n[DeclareBoxGroup(\"box\", Title = \"My Box\")]\npublic class BoxGroupSample : ScriptableObject\n{\n    [Group(\"box\")] public int a;\n    [Group(\"box\")] public bool b;\n}\n```\n\n#### Foldout Group\n\n![FoldoutGroup](https://user-images.githubusercontent.com/26966368/201517886-4138ee55-33c2-4a1a-93bc-a3cda7745a4c.png)\n\n```csharp\n[DeclareFoldoutGroup(\"foldout\", Title = \"$\" + nameof(DynamicTitle))]\npublic class FoldoutGroupSample : ScriptableObject\n{\n    [Group(\"foldout\")] public int a;\n    [Group(\"foldout\")] public bool b;\n    \n    public string DynamicTitle =\u003e \"My Foldout\";\n}\n```\n\n#### Toggle Group\n\n![ToggleGroup](https://user-images.githubusercontent.com/26966368/230786234-33e9aa51-c9da-4b50-93ca-05e72b54aa07.png)\n\n```csharp\n[DeclareToggleGroup(\"toggle\", Title = \"$\" + nameof(DynamicTitle))]\npublic class ToggleGroupSample : ScriptableObject\n{\n    [Group(\"toggle\")] public bool enabled;\n    [Group(\"toggle\")] public int a;\n    [Group(\"toggle\")] public bool b;\n    \n    public string DynamicTitle =\u003e \"My Toggle\";\n}\n```\n\n#### Tab Group\n\n![TabGroup](https://user-images.githubusercontent.com/26966368/177552003-528a4e52-e340-460b-93e6-f56c07ac063b.png)\n\n```csharp\n[DeclareTabGroup(\"tabs\")]\npublic class TabGroupSample : ScriptableObject\n{\n    [Group(\"tabs\"), Tab(\"One\")] public int a;\n    [Group(\"tabs\"), Tab(\"Two\")] public float b;\n    [Group(\"tabs\"), Tab(\"Three\")] public bool c;\n}\n```\n\n#### Horizontal Group\n\n![HorizontalGroup](https://user-images.githubusercontent.com/26966368/177551227-9df32c44-9482-4580-8144-5745af806f24.png)\n\n```csharp\n[DeclareHorizontalGroup(\"vars\")]\npublic class HorizontalGroupSample : ScriptableObject\n{\n    [Group(\"vars\")] public int a;\n    [Group(\"vars\")] public int b;\n    [Group(\"vars\")] public int c;\n}\n```\n\n#### Vertical Group\n\n![VerticalGroup](https://user-images.githubusercontent.com/26966368/177550644-9d0dc2b7-ed18-4d8f-997d-c4fff2c6d6cb.png)\n\n```csharp\n\n[DeclareHorizontalGroup(\"horizontal\")]\n[DeclareVerticalGroup(\"horizontal/vars\")]\n[DeclareVerticalGroup(\"horizontal/buttons\")]\npublic class VerticalGroupSample : ScriptableObject\n{\n    [Group(\"horizontal/vars\")] public float a;\n    [Group(\"horizontal/vars\")] public float b;\n\n    [Button, Group(\"horizontal/buttons\")]\n    public void ButtonA() { }\n\n    [Button, Group(\"horizontal/buttons\")]\n    public void ButtonB() { }\n}\n```\n\n## Integrations\n\n### Odin Inspector\n\nTri Inspector is able to work in compatibility mode with Odin Inspector. \nIn this mode, the primary interface will be drawn by the Odin Inspector. However, \nparts of the interface can be rendered by the Tri Inspector.\n\nIn order for the interface to be rendered by Tri instead of Odin, \nit is necessary to mark classes with `[DrawWithTriInspector]` attribute.\n\nAlternatively, you can mark the entire assembly with an attribute `[assembly:DrawWithTriInspector]`\nto draw all types in the assembly using the Tri Inspector.\n\n### Odin Validator\n\nTri Inspector is integrated with the Odin Validator\nso all validation results from Tri attributes will be shown \nin the Odin Validator window.\n\n![Odin-Validator-Integration](https://user-images.githubusercontent.com/26966368/169645537-d8f0b50f-46af-4804-95e8-337ff3b5ae83.png)\n\n## License\n\nTri-Inspector is [MIT licensed](./LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodewriter-packages%2Ftri-inspector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodewriter-packages%2Ftri-inspector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodewriter-packages%2Ftri-inspector/lists"}