【问题标题】:InvalidCastException: Specified cast is not valid || UnityInvalidCastException: 指定的强制转换无效 ||统一
【发布时间】:2022-01-12 16:27:31
【问题描述】:

我在 Unity 中收到错误消息:
"InvalidCastException: Specified cast is not valid.
Tile.OnMouseDown () (at Assets/Tiles/Tile.cs:38)
UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)"

更准确地说,它抱怨这条线( 38):
> if (OccupiedUnit.Faction == Faction.Hero) UnitManager.Instance.SetSelectedHero((BaseHero)OccupiedUnit);
我最近开始学习Unity所以我不知道如何解决这个问题。
附上以下代码:

    if (OccupiedUnit != null)
    {
        if (OccupiedUnit.Faction == Faction.Hero) UnitManager.Instance.SetSelectedHero((BaseHero)OccupiedUnit);
        else
        {
            if(UnitManager.Instance.SelectedHero != null)
            {
                var enemy = (BaseEnemy)OccupiedUnit;
                Destroy(enemy.gameObject);
                UnitManager.Instance.SetSelectedHero(null);
            }
        }
    }
    else
    {
       if (UnitManager.Instance.SelectedHero != null)
        {
            SetUnit(UnitManager.Instance.SelectedHero);
            UnitManager.Instance.SetSelectedHero(null);
        }
    }

}

提前谢谢你。

【问题讨论】:

  • OccupiedUnit 在代码运行时不得引用 BaseHero 实例。
  • 无论OccupiedUnit 是什么,它都不是BaseHero(但至少它不为空)。
  • OccupiedUnit 是 BaseUnit 类型的变量。反过来,BaseHero 类型继承自BaseUnit,因此需要显式类型转换才能将其作为接受BaseHero 类型的函数中的参数发送。 UnitManager 类存储我们需要使用的 BaseHero 类型的变量,但 Tile 类只能存储 BaseHeroBaseEnemy 的通用类型。如果我正确理解了这个问题,这应该可以澄清情况。

标签: c# unity3d exception


【解决方案1】:

GemuSenYou 当你使用 SetSelectedHero((BaseHero)OccupiedUnit) 并且它失败时,它会抛出 InvalidCastException,但是使用 SetSelectedHero(OccupiedUnit as BaseHero),如果它失败了,结果将为空,你可能在代码中的某个地方检查。这是我最好的任务:)

【讨论】:

  • 我认为问题消失的原因不是我改变了类型转换的公式,而是我重新启动了 Unity。我在上面评论说,我将包含代码和其他文件的包发送给我的朋友,它在他的计算机上运行没有问题。
【解决方案2】:

偶然我找到了解决这个问题的方法。由于某种原因,SetSelectedHero((BaseHero)OccupiedUnit) 形式的显式类型转换不起作用,但是当我将其更改为 SetSelectedHero(OccupiedUnit as BaseHero) 时,它开始正常工作。
不知道为什么它会这样工作,但如果有人有想法如果您能分享您的知识,我将不胜感激。

【讨论】:

  • 我强烈怀疑它没有“正常工作” - 相反,只要OccupiedUnit 的具体类型不是BaseHero 或一个子类。
  • 这可能是一个 Unity 错误,因为我发送给我朋友的相同代码即使使用 SetSelectedHero((BaseHero)OccupiedUnit) 也能完美运行
  • 一般来说,您应该假设错误出在您的代码中,而不是成千上万其他开发人员使用的平台。建议你在调试器中运行代码,当抛出异常时,查看OccupiedUnit实际类型。
  • 我检查了代码如何与调试器一起工作,OccupiedUnit 拥有正确的对象。我想我明白为什么会发生错误。当我重新启动 Unity 时,我需要再次在单元预制件中选择 Faction。当我将敌人的预制派系更改为“英雄”时,Unity 开始再次抛出相同的异常。我认为那是我犯的愚蠢错误。非常抱歉,由于如此愚蠢的错误,我在这里创建了一个讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2018-05-27
  • 2014-07-30
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多