Unityで、コンポーネント内のフィールドを文字列から動的に変更する
こんにちはー!!
Json からUnity2dのステージのデータを取ろうとしています。
その時、コンポーネントの値を変えたいと思い、この方法をやりました。
Reflectionを使ったりして、結構複雑でした。
ReflectionTest コンポーネントの内容は次のようにします。
これを、GameObject1 にアタッチすればできます。
安全性は・・
しかし、コンポーネント内すべてのフィールドにアクセスできるのは
ちょっとセキュリティが・・・なので、
特定の属性(ここではPermitReflection)がついたフィールドのみにアクセスできるようにします。
Reflectionに使ったしたコード(2つ上のコード)を、次のように編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| Type componentType = Type.GetType(componentType); Attribute fieldAttribute = Attribute.GetCustomAttribute(componentType.GetField(fieldName), typeof(PermitReflectionAttribute)); if (fieldAttribute != null) { Component targetComponent = GameObject.Find(gameObjectName).GetComponent(componentName); Type fieldType = componentType.InvokeMember(fieldName, BindingFlags.GetField, null, targetComponent, null).GetType(); object parameter; if (fieldType == typeof(string)) { parameter = fieldVal; } else if (fieldType == typeof(int)) { parameter = int.Parse(fieldVal); } componentType.InvokeMember(fieldName, BindingFlags.SetField, null, targetComponent, new object[] { parameter }); } }
[AttributeUsage(AttributeTargets.Field)] public class PermitReflectionAttribute : Attribute { }
|
ReflectionTest コンポーネントは次のように変更します。
PermitReflectionAttributeですが、属性として指定する場合は、
Attributeを抜いて、PermitReflectionとします。