Unityインスペクタ拡張ライブラリ「NaughtyAttributes」

# NaughtyAttributesについて

Unityのインスペクタを拡張するライブラリです。
`[Button]`や`[Label]`などC#アトリビュートが追加され簡単にインスペクタツールを作ることができるようになります。

https://github.com/dbrizov/NaughtyAttributes

[インストール方法](https://github.com/dbrizov/NaughtyAttributes#installation)

MIT ライセンス

Githubでのスター数は4.3k
※ 有名ライブラリのスター数
(UniTask: 7.5k, UniRx: 7k, DOTween: 2.3k, InputSystem: 1.4k, ShaderGraph: 1.2k)

類似のライブラリとしては[Odin](https://assetstore.unity.com/packages/tools/utilities/odin-inspector-and-serializer-89041)が有名かと思いますが、$60.50の有償シートラインセンスのため導入ハードルが高めです。
その点NaughtyAttributesはOdinほど機能は多くありませんがオープンソースなので気軽に利用できます。

# 主要な機能
## Button
インスペクタにボタンが表示され、押すとメソッドが実行されます
テスタビリティが向上します
```csharp
[Button]
private void SomeMethod() { }

[Button("カスタム")]
private void SomeMethod2() { }
```

![naughtyattributes_button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/f6649c63-95a4-1610-005a-b3a7ab3724a4.png)

[ドキュメント](https://dbrizov.github.io/na-docs/attributes/drawer_attributes/button.html)

## Label
フィールドに別名を付ける機能です
非エンジニアに分かりやすくするのに便利です
```csharp
[SerializeField, Label("カスタムラベル")]
private string _foo;
```

![naughtyattributes_label.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/61753d0f-5b6b-74fc-5ec6-cd2b886b5730.png)

[ドキュメント](https://dbrizov.github.io/na-docs/attributes/meta_attributes/label.html)

## ShowIf / HideIf
条件によってフィールドの表示/非表示を行います
コンポーネントが複数の機能を持つ時、特定の機能が有効なときにだけ関連フィールドを表示するのに便利です

```csharp
[SerializeField]
private bool _isOn;

[SerializeField, ShowIf(nameof(_isOn))]
private int _foo;
```
Offのとき
![naughtyattributes_showif_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/76e0b34a-1847-4961-2e3f-52c31549f248.png)

Onのとき
![naughtyattributes_showif_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/3536c25f-b61c-14f4-9d34-dce8b23b6f71.png)

[ドキュメント](https://dbrizov.github.io/na-docs/attributes/meta_attributes/show_hide_if.html)

## EnableIf / DisableIf
条件によってフィールドの有効化/無効化を行います
特定のフィールドが有効なときにだけ関連フィールドを有効化するのに便利です

```csharp
[SerializeField]
private bool _isOn;

[SerializeField, EnableIf(nameof(_isOn))]
private int _foo;
```
Offのとき
![naughty_attributes_enableif_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/e4e2738a-2bd1-66b2-5d72-db0f59e2fc2f.png)

Onのとき
![naughty_attributes_enableif_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/c35d94d0-9ca2-75fc-911a-12da3803f9ea.png)

[ドキュメント](https://dbrizov.github.io/na-docs/attributes/meta_attributes/enable_disable_if.html#)

## Foldout
複数のフィールドの折りたたみを行います
```csharp
[SerializeField, Foldout("Private")]
private int _foo;

[SerializeField, Foldout("Private")]
private int _bar;
```
折りたたみ時
![naughtyattributes_foldout_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/09e1b2c9-8091-045d-3098-661c01ddf283.png)

展開時
![naughtyattributes_foldout_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/2a89e056-934e-71c4-fa9f-bcec1bc50981.png)

[ドキュメント](https://dbrizov.github.io/na-docs/attributes/meta_attributes/foldout.html)

## ReadOnly
読み取り専用になります
```csharp
[ReadOnly]
public Vector3 Foo;
```

![naughtyattributes_readonly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203221/95ea7fba-5839-0ed5-392d-841ac80cd65c.png)

[ドキュメント](https://dbrizov.github.io/na-docs/attributes/meta_attributes/read_only.html)

## OnValueChanged
インスペクタで値が変わったときにコールバックを受け取ることができます
値が変わったときに何か処理するには`[OnValidate]`や`[ExecuteAlways]`を使用することが多いと思いますが、`[OnValueChanged]`はフィールドごとにコールバックを受けられるのでより細かな制御ができます

```csharp
[OnValueChanged(nameof(OnValueChanged))]
public int foo;

private void OnValueChanged()
{
    Debug.Log(foo);
}
```
[ドキュメント](https://dbrizov.github.io/na-docs/attributes/meta_attributes/on_value_changed.html)

# その他の機能
上記以外にも、`[Dropdown]`や`[ShowNativeProperty]`など使える機能が結構あります。
[Readme](https://github.com/dbrizov/NaughtyAttributes/blob/master/README.md)、[公式ドキュメント](https://dbrizov.github.io/na-docs/index.html)に一覧があるので見てみてください。