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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

1回答

3501閲覧

string型をクラスに変換し、オブジェクトにアタッチしたい

metalnickel

総合スコア2

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2020/07/11 11:44

編集2020/07/11 12:22

実現したいこと

Unityで弾幕STGを作りたいと思っています。

前回、抽象クラスで生成したスクリプトを動的にアタッチする方法を質問しました。(前回の質問:解決済
次のステップとして、string型でスクリプト名を指定し、上記と同様にアタッチしたいと考えています。

発生している課題

1)抽象クラス"BulletMoveAdd"を継承した"Homing"を用意しています。

c#

1public class Homing : BulletMoveAdd{ 2 public override Vector2 ModifyDirection(Vector2 pos, Vector2 dir){ 3}

2)弾を発射する時、string型の"Homing"でインスタンスを生成し、弾にアタッチしたい。(東方弾幕風の中身を参考にしてます)
(下記のscriptNameに"Homing"を入れて、そのスクリプトをアタッチしたい)

c#

1public class Player : MonoBehaviour{ 2 ///<summary> 3 ///スクリプトで規定した弾を生成、発射します 4 ///<param name="bd">弾の種類</param> 5 ///<param name="scriptName">スクリプト名</param> 6 ///</summary> 7 public void CreateShotFromScript(BulletData bd, Vector2 shotPosition, float speed, float angle, string scriptName){ 8 GameObject bullet = BulletPool.GetBullet();//プールから弾を借りる 9 BulletController bc = bullet.GetComponent<BulletController>();//借りた弾の制御スクリプト 10 bc.BulletData = bd;//弾の種類を設定 11 12 BulletMoveAdd bma = bc.gameObject.AddComponent<"scriptName">();//ここの書き方がわからなくて困っています。 13 14 FireShot(pbc);//設定終了後、弾の発射処理を行う 15 } 16}

前回の解決コード

アタッチしたいスクリプトがあらかじめ決まっている時は、下記コードでアタッチできています。

public void SetShotDataA(BulletController bc){ BulletMoveAdd bma = bc.gameObject.AddComponent<MoveDataA>(); }

試したこと

string型からTypeを取得するGetTypeと、System.Reflectionを調べてみましたが、
使い方がよくわからずうまく実装できていません。

c#

1//??? 2System.Type type = System.Reflection.Assembly.Load("UnityEngine.dll").GetType(typeName);

どうかよろしくお願いします。

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

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

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

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

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

ozwk

2020/07/11 12:08

stringである必要はありますか?
metalnickel

2020/07/11 12:15

必要性はないです。 スクリプト名で指定するのが一番手っ取り早いかと思い、stringにしています。
guest

回答1

0

ベストアンサー

Type.GetType で簡単にできますよ。ただ自分ではよほど必然性がない限りやらないです。

csharp

1using System; 2using UnityEngine; 3 4public class AddComponentByString : MonoBehaviour 5{ 6 void Start() 7 { 8 AddComponent("UnityEngine.Rigidbody, UnityEngine"); // Unity の組み込みクラスの場合 9 AddComponent("MyController"); // (名前空間なしの)スクリプトコンポーネントの場合 10 } 11 12 void AddComponent(string componentName) 13 { 14 Type t = Type.GetType(componentName); 15 if (t != null) 16 { 17 gameObject.AddComponent(t); 18 } 19 else 20 { 21 Debug.LogFormat("{0} not found", componentName); 22 } 23 } 24}

投稿2020/07/11 12:34

bboydaisuke

総合スコア5275

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

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

metalnickel

2020/07/11 16:27

ありがとうございます。String型からのスクリプト貼り付けに成功し、その後の処理の調整もうまくできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問