如何在运行时将脚本添加到实例化对象?

How to add Script to instantiated object at runtime?

我的主资产文件夹中有一个名为 BezierWalk.cs

的脚本

在另一个脚本 Spawn 中,我试图从 Prefab Sphere 实例化对象并将 BezierWalk.cs 附加到它们。

Spawn 脚本:

public class Spawn : MonoBehaviour
{

  public GameObject Sphere;
  //string ScriptName = "BezierWalk";

  void Start()
  {  
      Vector3 vSpawnPos = transform.position;

      for (int i = 0; i < 20; i++)
        {
          var objectYouCreate = Instantiate(Sphere, vSpawnPos, transform.rotation);
          //objectYouCreate.AddComponent<T>("Assets/BezierWalk.cs");
          //objectYouCreate.AddComponent(typeof(ScriptName)) as ScriptName;
          //objectYouCreate.AddComponent<ScriptName>();
          //var myScript = Sphere.AddComponent<BezierWalk.cs>();
          vSpawnPos.z += 20;
        }       
   }

您可以看到注释掉的尝试...

我应该如何正确地做到这一点?谢谢。

如果您查看如何在 unity 中引用组件,答案应该很明确 - 您是否尝试过列出的任何组件?

参考:https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html

常用的是方便阅读

objectYouCreate.AddComponent<ClassName>();

你可以使用

objectYouCreate.AddComponent(typeof(ClassName));

.cs 适用于人类,它是您的可读版本。所以您永远不需要在您的代码中引用 .cs。

注意:我提到它是类名而不是脚本名,因为虽然它们在单一行为中是相同的,但在 c# 中的其他任何地方都不一样所以,重要的一点不是你制作的文件的名称,但是其中 class 的名称。

另一种方法是使用预制件,为您的对象制作一个预制件,其中包含您需要的所有组件。

如果您的脚本位于某个命名空间内,您应该遵循以下格式

GameObject.AddComponent(typeof(namespace.className));