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

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

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

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

Unity

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

Q&A

解決済

3回答

1476閲覧

プログラムを短くしたい

L_KemonoFriends

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2021/11/02 05:33

編集2021/11/08 09:06

前提・実現したいこと

現在、assetのeasysaveでセーブデータを保存しようとしてます。
質問用タグ1~2の中を関数化してプログラムを短くしたいです。
str2とstr4を文字列の変数で実装する方法が存在する場合に教えて頂きたいです。
str2とstr4が実装できれば質問用タグ1~2の間を関数にできます。

具体的には下記の2点が行えると嬉しいです。

spt = obj.GetComponent<InputBox>();
<InputBox>をstringの変数で定義したい
spt = obj.GetComponent<str2>();のように置き換えられると嬉しい。

ES3.Save<string>(str0 , spt.ESSTR001 , str3);
のESSTR001をstringの変数で定義したい
ES3.Save<string>(str0 , spt.str4 , str3);のように置き換えられると嬉しい。

方法が存在しない場合は存在しないと教えて欲しいです。

発生している問題・エラーメッセージ

なし

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SaveScript : MonoBehaviour 6{ 7 // Start is called before the first frame update 8 void Start() 9 { 10 11 } 12 13 // Update is called once per frame 14 void Update() 15 { 16 17 } 18 19 //指定されたメニュー内のデータを全てセーブする 20 //save_load=0 セーブ //save_load=1 ロード 21 public void MenuAllSave(int menu_num , string sl_flag ) 22 { 23 if(menu_num == 1)//メニュー1のデータを全部保存する 24 { 25 InputBox spt; //スクリプト名 26 const string str0 = "x1"; //key 27 const string str1 = "入力欄"; //スクリプトがアタッチされたオブジェクト名 28 //const string str2 = "InputBox"; //スクリプト名 29 //const string str2 = spt.GetType(); // 30 const string str3 = "menu001.es3"; //セーブファイル名 31 //const string str4 = "ESSTR001"; //読み込む変数名 32 const string str5 = "わーい"; //初Load時の値 33 34 35 //ーーーー質問用タグ1ーーーー 36 GameObject obj = GameObject.Find(str1); 37 spt = obj.GetComponent<InputBox>(); 38 39 if(sl_flag == "save") 40 { 41 ES3.Save<string>(str0 , spt.ESSTR001 , str3); 42 } 43 else if(sl_flag == "load") 44 { 45 spt.ESSTR001 = ES3.Load<string>(str0,str3,defaultValue:str5); 46 } 47 else 48 { 49 //エラーが出るようにする(throw等) 50 } 51 //ーーーー質問用タグ2ーーーー 52 53 } 54 else if(menu_num == 2)//メニュー2のデータを全部保存する 55 { 56 57 } 58 else 59 { 60 //エラーが出るようにする(throw等) 61 } 62 } 63}

試したこと

ーー

補足情報(FW/ツールのバージョンなど)

unityのバージョンは2019.4.2f1です。

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

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

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

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

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

guest

回答3

0

spt = obj.GetComponent<InputBox>();
<InputBox>をstringの変数で定義したい
spt = obj.GetComponent<str2>();のように置き換えられると嬉しい。

もうベストアンサーがついてるので解決済みだとは思いますが上記だけであれば
エイリアスを付けたusingではどうでしょうか?

using ディレクティブ

C#

1using str2 = 【InputBoxの名前空間】.InputBox;

C#

1spt = obj.GetComponent<str2>();

ただあまり短く書くことにこだわると後から見たときや他の人が見たときに分かりにくくなってはしまいますのでその辺りは要検討だと思います。

投稿2021/11/15 01:02

dekaaki

総合スコア292

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

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

dekaaki

2021/11/16 21:31

このエイリアスを付ける方法は全くの別名をつけることが出来るので多用すると、せっかくクラス設計者がつけた名前を無視するので使い方は気を付けてくださいね
guest

0

ベストアンサー

spt = obj.GetComponent<InputBox>();
<InputBox>をstringの変数で定義したい
spt = obj.GetComponent<str2>();のように置き換えられると嬉しい。

これは無理なので、関数をジェネリックにします。

C#

1void MenuAllSaveSub<T>(..... 2{ 3 GameObject obj = GameObject.Find(str1); 4 T spt = obj.GetComponent<T>();

ES3.Save<string>(str0 , spt.ESSTR001 , str3);
のESSTR001をstringの変数で定義したい
ES3.Save<string>(str0 , spt.str4 , str3);のように置き換えられると嬉しい。

リフレクションを使えば文字列を引数にして取得できます。

プロパティなら spt.GetType().GetProperty("ESSTR001").GetValue(spt)
フィールドなら spt.GetType().GetField("ESSTR001").GetValue(spt)

投稿2021/11/14 15:17

KOZ6.0

総合スコア2622

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

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

L_KemonoFriends

2021/11/14 16:41

「どんな単語で検索すれば解決できるのか」と「解答例」が両方載ってて物凄くありがたいです。 求めていた100%の答えが返ってきました。
guest

0

if else でするよりも、switch文で実装すればどうでしょう

んで、おなじ文を何百回と書くってのは、そもそもの考え方が悪いです
同じ処理をするならそれを関数化するなりして、何百回のループにすることを考えればどうでしょう

イマドキでは、コードを短くするってよりも、コード量が増えよーが気にしないで、関数やメソッドを大量に作って、短いブロックに分けてしまうってのが主流となってます

投稿2021/11/02 07:20

編集2021/11/02 07:21
y_waiwai

総合スコア87719

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

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

L_KemonoFriends

2021/11/02 09:38

すみません。質問が分かりにくかったと思われるため質問を修正しました。 質問用タグ1~2の間を関数化したいと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問