2016-10-19 7 views
2

Unity3Dのゲームのためにシステムに取り掛かりたいので、プロパティに関数を渡すだけで簡単にプロパティを表示できます。しかし、それを機能させるためには、私はプロパティの名前が必要で、私はそれを正しく得ることができません。今、これは私が作ったものです。
私の "インスペクタスクリプト"では、基本的にはこれだけです。これは、 "他の"ものを扱う継承された関数を呼び出します。この場合、 'value'はUnityのTransformコンポーネントで、 'position'はVector3プロパティです。今C#&Unity - オブジェクトとしてプロパティを渡してプロパティ名を取得する

DoUI(value.position); 

「DoUI」機能

protected virtual void DoUI(object property) 
{ 
    Type type = property.GetType(); 
    Debug.Log("Type ToString: " + type.ToString() + " | Name: " + type.Name + " | Full Name: " + type.FullName); 
} 

、関数は、デバッグメッセージを出力し、そのを見ることで、私はそれが正しいではないことがわかります。これは私にタイプ名、この場合はVector3を与えます。そして、はい、私はあなたがコードを見ることでそれをはっきりと見ることができることを知っています。

質問が残っているので、ユーザーが複雑なリフレクションコールを行うことなく、「そのまま」渡すだけでどのようにプロパティ名を取得できますか?それが「DoUI」のためのものです。

+0

リフレクションを使用する必要がありますhttps://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.name.aspx – Bijan

+0

@Bijan私はそれを認識していますが、どのようにこの場合、反射を使用することができます。 – Hertzole

答えて

1

C#6では、nameofオペレータを使用できます。文字列"MyProp"

を返すようnameof(myClass.MyProp)しかしユニティ5は、C#4をサポートしていますので、あなたがシリアライズされたオブジェクトと直列化されたプロパティthis workaround for lack of nameof in C# versions prior to 6

またはthis one

+0

私は彼らのいずれかを働かせることはできません。彼らはどちらも "ArgumentException:フィールドハンドルと型ハンドルが互換性がありません"返します。 – Hertzole

+0

私は、このエラーは、与えられたフィールドが指定されたクラスで宣言されていないが、その基本クラスで宣言されていないと考えます。または何か似ている – Bijan

1

を使用する必要がありますが、あなたが探しおそらく何です。それらはUnity内部の検査官によってさえ使用され、それらを採用することは問題ではありません。

シリアル化されたプロパティを使用するには、まず、編集するインスタンスでシリアル化されたオブジェクトを構築する必要があります。次に、メソッドのFindPropertyRelative(またはルートレベルにいるときはFindProperty)を使用して、オブジェクトのSerializedPropertyを取得します。次に、プロパティの名前と型にアクセスして値を設定するか、ネストされたプロパティをさらに調べることができます。シリアライズされた表現を更新するには、シリアライズされたオブジェクトのUpdateを呼び出します。変更をオブジェクトに書き戻すには、ApplyModifiedPropertiesを使用します。

しかし、2つの主な注意点があります。クラスはScriptableObjectまたはMonoBehaviourを継承するか、Serializableフラグが必要です。また、プロパティが皮肉には除外され、単一性がシリアル化できる「プロパティ」にのみアクセスできます。属性SerializeFieldでマークされたプロパティには、パブリックフィールドまたはプライベートバッキングフィールドが必要です。

+0

私はこれを使用しますが、残念ながらそれは私が後にしているプロパティであり、あなたが述べたように、Unityはそれらを直列化できません。 – Hertzole

関連する問題