You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity报InvalidCastException指定转换无效错误(Tile.cs第38行)如何解决?

报错原因

这个InvalidCastException是强制类型转换失败触发的:你代码里默认Faction == Faction.Hero的OccupiedUnit一定是BaseHero类的实例,但运行时这个OccupiedUnit的实际类型并不是BaseHero(也不是BaseHero的子类),强行转换就会抛出异常。常见的原因包括类继承关系错误、赋值OccupiedUnit时Faction属性和实例类型不匹配、单位挂载的脚本类型和预期不符。

修复步骤
  • 首先把所有强制类型转换替换为安全的模式匹配转换,避免直接抛异常,同时补上合法性判断,修改后的完整代码如下:
if (OccupiedUnit != null)
{
    // 先判断阵营,再确认实际类型是BaseHero,用模式匹配直接拿到转换后的实例
    if (OccupiedUnit.Faction == Faction.Hero && OccupiedUnit is BaseHero selectedHero)
    {
        UnitManager.Instance.SetSelectedHero(selectedHero);
    }
    else
    {
        if(UnitManager.Instance.SelectedHero != null && OccupiedUnit is BaseEnemy enemy)
        {
            Destroy(enemy.gameObject);
            UnitManager.Instance.SetSelectedHero(null);
        }
    }
}
else
{
    if (UnitManager.Instance.SelectedHero != null)
    {
        SetUnit(UnitManager.Instance.SelectedHero);
        UnitManager.Instance.SetSelectedHero(null);
    }
}
  • 检查类继承关系:确认BaseHero和BaseEnemy都继承自OccupiedUnit的所属基类(比如你自定义的BaseUnit类),没有写错继承链。
  • 检查OccupiedUnit赋值逻辑:确认给OccupiedUnit赋值的时候,Faction属性设置和实例类型是对应的,不要出现给BaseEnemy类型的单位手动设置Faction = Faction.Hero的逻辑漏洞。
  • 可选加调试日志快速定位问题:在if (OccupiedUnit != null)后加一行日志,运行时报错时就能直接看到不匹配的类型:
Debug.Log($"单位实际类型:{OccupiedUnit.GetType().Name},所属阵营:{OccupiedUnit.Faction}");

内容的提问来源于stack exchange,提问作者GemuSenYou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:06:06