【问题标题】:assign class objects instead of the actual script class to unity game objects in unity c#在统一 c# 中将类对象而不是实际的脚本类分配给统一游戏对象
【发布时间】:2019-04-14 00:24:14
【问题描述】:

我想在 Unity C# 中创建一个游戏,玩家可以在其中将所需的无人机作为游戏对象添加到游戏世界中。因此,我制作了一个无人机预制件,稍后在运行时我询问玩家想要拥有的无人机数量(例如 n 个数字)并实例化预制件 n 次。 附加到无人机预制件的脚本称为drone_script。 因此,我有一个drone_script 类作为通用类。这个类有一个属性(我们称之为订阅者),每个无人机应该有不同的唯一值。因此,它在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 附加到它们,因此它们的订阅者属性为空。但是,我需要将drone_script[i] 对象作为脚本分配给它们,而不是一般的drone_script 本身。因为只有在调用 start 函数之前,每个无人机游戏对象才有其对应的订阅者属性值。 我的想法正确吗? 如果是,我该怎么做?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

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

    1. 实例化无人机并保存他的引用(作为游戏对象)
    2. 获取该无人机的“drone_script”(使用 GetComponent();)
    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 必须附加到无人机预制件

    【讨论】:

    • 更正:drones[i].GetComponent&lt;drone_script&gt;();,T参数需要是类,而不是类名的字符串。
    • 非常感谢您的回答。我还需要将drone_script 附加到无人机预制件吗?
    • 我已经按照@Draco18s 的指出进行了编辑。是的,drone_script 必须是无人机预制件的一部分。它不工作的问题是什么?调试并写给我们什么是问题,但我相信如果一切都正确完成应该没问题
    • 如果它是 MonoBehaviour,您可以将dronePrefab 的类型更改为drone_script,这样您就不必执行GetComponent。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多