{"id":28647117,"url":"https://github.com/ruccho/unityped","last_synced_at":"2025-08-31T12:34:27.572Z","repository":{"id":65940598,"uuid":"602946213","full_name":"ruccho/UniTyped","owner":"ruccho","description":"UniTyped is a source generator that allows typed access to data such as SerializedObjects, material parameters, tags and layers.","archived":false,"fork":false,"pushed_at":"2024-11-28T10:30:15.000Z","size":9657,"stargazers_count":174,"open_issues_count":1,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-06-13T02:49:15.159Z","etag":null,"topics":["csharp","dotnet","roslyn","source-generator"],"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/ruccho.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2023-02-17T09:34:19.000Z","updated_at":"2025-05-14T15:27:23.000Z","dependencies_parsed_at":"2024-11-28T11:23:44.270Z","dependency_job_id":"f610097a-0bd6-4d58-8ba6-8a9fad1c8765","html_url":"https://github.com/ruccho/UniTyped","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ruccho/UniTyped","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruccho%2FUniTyped","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruccho%2FUniTyped/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruccho%2FUniTyped/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruccho%2FUniTyped/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruccho","download_url":"https://codeload.github.com/ruccho/UniTyped/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruccho%2FUniTyped/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272982487,"owners_count":25025982,"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","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["csharp","dotnet","roslyn","source-generator"],"created_at":"2025-06-13T02:42:40.755Z","updated_at":"2025-08-31T12:34:27.562Z","avatar_url":"https://github.com/ruccho.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UniTyped\n\n[English](README.md)\n\nUniTypedは、SerializedObjectやマテリアルパラメータ、タグやレイヤーなどのデータに対し、型付けされたアクセスを可能にするソースジェネレータです。より簡潔で安全なコードを書くのに役立ちます。\n\n- **静的型付き**: 文字列ベースの不安定なデータアクセスを排除し、存在しないデータへのアクセスをコンパイルの段階で発見できるようになります。大量の `FindProperty` を書いたり、SerializedPropertyのややこしいAPIを触る必要がなくなります。\n- **低ヒープメモリ確保**:  生成コードは構造体ベースで、boxingを避けるように設計されています。\n\n# Table of Contents\n\n - [要件](#要件)\n - [インストール](#インストール)\n - [制限事項](#制限事項)\n - [機能](#機能)\n    - [型付きビューの自動生成](#型付きビューの自動生成)\n        - [シリアライズされたオブジェクト](#シリアライズされたオブジェクト)\n        - [マテリアル](#マテリアル)\n        - [Animatorパラメータ](#Animatorパラメータ)\n    - [タグとレイヤーのEnumの自動生成](#タグとレイヤーのEnumの自動生成)\n - [Manual Generator](#manual-generator)\n\n# 要件\n - Unity 2021.2 以上で完全にサポートされます。\n - Unity 2021.1 以下では[Manual Generator](#manual-generator)を使用することでUniTypedの機能を利用できます。\n\n# インストール\nPackage Manager から次の git URL を追加してください：`https://github.com/ruccho/UniTyped.git?path=/Packages/com.ruccho.unityped`\n\n# 制限事項\n - このプロジェクトは現在experimentalで、破壊的変更が加えられる可能性があります。\n - すべてのユースケースがカバーできていないかもしれません。お気づきの点があればissueでお知らせください。\n\n# 機能\n\n## 型付きビューの自動生成\n\n### シリアライズされたオブジェクト\n`[UniTyped.UniTyped]`属性をMonoBehaviourやScriptableObject、またはその他のSerializableなカスタムクラスに適用してください。すると、`UniTyped.Generated.[YourNamespace].[YourClass]View` という構造体が使用できるようになります。\n\n```csharp\nusing UnityEngine;\nusing UniTyped;\nusing UniTyped.Generated;\n\n[UniTyped]\npublic class Example : MonoBehaviour\n{\n    [SerializeField] private int someValue = 0;\n}\n\n#if UNITY_EDITOR\n\n[UnityEditor.CustomEditor(typeof(Example))]\npublic class ExampleEditor : UnityEditor.Editor\n{\n    public override void OnInspectorGUI()\n    {\n        //ExampleViewは自動生成されたstruct\n        var view = new ExampleView()\n        {\n            Target = serializedObject\n        };\n        \n        //serializedObject.FindProperty(\"someValue\").intValue++;と同等\n        view.someValue++;\n\n        serializedObject.ApplyModifiedProperties();\n        \n    }\n}\n\n#endif\n```\n\n#### 配列・リストの操作\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UniTyped;\n\n[UniTyped]\npublic class Example : MonoBehaviour\n{\n    [SerializeField] private int[] someArray = default;\n    [SerializeField] private List\u003cint\u003e someList = default;\n}\n\n\n#if UNITY_EDITOR\n\n[UnityEditor.CustomEditor(typeof(Example))]\npublic class ExampleEditor : UnityEditor.Editor\n{\n    public override void OnInspectorGUI()\n    {\n        var view = new UniTyped.Generated.ExampleView()\n        {\n            Target = serializedObject\n        };\n\n        // array access\n        for (int i = 0; i \u003c view.someArray.Length; i++)\n        {\n            Debug.Log(view.someArray[i].Value);\n        }\n\n        //also accessible with IEnumerator\u003cT\u003e\n        foreach (var element in view.someArray)\n        {\n            Debug.Log(element.Value);\n        }\n\n        serializedObject.ApplyModifiedProperties();\n\n        base.OnInspectorGUI();\n    }\n}\n\n#endif\n```\n\n\n#### コード生成を調整する\n`[UniTypedField]`属性のオプションを使用して、コード生成の内容を調整できます。\n\n - `ignore`: そのフィールドをコード生成の対象から外します。\n - `nestedField`: デフォルトでUniTypedは値の直接操作を可能にするために、アクセサプロパティをフラット化します。このオプションはそれを無効化し、内部のViewを公開します。特定の `SerializedProperty` にアクセスしたい場合などに便利です。\n\n```csharp\nusing UnityEngine;\nusing UniTyped;\nusing UniTyped.Generated;\n\n\n[UniTyped]\npublic class Example : MonoBehaviour\n{\n    [SerializeField, UniTypedField(ignore = true)]\n    private int ignoredField = 0;\n    \n    [SerializeField, UniTypedField(forceNested = true)]\n    private int nestedField = 0;\n}\n\n#if UNITY_EDITOR\n\n[UnityEditor.CustomEditor(typeof(Example))]\npublic class ExampleEditor : UnityEditor.Editor\n{\n    public override void OnInspectorGUI()\n    {\n        var view = new ExampleView()\n        {\n            Target = serializedObject\n        };\n\n        \n        view.ignoredField++; // error: Cannot resolve symbol 'ignoreField'\n\n        Debug.Log(view.nestedField.Value); // int Value { get; set; }\n        Debug.Log(view.nestedField.Property); // SerializedProperty Property { get; set; }\n        \n\n        serializedObject.ApplyModifiedProperties();\n        \n    }\n}\n#endif\n```\n\n### マテリアル\n\n`UniTyped.UniTypedMaterialView` 属性つきの `partial` なstructを作成します。\n\n```csharp\nusing UnityEngine;\nusing UniTyped;\n\n//このスクリプトからの相対パスを指定\n[UniTypedMaterialView(\"NewUnlitShader.shader\")]\npublic partial struct NewUnlitShaderView\n{\n    \n}\n\n//ShaderGraphにも対応しています。\n/*\n[UniTypedMaterialView(\"New Shader Graph.shadergraph\")]\npublic partial struct NewShaderGraphView\n{\n}\n*/\n\npublic class MaterialViewExample : MonoBehaviour\n{\n    [SerializeField] private Material mat = default;\n\n    void Update()\n    {\n        var view = new NewUnlitShaderView()\n        {\n            Target = mat\n        };\n\n        view._Color = Color.HSVToRGB(Time.time % 1f, 1f, 1f);\n\n    }\n}\n\n```\n\n```shaderlab\nShader \"Unlit/NewUnlitShader\"\n{\n    Properties\n    {\n        _MainTex (\"Texture\", 2D) = \"white\" {}\n        _Color(\"Color\", Color) = (1, 1, 1, 1)\n    }\n\n    //...\n}\n```\n\n### Animatorパラメータ\n\n`UniTyped.UniTypedAnimatorView` 属性つきの `partial` なstructを作成します。\n最新のAnimator Controllerアセットが`Save Project`でディスクに保存されていることを確認してください。\n\n![image](https://user-images.githubusercontent.com/16096562/235991706-f8db8e2f-36c9-4ff7-9e67-73c03645f206.png)\n\n```csharp\nusing UnityEngine;\nusing UniTyped;\n\n[UniTypedAnimatorView(\"New Animator Controller.controller\")]\npublic partial struct NewAnimatorControllerView\n{\n    \n}\n\npublic class AnimatorViewExample : MonoBehaviour\n{\n\n    private Animator animator;\n    \n    void Update()\n    {\n        if (!animator \u0026\u0026 !TryGetComponent(out animator)) return;\n        \n        var view = new NewAnimatorControllerView()\n        {\n            Target = animator\n        };\n\n        // Float\n        view.FloatParameter = Time.time;\n        view.SetFloatParameter(Time.time, dampTime, deltaTime);\n        \n        // Int\n        view.IntParameter = Time.frameCount;\n        \n        // Bool\n        view.BoolParameter = true;\n        \n        // Trigger\n        view.TriggerA();\n        view.ResetTriggerA();\n    }\n}\n```\n\n## タグとレイヤーのEnumの自動生成\n\n`UniTyped.Reflection` 名前空間に `Tags`, `Layers`, `SortingLayers` の enum が自動生成されます。\n\nこれらのメンバーは`UniTyped`アセンブリ内に生成されるため、Project Settingsからタグやレイヤーに変更を加えた後、`UniTyped`アセンブリをリコンパイルする必要があります。これはメニューバーの `Assets` \u003e `UniTyped` \u003e `Apply Tags and Layers Reflection` オプションで行えます。\n\n```csharp\nusing System.Collections.ObjectModel;\nusing UnityEngine;\nusing UniTyped.Reflection;\n\npublic class TagsAndLayersExample : MonoBehaviour\n{\n    private void Start()\n    {\n        // ---Tags---\n        \n        Debug.Log(Tags.New_tag);\n        \n        // タグ名は UniTyped.Reflection.TagUtility を使用して操作できます。\n        Debug.Log(TagUtility.GetTagName(Tags.New_tag)); // \"New tag\"\n        TagUtility.TryGetTagValue(\"New tag\", out Tags result); // result: Tags.New_tag\n        ReadOnlyCollection\u003cstring\u003e tagNames = TagUtility.TagNames; // タグ名を列挙\n        \n        \n        // ---Layers---\n        \n        Debug.Log(Layers.Default);\n        Debug.Log(Layers.UI);\n        Debug.Log(Layers.Water);\n        Debug.Log(Layers.Ignore_Raycast);\n        Debug.Log(Layers.TransparentFX);\n        \n        // Layers列挙体の値はそのままレイヤーのインデックスに変換できます。\n        Debug.Log(LayerMask.LayerToName((int)Layers.Default));\n        \n        \n        // ---Sorting Layers---\n        \n        Debug.Log(SortingLayers.Default);\n        \n        // SortingLayers列挙体の値はそのままSorting LayerのIDに変換できます。\n        SortingLayer.GetLayerValueFromID((int)SortingLayers.Default);\n    }\n}\n```\n \n# Manual Generator\nデフォルトでは、UniTypeはUnity 2021.2以降で使用できる Roslyn source generator の機能を使用します。 Unity 2021.1以下では、個別のパッケージとして提供される Manual Generator を使用して代替することができます。\n\n## 要件\n\n - .NET ランタイム (`netcoreapp3.1` ターゲットが使用可能なもの)\n    - `dotnet` CLIツールが使用できることを確認してください\n - MSBuild (Visual Studio や .NET SDK に含まれています)\n\n## インストール\n\nPackage Manager から次の git URL を追加してください： `https://github.com/ruccho/UniTyped.git?path=/Packages/com.ruccho.unityped.manualgenerator`\n\n## 使い方\n\n1. Projectビューから `Create` \u003e `UniTyped` \u003e `Manual Generator Profile` でGenerator Profileを作成します。\n2. Generator Itemを追加します。\n3. 対象のスクリプトを含む `csproj` のパスを指定します。\n4. 出力先のC# スクリプトのパスを指定します（上書きされます！）\n5. `Generate` ボタンを押します。\n\n![image](https://user-images.githubusercontent.com/16096562/220120237-1fb1afa2-cd56-4b4f-80c6-aa1b3269a24e.png)\n\n## ヒント\n - Manual generator の実行可能ファイル `UniTyped.Generator.Standalone.exe` が `Packages/com.ruccho.unityped.manualgenerator/Editor/Executable~/netcoreapp3.1` で見つかります。 このツールは次のオプションでコマンドラインから使用できます： `--project=\u003cCSPROJ PATH\u003e --output=\u003cOUTPUT SCRIPT PATH\u003e`.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruccho%2Funityped","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruccho%2Funityped","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruccho%2Funityped/lists"}