0

我是 Unity3D 的新手,我制作了一个生成新 C# 脚本的脚本(暂时在 void Start() 上)。这个 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 有时间编译脚本),则该脚本可以工作。

很感谢任何形式的帮助!

一个

4

2 回答 2

0

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

于 2015-08-29T21:31:02.350 回答
0

您走错了路,但在发布之前您实际上尝试了一些东西是一件好事。尊重这一点。

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

void Start(){

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

}

这将为第一个脚本所在的游戏对象添加新组件,所有变量值都将是默认值。默认值为空字符串、零、假布尔值等...

要声明默认值,只需声明这样的变量

public int varName = 5;

同样适用于不同的类型。

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

referenceToNewComponent.varName = something.

当然,您要更改其值的变量需要公开。

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

于 2015-08-29T21:44:28.087 回答