【问题标题】:Error "InvalidCastException: Cannot cast from source type to destination type." While using Instantiate in Unity错误“InvalidCastException:无法从源类型转换为目标类型。”在 Unity 中使用实例化时
【发布时间】:2016-01-17 22:01:01
【问题描述】:

好的,所以我正在统一制作一个 2D 游戏,当我运行代码时,我得到了这个错误:

InvalidCastException: Cannot cast from source type to destination type.
ToastSpawn.spawnToast () (at Assets/Scripts/ToastSpawn.js:11)

ToastSpawn.js 文件中的代码如下:

#pragma strict

var Toast : Rigidbody;
var ToastSpawner : GameObject;

function Start() {
    InvokeRepeating("spawnToast", 3, 1);
}

function spawnToast() {
    var toastClone = Instantiate(Toast, GameObject.Find("ToastSpawner").transform.position, Quaternion.identity);
    toastClone.AddForce(Vector2 (0,1) * 1000);
}

我昨天才开始使用 unity,所以这可能就是我收到此错误的原因。 :)

【问题讨论】:

  • 仅供参考,您需要忘记“javscript”,只使用 c#。 Unity 即将删除 javascript; c#实际上也容易得多。忘记javascript,只使用c#
  • 这个网站不适合解决关于“如何使用变量”等极其简单的问题。

标签: javascript unity3d


【解决方案1】:

好吧,如果你从 C# 开始会更好:P 虽然我不是 JavaScript 人,但仍然可以看到一些故障。

  • 您实际上是在实例化刚体而不是游戏对象。获取 GameObject 而不是仅 Rigidbody,然后从该对象获取 Rigidbody 的组件以施加力。
  • 您将 ToastSpawner 作为 GameObject 那么为什么要使用 GameObject.Find?就是同一个游戏对象。

类似的,

var Toast : GameObject;
var ToastSpawner : GameObject;
...
... 
var toastClone = Instantiate(Toast, ToastSpawner.transform.position, Quaternion.identity);
var rb : Rigidbody = toastClone.GetComponent("Rigidbody");
rb.AddForce(...);

【讨论】:

  • 我已将此应用到我的代码中,现在我收到此错误:Assets/Scripts/ToastSpawn.js(13,8): BCE0019: 'AddForce' is not a member of 'UnityEngine.Component'. 代码在这里:#pragma strict var Toast : GameObject; var ToastSpawner : GameObject; function Start() { InvokeRepeating("spawnToast", 3, 1); } function spawnToast() { var toastClone = Instantiate(Toast, Vector3 (0,-2,0), Quaternion.identity); var rb = toastClone.GetComponent("Rigidbody"); rb.AddForce(Vector3.up * 1000); }
  • 这就是我讨厌 JavaScript 的原因。将var rb = toastClone.GetComponent("Rigidbody"); 替换为var rb : Rigidbody= toastClone.GetComponent("Rigidbody");。检查编辑的答案
  • 昨晚我决定我要错误地移动吐司,所以我编写了一个新脚本来处理 AddForce() 函数。 :P 在我调整了你的答案之后,它现在很好用。谢谢! :)
【解决方案2】:

您正在尝试在刚体类型对象(Toast : Rigidbody)上使用Object.Instantiate,它是一个组件,而不是游戏对象。只能使用GameObject.AddComponent 将组件添加到现有游戏对象。您需要为 Toast 项目创建一个预制件(该预制件上有一个刚体组件)并在 Instantiate 方法中使用该预制件。

此外,您不应该在属性名称上使用大写字母。

【讨论】:

  • 我有一个 Toast 预制件。如何将它与实例化一起使用?
  • 这里的 Unity 文档中有一个 Unity 脚本示例:docs.unity3d.com/ScriptReference/Object.Instantiate.html 将变量设置为 public 以通过检查器链接预制件,然后在 Instantiate 函数中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
相关资源
最近更新 更多