質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

5514閲覧

unityでプロパティに動的変数でアクセスしたい

kaji

総合スコア648

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/09/21 16:36

編集2017/09/21 16:36

unityのc#で例えば"ext1"文字列が引数で渡された時に
Setting.csのプロパティのext1が表示されるようにしたいです。

Setting.csのext1プロパティについては

以下クラスでSetting.ext1でアクセスできました。

class Setting { public static string ext1 = "weight"; }

やりたいことはメインからext1の文字列が渡された時にweightと表示させたいです。

class MainScript { private void main() { this.method1("ext1"); } private void method1(name) { Debug.Log(Setting.name); // ここでweightと表示させたいが、これだとnameプロパティを見てしまいエラーとなる } }

phpであればSetting::$nameというような感じで表示できるのですが、
unityのc#ではどのようにすれば良いでしょうか?
検索してもどういうワードで検索して良いかわかりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

文字列でプロパティを参照するのはおすすめしません。
問題が起きた際に特定が困難になるからです。
面倒ですがenumと拡張メソッドを実装するのがおすすめです。

C#

1//[注意] staticクラスにしました 2static class Setting 3{ 4 public static string ext1 = "weight"; 5 6 //プロパティーを参照するenum拡張メソッド 7 public static string getProperty(this settingProperty type) 8 { 9 switch(type) 10 { 11 case settingProperty.ext1: 12 return ext1; 13 } 14 15 return string.Empty; 16 } 17} 18 19//enumを定義 20enum settingProperty 21{ 22 ext1 23} 24 25class MainScript 26{ 27 private void main() 28 { 29 this.method1( settingProperty.ext1 ); 30 } 31 32 private void method1(settingProperty type) 33 { 34 Debug.Log( type.getProperty() ); 35 } 36}

Settingをstaticクラスにしない場合は別途静的クラスにenumの拡張メソッドを実装する必要があります。

C#

1static class settingPropertyEx 2{ 3 //プロパティーを参照するメソッド 4 public static string getProperty(this settingProperty type) 5 { 6 switch (type) 7 { 8 case settingProperty.ext1: 9 return Setting.ext1; 10 } 11 12 return string.Empty; 13 } 14}

[追記]フィールドの取得にenumとそれに伴うエクステンションを記述するのは面倒なので他の安全なフィールドの取得方法を提供いたします。ごらんください。

[追記] 内部で処理が必要で外部に値の取得のみ公開したい場合

プロパティを使う
プロパティは自動実装プロパティ(シンタックスシュガー)を持っていてスレッドセーフなgetter setterを簡単に記述できます。これを使うことで内部で処理しつつ必要な情報を外部に公開できます。

C#

1private static string ext1 = "weight"; 2 3//1 取得getterのみ公開 4public static string Ext1 5{ 6 get{ 7 //取得される度に何か処理したい場合はここに記述する。 8 return ext1; 9 } 10} 11 12//2 取得getter 代入setterを公開 13public static string Ext2 14{ 15 get{ 16 return ext1; 17 } 18 set{ 19 //valueに代入された値が入っています。 20 ext1 = value; 21 } 22} 23 24//3-1 短く書くとこういう感じでも書けます 初期化は別でしなければいけません。 25public static string ext1_2 26{ 27 //代入を内部のみ許可する 28 get; private set; 29} 30 31//3-2 コンストラクタで初期化 32public Setting() 33{ 34 ext1_2 = "weight"; 35} 36 37//4 Unity 2017 で C# 6.0が使える環境ならこう書けます 38public static string ext1_3{ get; private set; } = "weight"; 39 40//外部から取得する方法 41Setting.Ext1

###値を定数化し外部に公開する
constまたはreadonlyを使うといいと思います。両方とも変更できない値(定数)を記述するキーワードです。違いがありますがここでは説明を省きます。

C#

1public static readonly string ext1 = "weight"; 2public const string ext2 = "weight"; 3 4//外部から取得する方法 5Setting.ext1

投稿2017/09/23 13:42

編集2017/09/26 05:40
IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaji

2017/09/26 03:14

ありがとうございます。勉強になりました。
guest

0

Reflectionを使って取得できます。

C#

1 void Start() { 2 this.method1("ext1"); 3 } 4 private void method1(string name) { 5 Debug.Log(typeof(Setting).GetField(name).GetValue(null)); 6 } 7 8 class Setting { 9 public static string ext1 = "weight"; 10 }

投稿2017/09/22 06:49

ShiroKuroShiro

総合スコア134

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

可変変数は使えないかと思いますので、Dictionary型で定義してしまうのはどうでしょうか

C#

1class Setting { 2 public static Dictionary<string, string> dictionary = new Dictionary<string, string>() 3 { 4 {"ext1", "weight"}, 5 {"ext2", "height"}, 6 {"ext3", "width"} 7 }; 8} 9 10class MainScript { 11 private void main() { 12 this.method1("ext1"); 13 } 14 15 private void method1(name) { 16 Debug.Log(Setting.dictionary[name]); 17 } 18}

投稿2017/09/22 04:12

Clor

総合スコア883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問