0

私は Unity3D の初心者で、新しい C# スクリプトを生成するスクリプトを作成しました (今のところ void Start() で)。この C# スクリプトは、作成後にゲーム オブジェクトに追加する必要があります。実行時にこのスクリプトをインポートする方法を見つけようとしましたが、完全に失われました。

次のスクリプトは同じ gameObject にアタッチされており、生成されたスクリプトもコンポーネントとして同じ gameObject に追加する必要があります。

これにより、スクリプトが生成されます。

    public class mutator : MonoBehaviour {

// Use this for initialization
void Start () {
    string directoryName = @"C://blabla/bla";
    string directoryPathString = Path.Combine(directoryName, gameObject.name);
    string fileName = gameObject.name + ".cs";
    string filePathString = Path.Combine(directoryPathString, fileName);

    if(!Directory.Exists(directoryPathString))
        Directory.CreateDirectory(directoryPathString);
    if(!File.Exists(filePathString)) {
        using(FileStream fs = File.Create(filePathString)) {
            using (StreamWriter s = new StreamWriter(fs)) {
                s.WriteLine("using UnityEngine;");
                s.WriteLine("using System.Collections;");
                s.WriteLine("public class " + gameObject.name + " : MonoBehaviour {");
                s.WriteLine("   public int organelles = 0;");
                s.WriteLine("   void Start () {");
                s.WriteLine("       foreach(Transform T in transform){");
                s.WriteLine("           organelles = organelles + 1;");
                s.WriteLine("       }");
                s.WriteLine("   }");
                s.WriteLine("}");

            }
        }
    }
}
}

これは、スクリプトを見つけてゲームオブジェクトに追加しようとします:

    public class DNA_translator : MonoBehaviour {

public string fileName;
public string url;
// Use this for initialization
void Start () {
    string directoryName = @"C://blabla/bla";
    string directoryPathString = directoryName + "/" + gameObject.name;
    fileName = gameObject.name + ".cs";
    string filePathString = directoryPathString + "/" + fileName;


    if(File.Exists(filePathString)) {
        print("file exists");
        url = "file:///" + filePathString;
        print(url);
        UnityEngineInternal.APIUpdaterRuntimeServices.AddComponent(gameObject, "Assets/Scripts/DNA/DNA_translator.cs (21,4)", gameObject.name);


    }
}

// Update is called once per frame
void Update () {

}
}

プログラムの最初の実行時に最後のスクリプトがオフになり、プログラムの 2 回目の実行時にオンになった場合、スクリプトは機能します (もちろん、Unity にはスクリプトをコンパイルする時間があったため)。

どんな助けでも大歓迎です!

4

2 に答える 2

0

あなたは間違った道を進んでいますが、投稿する前に実際に何かを試したことは良いことです. それを尊重します。

これは実際にはあなたが思っているよりもはるかに簡単です.2つの別々のスクリプト (コンポーネント) を書きます.

void Start(){

     NameOfSecondClass referenceToNewComponent= gameObject.AddComponent<NameOfSecondClass>();

}

これにより、最初のスクリプトがオンになっている gameObject に新しいコンポーネントが追加されます。すべての変数値はデフォルトになります。デフォルトは空の文字列、ゼロ、偽のブール値などです...

デフォルトを宣言するには、次のように変数を宣言するだけです

public int varName = 5;

同じことが異なるタイプにも当てはまります。

コンポーネントを追加し、新しいコンポーネントを追加するスクリプトから新しい値を動的に設定する場合は、ここで void Start() に記述した最初のコードにコンポーネントを追加した後にこれを行います。

referenceToNewComponent.varName = something.

もちろん、値を変更する変数は公開する必要があります。

携帯で書いたので誤字脱字があるかもしれません。

于 2015-08-29T21:44:28.087 に答える