Unity宝可梦开发:等级解锁招式遇类型转换错误求助
问题分析与解决方案
你遇到的类型转换错误,核心原因是Pokemon类中定义的Moves列表类型与你尝试添加的对象类型不匹配:
- Pokemon类里的
Moves被声明为List<NewMove>,但构造函数中你尝试添加的是Moves类的实例(new Moves(move.Base)),两种类型无法直接兼容,导致类型转换失败。
步骤1:修正Pokemon类的Moves列表类型
将Pokemon类中的Moves列表类型改为List<Moves>,因为我们需要存储的是包含当前PP值的招式实例(Moves类),而NewMove仅用于记录宝可梦解锁招式的等级和对应基础数据:
public class Pokemon { Pokemon_Data _Data; int level; public int HP {get; set;} // 修正列表类型为List<Moves> [field: SerializeField] public List<Moves> Moves {get; private set;} public Pokemon(Pokemon_Data pData, int pLevel) { _Data = pData; level = pLevel; HP = _Data.MaxHP; // 初始化对应类型的列表 Moves = new List<Moves>(); foreach (var move in _Data.NewMoves) { if (move.Level <= level) // 类型匹配,可正常添加 Moves.Add(new Moves(move.Base)); if (Moves.Count >= 4) break; } } // 其余属性计算代码保持不变... }
步骤2:优化Pokemon_Data的封装(可选但推荐)
之前将newMoves设为public的做法不符合封装原则,可改回private,通过已有的只读属性对外提供访问:
[CreateAssetMenu(fileName = "Pokemon", menuName = "Pokemon/Create new pokemon") ] public class Pokemon_Data : ScriptableObject { // ...其余字段保持不变 // 改为private,仅通过属性访问 [SerializeField] private List<NewMove> newMoves; public List<NewMove> NewMoves { get {return newMoves;} } // ...其余属性保持不变 }
补充:实现招式替换逻辑
当前代码在招式数量达到4个时停止添加,若要实现"解锁新招式时替换旧招式"的功能,可添加选择逻辑:
foreach (var move in _Data.NewMoves) { if (move.Level <= level) { var newMoveInstance = new Moves(move.Base); if (Moves.Count < 4) { Moves.Add(newMoveInstance); } else { // 这里调用UI逻辑,让玩家选择替换的旧招式 // 示例:Moves[selectedIndex] = newMoveInstance; } } }
内容的提问来源于stack exchange,提问作者Samiul Huq
相关产品推荐
相关产品推荐

