在Unity C#中将类对象而不是实际的脚本类分配给Unity游戏对象

时间:2018-11-10 19:18:48

标签: c# unity3d

我想在Unity C#中创建一个游戏,其中玩家将向游戏世界添加尽可能多的无人机作为游戏对象。因此,我做了一个无人机预制件,然后在运行时稍后询问玩家想要的无人机数量(例如n个)并实例化n次预制件。 附加到无人机预制件的脚本称为drone_script。 因此,我将drone_script类作为通用类。此类具有一个属性(我们称其为Subscriber),每个无人机应具有不同的唯一值。因此,它在drone_script通用类中被创建为空引用,稍后在运行时,我将对其进行初始化。 在运行时,我从此类创建n个(与无人机游戏对象相同的数字)对象,并为其订户属性分配不同的值。

外观如下:

     some_class
     {
         for (int i = 0; i < number_of_Drones; ++i)
                {
                    drones_script[i] = new drone_script(); 
                    \\ here I am creating n objects of my general drone_script class
                    drones_script[i].drone_subscriber = a unique value;
                    \\ here I am assigning to each of the drone objects' drone_subscriber attribute a different value.
                    drco = new Vector3((float)0, (float)1, (float)0);
                    drones[i] = Instantiate(Resources.Load("drone"), drco, 
                    Quaternion.Euler(-90, 0, 90)) as GameObject;
    \\I instatiate the drone prefab in unity game world here.
                }
  }


drone_script
{
 public ROSBridgeSubscriber drone_subscriber;
 void Start() { \\some code }
 void FixedUpdate () { \\some code }
}

我的问题是,当统一创建无人机游戏对象时,将通用类drone_script附加到它们,因此,它们的订户属性为null。但是,我需要将drone_script [i]对象分配给他们作为他们的脚本,而不是一般的drone_script本身。因为只有这样,每个无人机游戏对象才具有甚至在调用启动功能之前的相应订户属性值。 我在想正确吗? 如果是,该怎么办?

1 个答案:

答案 0 :(得分:0)

首先,我建议您使用编辑器或在“ some_class”的Start方法中分配dronePrefab,因为Resources.Load(“ drone”)可能会消耗资源,因为您将无人机资源加载了“ n”次。

现在,您遇到了特定的问题,您无需创建新的“ drone_script”实例,因为正如您提到的那样,您创建的每架无人机都具有自己的“ drone_script”。所以基本上我们需要做的是:

  1. 实例化无人机并将其参考保存为GameObject
  2. 使用GetComponent <>();获得该无人机的“ drone_script”
  3. 将该脚本参考保存在我们的数组中,以便以后使用
  4. 现在或以后在游戏中调整该脚本的一些变量

类似的事情应该起作用。在代码中,所有内容都应该是这样的(未经测试,可能是一些未命中的类型)

some_class
 {
     public GameObject dronePrefab;
     for (int i = 0; i < number_of_Drones; ++i)
     {
        // Step 1.
        drco = new Vector3((float)0, (float)1, (float)0);
        drones[i] = Instantiate(dronePrefab, drco, 
        Quaternion.Euler(-90, 0, 90)) as GameObject;
        // Steps 2 & 3
        drones_script[i] = drones[i].GetComponent<drone_script>();
        // Step 4
        drones_script[i].drone_subscriber = a unique value;            
    }
}

编辑: 只是指出一点:drone_script必须附加到无人机预制件上