個人開発者のブログ
目次
-
何故表示されないのか
-
コードと使い方
-
まとめ
何故表示されないのか
そもそも何故、DateTimeはインスペクター上で表示されないのか?
その理由は、Unityのシリアライズシステムの仕様と、DateTimeの構造と属性に起因します。
Unityのインスペクターに値を表示するには、対象のフィールドが Unityのシリアライズ対象である必要があります。Unityは独自のシリアライズシステムを使っており、以下のような制限があります。
・public もしくは [SerializeField] 属性付きの フィールド
・Unityがサポートする プリミティブ型:int, float, string,
bool, Vector3, Color, など
・Unityのシリアライズ可能なクラス/構造体(例:Serializable 属性付きのクラスや構造体で、かつフィールドも対応しているもの)
一方DateTimeはUnityの標準シリアライズルールに適合しないため、インスペクターに表示されず、値の編集もできません。
これはDateTimeが.NET標準の高機能な型である一方、Unityのシリアライズ対象として想定されていないことに起因します。
ですが安心してください。
逆に考えれば、疑似的にUnity の標準シリアライズルールに適合させればいいのです。
次にコード付きで、その方法を紹介しましょう。
コードと使い方
やることもそのコード内容も割と単純。
string表示で標準シリアライズルールに適合した、新しいDateTimeを自作するだけ。
using System; using UnityEngine; [Serializable] public class SerializableDateTime { [SerializeField] private string dateTimeString; public DateTime DateTimeValue { get => DateTime.TryParse(dateTimeString, out var result) ? result : System.DateTime.MinValue; set => dateTimeString = value.ToString("yyyy-MM-dd HH:mm:ss"); } }
使い方は、以降インスペクター上でDateTimeを確認したい場合、DateTimeの代わりにSerializableDateTimeを使います。
[SerializeField] private SerializableDateTime serializableDateTime;
↑のようにして定義でき、
serializableDateTime.DateTimeValue = DateTime.UtcNow.AddHours(9);
DateTimeValueに対して表示したいDateTime値を渡します。
これだけでインスペクターへ表示されるようになるのです。
まとめ
いかがでしたか?
今回紹介したコードをコピペするだけで、DateTimeをインスペクター上で表示できます。
もし必要な際は、是非今回紹介したコードを活用してみて下さい。
ここまで記事を見て頂き、誠にありがとうございました。
これからも開発関連の記事は更新し続けるつもりなので、今後も機会があれば見てみてください。
では、また別の記事でお会いましょう。。_(:3 」∠)_
☝絵師必見!AI無断学習対策アプリ
