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
相关产品推荐
相关产品推荐

