C# 如何在运行时导入C单行为脚本并将其添加到组件?

C# 如何在运行时导入C单行为脚本并将其添加到组件?,c#,unity3d,streamwriter,gameobject,runtime-compilation,C#,Unity3d,Streamwriter,Gameobject,Runtime Compilation,我是Unity3D的新手,现在我已经制作了一个脚本,可以在void Start上生成一个新的C脚本。此C脚本必须在制作完成后添加到游戏对象中。我试图找到一种在运行时导入此脚本的方法,但我完全不知所措 以下脚本附加到同一游戏对象,生成的脚本也必须作为组件添加到同一游戏对象 这将生成脚本: public class mutator : MonoBehaviour { // Use this for initialization void Start () { string dire

我是Unity3D的新手,现在我已经制作了一个脚本,可以在void Start上生成一个新的C脚本。此C脚本必须在制作完成后添加到游戏对象中。我试图找到一种在运行时导入此脚本的方法,但我完全不知所措

以下脚本附加到同一游戏对象,生成的脚本也必须作为组件添加到同一游戏对象

这将生成脚本:

    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 () {

}
}
如果最后一个脚本在程序第一次运行时被关闭,而在程序第二次运行时被打开,那么脚本就可以运行了,当然,这是因为Unity有时间编译脚本

非常感谢您的帮助


A

尝试将DNA_translator类中的方法从Start更改为其他方法,并在生成文件后调用它。

您走错了路,但在发布之前确实尝试了一些方法是件好事。尊重这一点

这实际上比您想象的要简单得多,编写两个独立的脚本组件,在第一个scipt中执行以下操作:

void Start(){

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

}
不同的类型也一样

如果您想添加组件并从要添加新组件的脚本中动态设置新值,请在我在void Start中编写的第一个代码中添加组件后执行此操作

referenceToNewComponent.varName = something.
当然,要更改其值的变量需要是公共的


这些都是我在手机上写的,所以这里可能有打字错误。

这很聪明。不过,每次我第一次运行脚本时,我猜脚本尚未导入Unity Asset库,或者它可能被称为什么,我都会收到一个错误:找不到组件类型“Organic”。我想在运行脚本之前,我必须使用某种资产导入器。你知道更多吗?有必要在运行时编译吗?可以用预先编写的类替换它吗?似乎生成的脚本中唯一的变量是类名,它对类的函数没有影响。尝试使用通用名称预编译类并将其附加到游戏对象。此外,如果我调用我现在更改为从mutator脚本转换而来的方法,它实际上不再将脚本作为组件添加。是的,在运行时编译是绝对必要的,因为过一段时间后将创建大量的游戏对象,而有一个变种人和一个翻译。翻译器将脚本添加到组件中,而变异器会对每个新制作的游戏对象的脚本进行一个小的更改。因此,在我运行程序之前,我还不知道脚本会是什么样子。谢谢你的回答Neven Ignjic,也忘了说,你可以避免在运行时编译,总是有一个简单的方法来完成它,你只需要找到它。如果没有,标记gameObject并根据标记添加不同的脚本。我知道我也可以创建这样的类。我明白你为什么会提出你的答案,因为我还没有把我的问题说清楚。我有一个变异脚本和一个翻译脚本。现在的mutator脚本只是在一个新文件中写入预定义的行。稍后,mutator脚本将——如果文件还不存在的话——编写一段代码,我为csharp中存在的许多操作符定义了这段代码。如果文件存在,它将在一定的时间间隔内对我定义的代码进行随机更改。翻译程序稍后将尝试删除所有导致错误的行,并将剩余的内容添加到游戏对象中。现在,我只想看看是否有可能将运行时生成的脚本添加到需要它的游戏对象中。这是另一件事,从来没有这样做过,因为我总是设法找到一些简单的解决方法,在你的情况下,这太难了,因为有太多的更改。
referenceToNewComponent.varName = something.