VRChatのUdonSharp(U#)の2次元配列のInspector表示について

U# 1系で2次元配列がInspector表示されない

従来はU#でクラス変数を記述するときにpublicで宣言する、もしくは[SerializeField]属性を付与すると、UdonBehaviourのInspectorでその変数の値を設定できるようになるが、U#の1系(バージョン1.0以降)で2次元配列の変数がInspectorに表示されなくなっている。

以下、サンプルコードとInspectorの見え方。

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class ArrayTest : UdonSharpBehaviour
{
    public int a;
    public int[] b;
    public int[][] c;
    public int d;

    void Start()
    {
        
    }
}
U# v0.20.3。ちゃんと2次元配列CがInspectorに表示されている。
U# v1.0.0b9。2次元配列Cのみ、Inspectorに表示されていない。

確認したわけではないが、おそらく3次以上の配列でも同様と思われる。

U# 1系で2次元配列を表示させるには?

不具合かと思ってvrchat-community/UdonSharpにIssueを立てたところ、開発者のMerlinさんから速攻で回答が…!(ありがとうございます!!)

This is intentional as they wouldn't serialize with just [SerializeField] anymore due to Unity's serializer not handling jagged arrays. If you mark the fields with [OdinSerialize] instead they should still show up in 1.0. They will show up at the bottom of the inspector list due to how compatibility is handled.

https://github.com/vrchat-community/UdonSharp/issues/57

Unityのシリアライザがジャグ配列を扱えないため、[SerializeField]ではシリアライズ化されないためとのこと。
で、変わりに[OdinSerialize]を使うようにとのこと。

以下、修正版のコード

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using VRC.Udon.Serialization.OdinSerializer;

public class ArrayTest : UdonSharpBehaviour
{
    public int a;
    public int[] b;
    [OdinSerialize] private int[][] c_private; // こっちは表示されない。
    [OdinSerialize] public int[][] c_public;   // こっちは表示される。publicが必須の模様。
    public int d;

    void Start()
    {
        
    }
}

OdinSerializeを使用するために、VRC.Udon.Serialization.OdinSerializerをusingする。
また、[OdinSerialize]は[SerializeField]と違い、Inspectorに表示するにはpublicで宣言することが必須な模様。
こちらのコードをU#の0系、1系にアタッチした結果がこちら。

U# v0.20.3。[SerializeField]と変わらず、2次元配列C_publicがInspectorに表示されている。
U# v1.0.0b9。[SerializeField]と違い、ちゃんと2次元配列C_publicがInspectorに表示されている。
但し、表示位置が最下層になっている。

[OdinSerialize]を使用することで、U# 1系で二次配列をInspectorに表示させることができましたが、以下の点には注意点する必要がありそうです。

  • 変数はpublicで宣言する必要があるので、アクセス権に注意

  • 表示位置が最下層になってします

また、0系、1系どちらでも使用可能なため、互換を考えると、Inspectorに表示させたい2次元配列は[OdinSerialize]で記述するのが良いでしょう。

この記事が気に入ったらサポートをしてみませんか?