k0dluvHQam45pQ3
@k0dluvHQam45pQ3

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

コンポーネントを変数を使って取得したい

解決したいこと

Unityでゲームを作っているのですが、
string型の変数の名前のコンポーネントを取得したいです
aの中身は分岐によって変わるので、Rigidbodyをそのまま括弧の中に入れることはできません
発生しているエラーの文章は、visualStudioで出ています

発生している問題・エラー

'a’は変数ですが、種類のように使用されています

該当するソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string a = "Rigidbody";
        this.gameObject.AddComponent(typeof(a));

    }

   
}

自分で試したこと

addComponent();も試しましたが、同様のエラーが出ました

0

2Answer

aの中身は分岐によって変わるので、Rigidbodyをそのまま括弧の中に入れることはできません

Type型の変数を介して渡せばいいです。

        System.Type a = typeof(Rigidbody);
        this.gameObject.AddComponent(a);
0Like

Comments

  1. すみません、どうしてもaをstring型で取得しなければならないのですが、やはりいちいちaの中身についてif文で分岐させて指定のコンポーネントを取得するしかないでしょうか?
  2. それでは、他の回答にもあるとおり、`System.Type.GetType` や `System.Reflection.Assembly.GetType` などを使ってください。

    しかしこのようなリフレクション処理は、安全性を損なう、可読性を損なうなどの問題もあります。
    もちろん、それを使わなければ処理できないこともありますが、他で対処できるであればそちらで対処だと思います。

かつてUnityも昔は文字列でComponentを指定できました。

this.gameObject.AddComponent("Rigidbody");

Unity5(2015年)で削除されちゃったんですよねこの形式、昔はいけたんですけど...2023年現在実現するとこうなります

 Type e = Type.GetType("UnityEngine.Rigidbody, UnityEngine.PhysicsModule");
this.gameObject.AddComponent(e);

解説すると名前空間も含めたクラス名にカンマ区切りでassembly名を指定する必要があります
結構めんどくさいしErrorは実行するまでわからないしType.GetType("")は間違えるとNULLを返してくるしで保守性が最悪なので、どう考えて文字列で型を指定するのは悪いプラクティスです。
なので最初の人が言ってるやり方の方が無難だと思いますが
型名をJsonでSerializeしたものを受け取りって動的にアタッチしたいみたいな特殊事情を想定するとこういったやり方になります。
まあ普通はやらないやり方ですね。

0Like

Your answer might help someone💌