Alchemy/README_JA.md

326 lines
11 KiB
Markdown
Raw Permalink Normal View History

2023-12-02 01:17:12 -05:00
# Alchemy
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/header.png" width="800">
2023-12-02 01:17:12 -05:00
[![license](https://img.shields.io/badge/LICENSE-MIT-green.svg)](LICENSE)
[English README is here](README.md)
## 概要
Alchemyは属性を使用したInspector拡張を提供するライブラリです。
属性ベースの簡単かつ強力なエディタ拡張を追加するほか、独自のシリアル化プロセスを介してあらゆる型(Dictionary, Hashset, Nullable, Tuple, etc...)をシリアル化し、Inspector上で編集することが可能になります。Source Generatorを用いて必要なコードを動的に生成するため、partialにした対象型に属性を付加するだけで機能します。Odinのように専用のクラスを継承する必要はありません。
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-v2.0.png" width="800">
また、v2.0の新機能としてEditorWindow拡張とHierarchy拡張が追加されました。これらを用いることで、エディタでの開発フローを効率化するツールを簡単に作成できるようになります。
2023-12-02 01:17:12 -05:00
## 特徴
* Inspectorを拡張する30以上の属性を追加
* SerializeReferenceをサポートし、ドロップダウンから型を選択可能に
* あらゆる型(Dictionary, Hashset, Nullable, Tuple, etc...)をシリアル化/Inspectorで編集可能
2024-02-20 01:53:56 -05:00
* 属性を用いたEditorWindowの作成
* Hierarchyの使い勝手を向上させる機能の提供
* Alchemy上で動作するカスタム属性の作成
2023-12-02 01:17:12 -05:00
## セットアップ
### 要件
* Unity 2021.2 以上 (シリアル化拡張を使用する場合、2022.1以上を推奨)
* Serialization 2.0 以上 (シリアル化拡張を使用する場合)
### インストール
1. Window > Package ManagerからPackage Managerを開く
2. 「+」ボタン > Add package from git URL
3. 以下のURLを入力する
```
https://github.com/AnnulusGames/Alchemy.git?path=/Alchemy/Assets/Alchemy
```
あるいはPackages/manifest.jsonを開き、dependenciesブロックに以下を追記
```json
{
"dependencies": {
"com.annulusgames.alchemy": "https://github.com/AnnulusGames/Alchemy.git?path=/Alchemy/Assets/Alchemy"
}
}
```
2024-02-20 01:53:56 -05:00
## ドキュメント
2023-12-02 08:24:21 -05:00
2024-02-20 01:53:56 -05:00
ドキュメントのフルバージョンは[こちら](https://annulusgames.github.io/Alchemy/)から確認できます。
2023-12-02 08:24:21 -05:00
2023-12-02 01:17:12 -05:00
## 基本的な使い方
Inspectorでの表示をカスタマイズしたい場合には、クラスが持つフィールドに属性を付加します。
```cs
using UnityEngine;
using UnityEngine.UIElements;
using Alchemy.Inspector; // Alchemy.Inspector名前空間をusingに追加
2024-02-20 01:53:56 -05:00
public class AttributesExample : MonoBehaviour
2023-12-02 01:17:12 -05:00
{
[LabelText("Custom Label")]
public float foo;
[HideLabel]
public Vector3 bar;
[AssetsOnly]
public GameObject baz;
[Title("Title")]
[HelpBox("HelpBox", HelpBoxMessageType.Info)]
[ReadOnly]
public string message = "Read Only";
}
```
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-attributes-example.png" width="600">
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
各フィールドをグループ化する属性も用意されています。各グループはスラッシュ`/`で区切ることでネストできます。
2023-12-02 01:17:12 -05:00
```cs
using UnityEngine;
using Alchemy.Inspector;
2024-02-20 01:53:56 -05:00
public class GroupAttributesExample : MonoBehaviour
2023-12-02 01:17:12 -05:00
{
2024-02-20 01:53:56 -05:00
[FoldoutGroup("Foldout")]
public int a;
[FoldoutGroup("Foldout")]
public int b;
[FoldoutGroup("Foldout")]
public int c;
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
[TabGroup("Tab", "Tab1")]
public int x;
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
[TabGroup("Tab", "Tab2")]
public string y;
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
[TabGroup("Tab", "Tab3")]
public Vector3 z;
2023-12-02 01:17:12 -05:00
}
```
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-group-1.png" width="600">
2023-12-02 01:17:12 -05:00
メソッドに`[Button]`属性を付加することで、メソッドをInspectorから実行することが可能になります。
```cs
using System.Text;
using UnityEngine;
using Alchemy.Inspector;
[Serializable]
2024-02-20 01:53:56 -05:00
public sealed class Example : IExample
2023-12-02 01:17:12 -05:00
{
public float foo;
public Vector3 bar;
public GameObject baz;
}
2024-02-20 01:53:56 -05:00
public class ButtonExample : MonoBehaviour
2023-12-02 01:17:12 -05:00
{
[Button]
public void Foo()
{
Debug.Log("Foo");
}
[Button]
public void Foo(int parameter)
{
Debug.Log("Foo: " + parameter);
}
[Button]
2024-02-20 01:53:56 -05:00
public void Foo(Example parameter)
2023-12-02 01:17:12 -05:00
{
var builder = new StringBuilder();
builder.AppendLine();
builder.Append("foo = ").AppendLine(parameter.foo.ToString());
builder.Append("bar = ").AppendLine(parameter.bar.ToString());
builder.Append("baz = ").Append(parameter.baz == null ? "Null" : parameter.baz.ToString());
Debug.Log("Foo: " + builder.ToString());
}
}
```
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-button.png" width="600">
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
Alchemyでは他にも数多くの属性が提供されています。利用可能な属性の一覧は[ドキュメント](https://annulusgames.github.io/Alchemy/articles/ja/inspector-extension-with-attributes.html)から確認できます。
2023-12-02 01:17:12 -05:00
## インターフェース/抽象クラスを編集する
2024-02-20 01:53:56 -05:00
AlchemyはUnityのSerializeReferenceに対応しています。`[SerializeReference]`属性を付加することでインターフェースや抽象クラスをInspector上で編集できるようになります。
2023-12-02 01:17:12 -05:00
```cs
using UnityEngine;
2024-02-20 01:53:56 -05:00
public interface IExample { }
2023-12-02 01:17:12 -05:00
[Serializable]
2024-02-20 01:53:56 -05:00
public sealed class ExampleA : IExample
2023-12-02 01:17:12 -05:00
{
public float alpha;
}
[Serializable]
2024-02-20 01:53:56 -05:00
public sealed class ExampleB : IExample
2023-12-02 01:17:12 -05:00
{
public Vector3 beta;
}
[Serializable]
2024-02-20 01:53:56 -05:00
public sealed class ExampleC : IExample
2023-12-02 01:17:12 -05:00
{
public GameObject gamma;
}
2024-02-20 01:53:56 -05:00
public class SerializeReferenceExample : MonoBehaviour
2023-12-02 01:17:12 -05:00
{
2024-02-20 01:53:56 -05:00
[SerializeReference] public IExample Example;
[SerializeReference] public IExample[] ExampleArray;
2023-12-02 01:17:12 -05:00
}
```
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-serialize-reference.png" width="600">
2023-12-02 01:17:12 -05:00
インターフェース・抽象クラスは上のように表示され、ドロップダウンから子クラスを選択して生成することができます。
2024-02-20 01:53:56 -05:00
詳細は[SerializeReference](https://annulusgames.github.io/Alchemy/articles/ja/serialize-reference.html)のページを参照してください。
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
## Hierarchy
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
Alchemyを導入することで、Hierarchyを拡張するいくつかの機能が追加されます。
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-hierarchy.png" width="600">
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
### トグルとアイコン
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/gif-hierarchy-toggle.gif" width="600">
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
Hierarchyにオブジェクトのアクティブ/非アクティブを切り替えるトグルと、オブジェクトの持つコンポーネントのアイコンの表示を追加できます。これらはProjectSettingsから設定が可能です。
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-project-settings.png" width="600">
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
### 装飾
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
また、CreateメニューからHierarchyを装飾するためのオブジェクトを作成可能になります。
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-create-hierarchy-object.png" width="600">
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
これらのオブジェクトはビルド時に自動的に除外されます。(子オブジェクトを持つ場合は全てデタッチしてから削除されます。)
詳細は[Hierarchyの装飾](https://annulusgames.github.io/Alchemy/articles/ja/decorating-hierarchy.html)を参照してください。
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
## AlchemyEditorWindow
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
通常の`Editor`クラスではなく`AlchemyEditorWindow`クラスを継承することで、Alchemyの属性を用いてエディタウィンドウを作成することができるようになります。
2023-12-02 01:17:12 -05:00
```cs
using System;
using System.Collections.Generic;
2024-02-20 01:53:56 -05:00
using UnityEditor;
2023-12-02 01:17:12 -05:00
using UnityEngine;
2024-02-20 01:53:56 -05:00
using UnityEngine.UIElements;
using Alchemy.Editor;
using Alchemy.Inspector;
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
public class EditorWindowExample : AlchemyEditorWindow
2023-12-02 01:17:12 -05:00
{
2024-02-20 01:53:56 -05:00
[MenuItem("Window/Example")]
static void Open()
2023-12-02 01:17:12 -05:00
{
2024-02-20 01:53:56 -05:00
var window = GetWindow<EditorWindowExample>("Example");
window.Show();
2023-12-02 01:17:12 -05:00
}
2024-02-20 01:53:56 -05:00
[Serializable]
[HorizontalGroup]
public class DatabaseItem
2023-12-02 01:17:12 -05:00
{
2024-02-20 01:53:56 -05:00
[LabelWidth(30f)]
public float foo;
[LabelWidth(30f)]
public Vector3 bar;
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
[LabelWidth(30f)]
public GameObject baz;
2023-12-02 01:17:12 -05:00
}
2024-02-20 01:53:56 -05:00
[ListViewSettings(ShowAlternatingRowBackgrounds = AlternatingRowBackground.All, ShowFoldoutHeader = false)]
public List<DatabaseItem> items;
[Button, HorizontalGroup]
public void Button1() { }
[Button, HorizontalGroup]
public void Button2() { }
[Button, HorizontalGroup]
public void Button3() { }
2023-12-02 01:17:12 -05:00
}
```
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-editor-window.png" width="600">
`AlchemyEditorWindow`を継承して作成したウィンドウのデータは、プロジェクトのProjectSettingsフォルダにjson形式で保存されます。詳細は[EditorWindowのデータを保存する](https://annulusgames.github.io/Alchemy/articles/ja/saving-editor-window-data.html)のページを参照してください。
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
## シリアル化拡張を使用する
Dictionaryなどの通常のUnityがシリアル化できない型を編集したい場合、`[AlchemySerialize]`属性を使用してシリアル化を行うことができます。
シリアル化拡張を使用したい場合、[Unity.Serialization](https://docs.unity3d.com/Packages/com.unity.serialization@3.1/manual/index.html)パッケージが必要になります。また、リフレクションを用いたUnity.Serializationのシリアル化はUnity2022.1以前のAOT環境で動作しない可能性があります。詳細はパッケージのマニュアルを確認してください。
以下は、Alchemyのシリアル化拡張を用いて様々な型をシリアル化/Inspectorで編集可能にするサンプルです。
2023-12-02 01:17:12 -05:00
```cs
using System;
using System.Collections.Generic;
using UnityEngine;
2024-02-20 01:53:56 -05:00
using Alchemy.Serialization; // Alchemy.Serialization名前空間をusingに追加
2023-12-02 01:17:12 -05:00
2024-02-20 01:53:56 -05:00
// [AlchemySerialize]属性を付加することでAlchemyのシリアル化拡張が有効化されます。
// 任意の基底クラスを持つ型に使用できますが、SourceGeneratorがコード生成を行うため対象型はpartialである必要があります。
2023-12-02 01:17:12 -05:00
[AlchemySerialize]
2024-02-20 01:53:56 -05:00
public partial class AlchemySerializationExample : MonoBehaviour
2023-12-02 01:17:12 -05:00
{
2024-02-20 01:53:56 -05:00
// 対象のフィールドに[AlchemySerializeField]属性と[NonSerialized]属性を付加します。
2023-12-02 01:17:12 -05:00
[AlchemySerializeField, NonSerialized]
2024-02-20 01:53:56 -05:00
public HashSet<GameObject> hashset = new();
2023-12-02 05:51:06 -05:00
2024-02-20 01:53:56 -05:00
[AlchemySerializeField, NonSerialized]
public Dictionary<string, GameObject> dictionary = new();
2023-12-02 05:51:06 -05:00
2024-02-20 01:53:56 -05:00
[AlchemySerializeField, NonSerialized]
public (int, int) tuple;
2023-12-02 05:51:06 -05:00
2024-02-20 01:53:56 -05:00
[AlchemySerializeField, NonSerialized]
public Vector3? nullable = null;
2023-12-02 05:51:06 -05:00
}
```
2024-02-20 01:53:56 -05:00
<img src="https://github.com/AnnulusGames/Alchemy/blob/main/docs/images/img-serialization-sample.png" width="600">
2023-12-02 05:51:06 -05:00
2024-02-20 01:53:56 -05:00
シリアル化プロセスの技術的な詳細についてはドキュメントの[Alchemyのシリアル化プロセス](https://annulusgames.github.io/Alchemy/articles/ja/alchemy-serialization-process.html)を参照してください。
2023-12-02 05:51:06 -05:00
2023-12-03 00:44:05 -05:00
## ヘルプ
Unity forum: https://forum.unity.com/threads/released-alchemy-inspector-serialization-extensions.1523665/
2023-12-02 01:17:12 -05:00
## ライセンス
[MIT License](LICENSE)