Unity开发遇CS0176错误:合并GameObject数组失败求助
错误CS0176排查与解决
错误原因分析
报错行EnemyAtcks = EnemyDirections[0].Concat(EnemyDirections[1], EnemyDirections[2], EnemyDirections[3]).ToArray();存在两个核心问题:
- 误用Concat方法:你调用的是字符串实例的
Concat,但string.Concat是静态方法,不能通过实例调用;且你实际需要合并的是EnemyAtcks0~EnemyAtcks3这些GameObject[]数组,而非字符串列表。 - 未初始化列表:
List<string> EnemyDirections仅声明未实例化,直接调用Add会触发空引用异常。
修复步骤
1. 初始化EnemyDirections列表
在声明时或Start方法中完成初始化:
// 方式1:声明时初始化 List<string> EnemyDirections = new List<string>(); // 方式2:在Start中初始化 void Start() { EnemyDirections = new List<string>(); EnemySetDirections(); // ...其他原有代码 }
2. 正确合并GameObject数组
替换错误的合并代码,使用LINQ的Concat扩展方法合并四个GameObject数组:
// 先获取各标签对应的攻击对象数组 EnemyAtcks0 = GameObject.FindGameObjectsWithTag(EnemyDirections[0]); EnemyAtcks1 = GameObject.FindGameObjectsWithTag(EnemyDirections[1]); EnemyAtcks2 = GameObject.FindGameObjectsWithTag(EnemyDirections[2]); EnemyAtcks3 = GameObject.FindGameObjectsWithTag(EnemyDirections[3]); // 正确合并数组 EnemyAtcks = EnemyAtcks0.Concat(EnemyAtcks1) .Concat(EnemyAtcks2) .Concat(EnemyAtcks3) .ToArray();
3. 额外潜在问题修复
在EnemyFinishedTurn方法中,增加空值判断避免EnemyAtcks为null时的遍历错误:
void EnemyFinishedTurn() { if (EnemyAtcks != null) { foreach (GameObject obj in EnemyAtcks) { Destroy(obj); } } enemyActed = false; state = BattleState.FinishedTurn; }
完整修正后的核心代码片段
public class TurnHandler : MonoBehaviour { // 初始化EnemyDirections列表 List<string> EnemyDirections = new List<string>(); // ...其他成员变量 void Start() { EnemySetDirections(); Player = GameObject.FindGameObjectWithTag("Player"); state = BattleState.Start; enemyActed = false; } void Update() { // ...其他逻辑 else if (state == BattleState.EnemyTurn) { // ...其他逻辑 if (!enemyActed) { if (Player != null) { Player.gameObject.SetActive(true); PlayerMove.SetHeart(); EnemyAtcks0 = GameObject.FindGameObjectsWithTag(EnemyDirections[0]); EnemyAtcks1 = GameObject.FindGameObjectsWithTag(EnemyDirections[1]); EnemyAtcks2 = GameObject.FindGameObjectsWithTag(EnemyDirections[2]); EnemyAtcks3 = GameObject.FindGameObjectsWithTag(EnemyDirections[3]); // 正确合并数组 EnemyAtcks = EnemyAtcks0.Concat(EnemyAtcks1) .Concat(EnemyAtcks2) .Concat(EnemyAtcks3) .ToArray(); enemyActed = true; } } // ...其他逻辑 } // ...其他逻辑 } void EnemySetDirections() { EnemyDirections.Add("Directions/Up"); EnemyDirections.Add("Directions/Down"); EnemyDirections.Add("Directions/Left"); EnemyDirections.Add("Directions/Right"); } void EnemyFinishedTurn() { if (EnemyAtcks != null) { foreach (GameObject obj in EnemyAtcks) { Destroy(obj); } } enemyActed = false; state = BattleState.FinishedTurn; } }
内容的提问来源于stack exchange,提问作者GabrieleC0
相关产品推荐
相关产品推荐

