Unity C# 从预制件实例化并投射到 GameObject

Unity C# Instantiating from prefab and casting to GameObject

在带有 C# 的 Unity 中,我试图从预制件实例化并将脚本分配给新对象。为此,我认为我需要将新对象转换为游戏对象。然而, return 类型的 Instantiate 是 UnityEngine.Object

来自 Unity manual:

public GameObject wreck;
...
void KillSelf () (
...
GameObject wreckClone = (GameObject) Instantiate(wreck, transform.position, transform.rotation);

但是,这会导致 InvalidCastException。我在这个论坛上看到有人提到要试试这个:

UnityEngine.Object uo = Instantiate(...
GameObject go = (GameObject)go;

然而,这会导致相同的异常。

我看到一些帖子建议尝试使用:

...Instantiate(...) as GameObject;

但是,编译器似乎不支持此语法。

这很令人困惑。我正在从(可能是正确的)手册和堆栈溢出答案中复制少量代码,但它们似乎无法正常工作。

我不确定需要什么信息来帮助解决这个难题,所以请问我你需要什么。

到目前为止,我已经尝试在尝试转换之前记录实例化的对象。它显示为 ThrownFood(clone)(UnityEngine.transform)。我不知道为什么它会说转换。我没有任何信息告诉它要转换为转换。

您使用的是哪个版本的 Unity?这两个例子都为我编译:

    public GameObject wreck;

    GameObject testObj = new GameObject();
    GameObject go = Instantiate(testObj, transform.position, transform.rotation) as GameObject;
    GameObject go2 = (GameObject)Instantiate(testObj, transform.position, transform.rotation);

实例化return你扔进去的东西。

如果你输入一个转换句柄,它会 return 一个转换句柄。如果你扔一个游戏对象,它会 return 一个游戏对象。不过,您似乎确实将它传递给了一个游戏对象。您可以尝试将其转换为第一个参数中的游戏对象,如下所示:

GameObject wreckClone = (GameObject) Instantiate((GameObject)wreck, transform.position, transform.rotation);

解决您问题的最简单方法是使用 transform.gameObject 命令从变换中获取游戏对象,如下所示:

GameObject go = wreckClone.gameObject;

如果上面的代码仍然出错,您可能需要重新启动或重新安装 Unity,因为它是工作代码。