Tri-Inspector/README.md

474 lines
9.9 KiB
Markdown
Raw Normal View History

2022-01-30 11:32:05 -05:00
# 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)
2022-01-05 08:14:54 -05:00
_Advanced inspector attributes for Unity_
2022-05-11 08:13:58 -04:00
- [Attributes](#Attributes)
- [Misc](#Misc)
2022-05-11 12:28:37 -04:00
- [Validation](#Validation)
2022-05-11 08:13:58 -04:00
- [Styling](#Styling)
- [Collections](#Collections)
- [Conditionals](#Conditionals)
- [Buttons](#Buttons)
- [Debug](#Debug)
- [Groups](#Groups)
- [Customization](#Customization)
- [Custom Drawers](#Custom-Drawers)
- [Validators](#Validators)
- [Property Processors](#Property-Processors)
- [How to Install](#How-to-Install)
- [License](#License)
2022-01-05 08:22:07 -05:00
2022-05-11 08:13:58 -04:00
## Attributes
### Misc
#### ShowInInspector
2022-05-11 12:28:37 -04:00
Shows non-serialized property in the inspector.
2022-05-11 08:13:58 -04:00
```csharp
private float field;
[ShowInInspector]
public float ReadOnlyProperty => field;
[ShowInInspector]
public float EditableProperty
{
get => field;
set => field = value;
}
```
#### PropertyOrder
2022-05-11 12:28:37 -04:00
Changes property order in the inspector.
2022-05-11 08:13:58 -04:00
```csharp
[PropertyOrder(1)]
```
#### ReadOnly
2022-05-11 12:28:37 -04:00
Makes property non-editable.
2022-05-11 08:13:58 -04:00
```csharp
2022-05-11 12:28:37 -04:00
[ReadOnly]
2022-05-11 08:13:58 -04:00
```
#### OnValueChanged
2022-05-11 12:28:37 -04:00
Invokes callback on property modification.
2022-05-11 08:13:58 -04:00
```csharp
[OnValueChanged(nameof(OnMaterialChanged))]
public Material mat;
private void OnMaterialChanged()
{
Debug.Log("Material changed!");
}
```
2022-05-11 12:28:37 -04:00
### Validation
Tri 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.
![Builtin](https://user-images.githubusercontent.com/26966368/167894126-ac5b4722-c930-4304-b183-4b8cc461f083.png)
#### Required
```csharp
[Required]
public Material mat;
```
![Required](https://user-images.githubusercontent.com/26966368/167895375-a1c31812-081f-4033-b7e4-a0c3c43963f0.png)
2022-05-11 08:13:58 -04:00
#### ValidateInput
```csharp
[ValidateInput(nameof(ValidateTexture))]
public Textute tex;
private TriValidationResult ValidateTexture()
{
if (tex == null) return TriValidationResult.Error("Tex is null");
return TriValidationResult.Valid;
}
```
2022-05-11 12:28:37 -04:00
![ValidateInput](https://user-images.githubusercontent.com/26966368/167895864-cb181383-6f23-4f7f-8c3b-b683760e1d8a.png)
2022-05-11 08:13:58 -04:00
### Styling
#### HideLabel
```csharp
[HideLabel]
```
2022-05-11 12:28:37 -04:00
![HideLabel](https://user-images.githubusercontent.com/26966368/167896272-577cbc8f-95be-4b75-97b6-b67d58eba4d1.png)
2022-05-11 08:13:58 -04:00
#### LabelText
```csharp
[LabelText("My Label")]
```
#### LabelWidth
```csharp
[LabelWidth(100)]
```
#### GUIColor
```csharp
[GUIColor(0, 1, 0)]
```
#### Space
2022-01-05 08:14:54 -05:00
```csharp
2022-05-11 08:13:58 -04:00
[Space]
```
2022-01-05 08:14:54 -05:00
2022-05-11 08:13:58 -04:00
#### Indent
```csharp
[Indent]
```
#### Title
```csharp
[Title("My Title")]
2022-05-11 12:28:37 -04:00
public int val;
2022-05-11 08:13:58 -04:00
```
2022-05-11 12:28:37 -04:00
![Title](https://user-images.githubusercontent.com/26966368/167898501-24a8c472-08b1-4010-b00e-ef7dcc33dfae.png)
2022-05-11 08:13:58 -04:00
#### Header
```csharp
[Header("My Header")]
```
#### PropertySpace
```csharp
[PropertySpace(SpaceBefore = 10,
SpaceAfter = 20)]
```
#### PropertyTooltip
```csharp
[PropertyTooltip("My Tooltip")]
```
#### InlineEditor
```csharp
[InlineEditor]
2022-05-11 12:28:37 -04:00
public Material mat;
2022-05-11 08:13:58 -04:00
```
2022-05-11 12:28:37 -04:00
![InlineEditor](https://user-images.githubusercontent.com/26966368/167896721-79724d1c-570f-4e01-b3e1-8c83aacca661.png)
2022-05-11 08:13:58 -04:00
#### InlineProperty
```csharp
2022-05-11 12:28:37 -04:00
public MinMax rangeFoldout;
[InlineProperty(LabelWidth = 40)]
public MinMax rangeInline;
[Serializable]
public class MinMax
{
public int min;
public int max;
}
2022-05-11 08:13:58 -04:00
```
2022-05-11 12:28:37 -04:00
![InlineProperty](https://user-images.githubusercontent.com/26966368/167899261-6a3ceeda-609e-47d0-b8a0-38f4331cc9f9.png)
2022-05-11 08:13:58 -04:00
### Collections
#### ListDrawerSettings
```csharp
[ListDrawerSettings(Draggable = true,
HideAddButton = false,
HideRemoveButton = false,
2022-05-11 12:28:37 -04:00
AlwaysExpanded = false)]
2022-05-11 08:13:58 -04:00
```
2022-05-11 12:28:37 -04:00
![ListDrawerSettings](https://user-images.githubusercontent.com/26966368/167897095-cde06fdb-8b4c-422c-92dc-8ed781006c6e.png)
2022-05-11 08:13:58 -04:00
### Conditionals
#### ShowIf
```csharp
public bool visible;
[ShowIf(nameof(visible))]
public float val;
```
#### HideIf
```csharp
public bool visible;
[HideIf(nameof(visible))]
public float val;
```
#### EnableIf
```csharp
public bool visible;
[EnableIf(nameof(visible))]
public float val;
```
#### DisableIf
```csharp
public bool visible;
[DisableIf(nameof(visible))]
public float val;
```
2022-05-11 08:13:58 -04:00
#### HideInPlayMode / ShowInPlayMode
```csharp
[HideInPlayMode] [ShowInPlayMode]
```
#### DisableInPlayMode / EnableInPlayMode
```csharp
[DisableInPlayMode] [EnableInPlayMode]
```
#### HideInEditMode / ShowInEditMode
```csharp
[HideInEditMode] [ShowInEditMode]
```
#### DisableInEditMode / EnableInEditMode
```csharp
[DisableInEditMode] [EnableInEditMode]
```
### Buttons
#### Button
```csharp
[Button("My Button")]
private void DoButton()
2022-01-05 08:14:54 -05:00
{
2022-05-11 08:13:58 -04:00
Debug.Log("Button clicked!");
2022-01-05 08:14:54 -05:00
}
2022-05-11 08:13:58 -04:00
```
2022-05-11 12:28:37 -04:00
![Button](https://user-images.githubusercontent.com/26966368/167897368-79fdb050-a2f3-4c37-be3f-54f10f46880e.png)
2022-05-11 08:13:58 -04:00
### Debug
2022-01-05 08:14:54 -05:00
2022-05-11 08:13:58 -04:00
#### ShowDrawerChain
```csharp
[ShowDrawerChain]
```
### Groups
```csharp
2022-01-05 08:14:54 -05:00
[DeclareHorizontalGroup("header")]
[DeclareBoxGroup("header/left", Title = "My Left Box")]
2022-01-30 11:16:17 -05:00
[DeclareVerticalGroup("header/right")]
[DeclareBoxGroup("header/right/top", Title = "My Right Box")]
[DeclareTabGroup("header/right/tabs")]
[DeclareBoxGroup("body")]
2022-01-21 10:15:47 -05:00
public class GroupDemo : MonoBehaviour
2022-01-05 08:14:54 -05:00
{
2022-01-30 11:16:17 -05:00
[Group("header/left")] public bool prop1;
[Group("header/left")] public int prop2;
[Group("header/left")] public string prop3;
[Group("header/left")] public Vector3 prop4;
[Group("header/right/top")] public string rightProp;
2022-01-05 08:14:54 -05:00
2022-01-30 11:16:17 -05:00
[Group("body")] public string body1;
[Group("body")] public string body2;
2022-01-05 08:14:54 -05:00
2022-01-30 11:16:17 -05:00
[Group("header/right/tabs"), Tab("One")] public float tabOne;
[Group("header/right/tabs"), Tab("Two")] public float tabTwo;
[Group("header/right/tabs"), Tab("Three")] public float tabThree;
2022-01-21 06:22:51 -05:00
2022-01-30 11:16:17 -05:00
[Group("header/right"), Button]
public void MyButton()
{
}
2022-01-05 08:14:54 -05:00
}
```
2022-01-30 11:16:17 -05:00
![GroupDemo Preview](https://user-images.githubusercontent.com/26966368/151707658-2e0c2e33-17d5-4cbb-8f83-d7d394ced6b6.png)
2022-01-15 12:22:33 -05:00
### Customization
#### Custom Drawers
<details>
<summary>Custom Value Drawer</summary>
2022-01-05 08:22:07 -05:00
```csharp
using TriInspector;
using UnityEditor;
using UnityEngine;
2022-01-06 12:11:27 -05:00
[assembly: RegisterTriValueDrawer(typeof(BoolDrawer), TriDrawerOrder.Fallback)]
2022-01-05 08:22:07 -05:00
public class BoolDrawer : TriValueDrawer<bool>
{
public override float GetHeight(float width, TriValue<bool> propertyValue, TriElement next)
{
return EditorGUIUtility.singleLineHeight;
}
public override void OnGUI(Rect position, TriValue<bool> propertyValue, TriElement next)
{
var value = propertyValue.Value;
EditorGUI.BeginChangeCheck();
value = EditorGUI.Toggle(position, propertyValue.Property.DisplayNameContent, value);
if (EditorGUI.EndChangeCheck())
{
propertyValue.Value = value;
}
}
}
```
2022-01-15 12:22:33 -05:00
</details>
<details>
<summary>Custom Attribute Drawer</summary>
2022-01-05 08:22:07 -05:00
```csharp
using TriInspector;
using UnityEditor;
using UnityEngine;
2022-01-06 12:11:27 -05:00
[assembly: RegisterTriAttributeDrawer(typeof(LabelWidthDrawer), TriDrawerOrder.Decorator)]
2022-01-05 08:22:07 -05:00
public class LabelWidthDrawer : TriAttributeDrawer<LabelWidthAttribute>
{
public override void OnGUI(Rect position, TriProperty property, TriElement next)
{
var oldLabelWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth = Attribute.Width;
next.OnGUI(position);
EditorGUIUtility.labelWidth = oldLabelWidth;
}
}
```
2022-01-15 12:22:33 -05:00
</details>
<details>
<summary>Custom Group Drawer</summary>
2022-01-05 08:22:07 -05:00
```csharp
using TriInspector;
using TriInspector.Elements;
[assembly: RegisterTriGroupDrawer(typeof(TriBoxGroupDrawer))]
public class TriBoxGroupDrawer : TriGroupDrawer<DeclareBoxGroupAttribute>
{
public override TriPropertyCollectionBaseElement CreateElement(DeclareBoxGroupAttribute attribute)
{
// ...
}
}
```
2022-01-15 12:22:33 -05:00
</details>
#### Validators
<details>
<summary>Custom Value Validator</summary>
2022-01-05 08:22:07 -05:00
2022-01-15 11:25:12 -05:00
```csharp
using TriInspector;
[assembly: RegisterTriValueValidator(typeof(MissingReferenceValidator<>))]
public class MissingReferenceValidator<T> : TriValueValidator<T>
where T : UnityEngine.Object
{
public override TriValidationResult Validate(TriValue<T> propertyValue)
{
// ...
}
}
```
2022-01-15 12:22:33 -05:00
</details>
<details>
<summary>Custom Attribute Validators</summary>
2022-01-15 11:25:12 -05:00
```csharp
using TriInspector;
[assembly: RegisterTriAttributeValidator(typeof(RequiredValidator), ApplyOnArrayElement = true)]
public class RequiredValidator : TriAttributeValidator<RequiredAttribute>
{
public override TriValidationResult Validate(TriProperty property)
{
// ...
}
}
```
2022-01-15 12:22:33 -05:00
</details>
#### Property Processors
<details>
<summary>Custom Property Hide Processor</summary>
2022-01-15 11:25:12 -05:00
2022-01-05 08:22:07 -05:00
```csharp
using TriInspector;
using UnityEngine;
[assembly: RegisterTriPropertyHideProcessor(typeof(HideInPlayModeProcessor))]
public class HideInPlayModeProcessor : TriPropertyHideProcessor<HideInPlayModeAttribute>
{
public override bool IsHidden(TriProperty property)
{
return Application.isPlaying;
}
}
```
2022-01-15 12:22:33 -05:00
</details>
<details>
<summary>Custom Property Disable Processor</summary>
2022-01-05 08:22:07 -05:00
```csharp
using TriInspector;
using UnityEngine;
[assembly: RegisterTriPropertyDisableProcessor(typeof(DisableInPlayModeProcessor))]
public class DisableInPlayModeProcessor : TriPropertyDisableProcessor<DisableInPlayModeAttribute>
{
public override bool IsDisabled(TriProperty property)
{
return Application.isPlaying;
}
}
```
2022-01-15 12:22:33 -05:00
</details>
2022-01-05 08:22:07 -05:00
2022-01-05 08:14:54 -05:00
## How to Install
2022-01-21 23:36:15 -05:00
Minimal Unity Version is 2020.3.
2022-01-05 08:14:54 -05:00
Library distributed as git package ([How to install package from git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html))
<br>Git URL: `https://github.com/codewriter-packages/Tri-Inspector.git`
After installing the package, you need to unpack the `Installer.unitypackage` that comes with the package
2022-01-05 08:14:54 -05:00
## License
Tri-Inspector is [MIT licensed](./LICENSE.md).