ruccho/UniTyped

UniTyped属性を付与したクラスの名前空間の階層が深いとき、Viewの名前空間がおかしくなる

yuyu0127 opened this issue · 2 comments

概要

階層の深さが3以上である名前空間に宣言されたクラスに対してUniTyped属性を付与したとき、Viewクラスが中間の階層の名前空間を全てスキップした名前空間に宣言されるようです。

【例】
NS1.NS2.NS3.NS4.Test クラスに対してUniTyped属性を付与したところ、Viewが NS1.NS4.TestView として自動生成されます。
Viewは NS1.NS2.NS3.NS4.TestView となるのが正しいのではないかと推察されます。

発生コード

次のコードのように、それぞれ異なる階層の深さをもつ名前空間以下にクラスを宣言し、UniTyped属性を付与しました.

using UnityEngine;
using UniTyped;

// 階層なし
[UniTyped]
public class TestRoot : MonoBehaviour
{
}

// 1階層
namespace NS1
{
    [UniTyped]
    public class Test1 : MonoBehaviour
    {
    }
}

// 2階層
namespace NS1.NS2
{
    [UniTyped]
    public class Test2 : MonoBehaviour
    {
    }
}

// 3階層
namespace NS1.NS2.NS3
{
    [UniTyped]
    public class Test3 : MonoBehaviour
    {
    }
}

// 4階層
namespace NS1.NS2.NS3.NS4
{
    [UniTyped]
    public class Test4 : MonoBehaviour
    {
    }
}

このとき、自動生成コードの内容が次のようになりました。

// Assembly Assembly-CSharp 2023/05/01 14:01:52
#if UNITY_EDITOR
class UniTypedGeneratedTracker {}
// UniTyped.Generated.TestRootView
// UniTyped.Generated.NS1.Test1View
// UniTyped.Generated.NS1.NS2.Test2View
// UniTyped.Generated.NS1.NS3.Test3View
// UniTyped.Generated.NS1.NS4.Test4View
namespace UniTyped
{
namespace Generated
{
    // TestRoot
    public struct TestRootView
    {
        public global::UnityEditor.SerializedObject Target { get; set; }
    } // struct TestRootView

namespace NS1
{
    // Test1
    public struct Test1View
    {
        public global::UnityEditor.SerializedObject Target { get; set; }
    } // struct Test1View

namespace NS2
{
    // Test2
    public struct Test2View
    {
        public global::UnityEditor.SerializedObject Target { get; set; }
    } // struct Test2View

} // namespace NS2

namespace NS3
{
    // Test3
    public struct Test3View
    {
        public global::UnityEditor.SerializedObject Target { get; set; }
    } // struct Test3View

} // namespace NS3

namespace NS4
{
    // Test4
    public struct Test4View
    {
        public global::UnityEditor.SerializedObject Target { get; set; }
    } // struct Test4View

} // namespace NS4

} // namespace NS1

} // namespace Generated

} // namespace UniTyped

#endif
// UniTypedMaterialViewGenerator

ここから、それぞれのViewクラスが宣言される名前空間が表のようになっていることがわかります。

View生成元 View 名前空間が一致しているか?
TestRoot TestRootView
NS1.Test1 NS1.Test1View
NS1.NS2.Test2 NS1.NS2.Test2View
NS1.NS2.NS3.Test3 NS1.NS3.Test3View 🚫
NS1.NS2.NS3.NS4.Test4 NS1.NS4.Test4View 🚫

発生環境

  • OS:macOS Ventura 13.3.1
  • チップ:Apple M1 Pro
  • Unity:2021.3.24f1
  • UniTyped:0.1.2
  • Unityプロジェクト:「3D (URP)」テンプレートの初期状態にUPM経由でUniTypedを導入した状態
ruccho commented

ありがとうございます、修正をv0.1.3としてリリースしました。

迅速にご対応いただきありがとうございます!
これで製作中のプロジェクトにも導入できそうです🙏🏻