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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

876閲覧

クラス名を変数で保持している場合、どのように適応すればよいのでしょうか?

akasatanaha

総合スコア44

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/02/07 17:40

編集2021/02/08 03:17

jsonからscriptableObjectを登録・更新したいのですが、
おそらく以下のコードで出来るかと思います。

var asset = AssetDatabase.LoadAssetAtPath<Hoge>("hoge.asset"); TextAsset json = AssetDatabase.LoadAssetAtPath<TextAsset>("hoge.json") JsonUtility.FromJsonOverwrite(json.text, asset);

ただやりたいことはHogeクラスの名前を変数の値として持っている場合
<Hoge><name>(変数名)にしたい場合、どうすればよいのでしょうか?

以下のイメージ

string name = "Hoge"; var asset = AssetDatabase.LoadAssetAtPath<name>(name + ".asset"); ↑---これを変数にしたい TextAsset json = AssetDatabase.LoadAssetAtPath<TextAsset>(name + ".json") JsonUtility.FromJsonOverwrite(json.text, asset);

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

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

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

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

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

BluOxy

2021/02/07 20:57

質問内容の詳細までよく読めていませんが、nameof(Hoge) はクラス名を取得するのに使えませんか。
akasatanaha

2021/02/08 02:34

ご回答ありがとうございます。 >nameof演算子を使うと、名前空間/型/メソッド/プロパティ/変数などの単純な名前(=名前空間やクラス名などで修飾されていない名前)の文字列が取得できる nameofは上記よりクラス名から文字列を取得するものなので、今回の例では少し用法が違うかと思います。
BluOxy

2021/02/08 02:43

「以下のイメージ」のような処理を持つメソッドをジェネリックメソッドとして定義し、外から型のパラメータを指定すると良さそうです。
guest

回答2

0

ジェネリックメソッド を試してください。

C#

1public void JsonOverWrite<T>(){ 2 string name = nameof(T); 3 var asset = AssetDatabase.LoadAssetAtPath<T>(name + ".asset"); 4 TextAsset json = AssetDatabase.LoadAssetAtPath<TextAsset>(name + ".json") 5 JsonUtility.FromJsonOverwrite(json.text, asset); 6}

使用例

C#

1JsonOverWrite<Hoge>(); 2JsonOverWrite<Fuga>();

投稿2021/02/08 02:48

BluOxy

総合スコア2663

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

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

akasatanaha

2021/02/08 03:13

ご回答ありがとうございます。 質問の説明が悪かったですね。 ご回答の使用例でいいますと string name = "Hoge"; JsonOverWrite<name>(); のようにしたいので、クラス名を直で書けない要件だと思っていただければと思います。
BluOxy

2021/02/08 03:20 編集

そのような記述は言語仕様的にできないと思います。 文字列は直で書けてクラス名を直で書けない理由は何でしょうか。 それが本質的な問題だと思います。
BluOxy

2021/02/08 07:25 編集

ジェネリックメソッド呼び出し時の<>の中に記述できるパラメータは型と型引数のみです。 値やオブジェクトのインスタンスは(たとえ変数に格納したとしても)渡せません。
akasatanaha

2021/02/10 09:21

言語仕様的に出来ない旨、理解しました。 C#ってそうなんですね。実行前に確定しておかないといけないという。 ご返信ありがとうございました! 勉強になりました!
guest

0

ベストアンサー

アセットをScriptableObject型としてロードしてみてはいかがでしょうか?

C#

1string name = "Hoge"; 2ScriptableObject asset = AssetDatabase.LoadAssetAtPath<ScriptableObject>("Assets/" + name + ".asset"); 3TextAsset json = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/" + name + ".json"); 4JsonUtility.FromJsonOverwrite(json.text, asset); 5EditorUtility.SetDirty(asset); 6AssetDatabase.SaveAssets();

投稿2021/02/07 20:53

Bongo

総合スコア10811

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

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

akasatanaha

2021/02/10 09:20 編集

ご返信ありがとうございます! ご提案頂いた方法を活用して問題解決いたしました! ありがとうございます。 実際には、asset がない場合、create しないといけないので(以下コード) create時に ScriptableObject を指定するとおかしな asset が出来ることになります。 ``` if(asset == null) { asset = ScriptableObject.CreateInstance<ScriptableObject>(); AssetDatabase.CreateAsset(asset , path); } ``` なので、すごく無理やりですが、 1.手動で asset を作成 2.ご提案のあった方法で、JsonUtility.FromJsonOverwriteを実行する と、うまくいきました。 ちなみに1.2.は同一プロセスだとダメです。 また asset の中身は、以下です。極論fileIDとguidさえあればよいっぽい。 ``` %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!114 &11400000 MonoBehaviour: m_Script: {fileID: 0000000, guid: 123456789, type: 3} ``` fileIDは、asset作成済みのfileIDから流用し固定にしました。海外のサイトで取れるようなことがかいてあり、試しましたが違う値になり取れませんでした。 guidのとり方は ``` string guid = AssetDatabase.AssetPathToGUID(path); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問