【问题标题】:Rotating an Instantiated object旋转实例化对象
【发布时间】:2015-10-19 23:51:22
【问题描述】:

我遇到了一些实例化对象的问题。我需要引擎做的是生成三个预制件,然后在特定时间将它们翻转过来。但是,我一直无法让它工作。生成代码有效,但是当我尝试添加更多来操作预制件时,它只会给我带来很多错误。 spawn 脚本位于 void Start() 中,而另一个脚本位于 void Update() 中

生成脚本:

    cardAOne = Instantiate(CardDisplayer.cardList[Shuffle.playerAdeck[0]], new Vector3 (xPosition, yPosition, (zPosition + 3)), Quaternion.Euler(xRotation, yRotation, zRotation)) as GameObject;
        cardATwo = Instantiate(CardDisplayer.cardList[Shuffle.playerAdeck[1]], new Vector3 (xPosition, yPosition, (zPosition)), Quaternion.Euler(xRotation, yRotation, zRotation))as GameObject;
    cardAThree = Instantiate(CardDisplayer.cardList[Shuffle.playerAdeck[2]], new Vector3 (xPosition, yPosition, (zPosition - 3)), Quaternion.Euler(xRotation, yRotation, zRotation))as GameObject;

    cardBOne = Instantiate(CardDisplayer.cardList[Shuffle.playerBdeck[0]], new Vector3 ((0 - xPosition), yPosition, (zPosition + 3)), Quaternion.Euler(xRotation, (0 - yRotation), zRotation))as GameObject;
    cardBTwo = Instantiate(CardDisplayer.cardList[Shuffle.playerBdeck[1]], new Vector3 ((0 - xPosition), yPosition, (zPosition)), Quaternion.Euler(xRotation, (0 - yRotation), zRotation))as GameObject;
    cardBThree = Instantiate(CardDisplayer.cardList[Shuffle.playerBdeck[2]], new Vector3 ((0 - xPosition), yPosition, (zPosition - 3)), Quaternion.Euler(xRotation, (0 - yRotation), zRotation))as GameObject;

运动脚本:

if (turnA == true) {
        cardAOne.transform.localRotation = Quaternion.Euler(0,0,180);
        cardATwo.transform.localRotation = Quaternion.Euler(0,0,180);
        cardAThree.transform.localRotation = Quaternion.Euler(0,0,180);
    }

【问题讨论】:

  • 错误信息在哪里?
  • “对象引用未设置为对象的实例”(移动脚本的第一行)
  • 那么有两个单独的脚本,您是否在移动脚本中为您的对象分配了值?否则,您将尝试访问 null 的内容。
  • 那么我该如何引用这些实例呢?我认为这是这样做的方法(或者至少这是似乎没有错误的唯一方法)并且它的工作原理是它正确显示了实例
  • 您能否展示更多源代码,因为它非常令人困惑。您在第一次回答时说脚本位于层次结构中,但我们如何才能弄清楚呢?此外,这并不是因为父母知道孩子会实例化它..

标签: c# unity3d instantiation


【解决方案1】:

错误最有可能在这里:

if (turnA == true) {
...

我认为您只是在访问之前没有初始化turnA。也许您有一些分支代码,其中并非每个分支都为该变量分配一个值。

关于编码风格:

if (turnA) 等同于if (turnA == true),但更清晰、更传统。

【讨论】:

  • 不,它已正确初始化为 true。加上错误专门从第一条旋转线开始。
  • card 是 MonoBehavior 对象吗?你能给我们一个堆栈跟踪吗
  • 我不知道如何进行堆栈跟踪,但是是的,它是在 MonoBehavior 中声明的,而不是在 Start() 或 Void() 中。我最初有一个设置,但它导致了太多错误。
  • 发生此类错误时,堆栈跟踪会自动发生。堆栈跟踪是控制台中错误消息的一部分,它告诉错误发生在哪些行和方法中。要提供堆栈跟踪,您只需复制整个错误消息即可。
  • 没有更多错误,因为我更新了统一。显然这是唯一的问题。
【解决方案2】:

对此的回答有点晚了,但是哦。不知道实际问题是什么,但更新统一有效。有时,拥有最新的软件版本会有所帮助!

【讨论】:

    【解决方案3】:

    通过阅读 cmets,您只需要正确参考这些值。有几种方法可以做到这一点,静态可能是最快和最简单的。

    将生成脚本中的卡片设置为public static GameObject cardAOne;

    然后使用 SpawnScript.cardAOne.transform.position 从移动脚本中调用它们。

    您还可以在移动文件的顶部有一个公共 SpawnScript,然后您可以从 Unity 中将其实例拖放到检查器中。

    【讨论】:

    • 它们在同一个父脚本中。那应该没关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多