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

Unity不同脚本同名内部类列表复制报错,求正确实现方法

问题分析

ScriptA和ScriptB中各自定义的LootItemsList是两个完全独立的类——即使字段结构完全一致,C#也会将它们视为不同类型,因此直接赋值列表或强制类型转换都会触发错误。

解决方案

方案1:重构为共享类(推荐)

将LootItemsList提取为独立的可序列化类,让ScriptA和ScriptB共用同一类型,从根源解决类型不匹配问题。

  1. 创建独立脚本LootItemsList.cs:
using UnityEngine;
using System.Serializable;

[System.Serializable]
public class LootItemsList
{
    public GameObject _lootItem;
    public Vector3 _lootItemOrigin;
    public float _lootColliderActivationTime = 0.5f;
}
  1. 修改ScriptA:
public class ScriptA: MonoBehaviour{
    public List<LootItemsList> _lootItemsListToUse;
}
  1. 修改ScriptB:
public class ScriptB: MonoBehaviour{
    public List<LootItemsList> _lootItemsListToUse;

    void Start(){
        ScriptA scriptA = ObjA.GetComponent<ScriptA>();
        // 直接赋值引用(修改其中一个列表会影响另一个)
        _lootItemsListToUse = scriptA._lootItemsListToUse;
        // 如需独立列表(修改互不影响),使用ToList()深拷贝:
        // _lootItemsListToUse = scriptA._lootItemsListToUse.ToList();
    }
}

方案2:逐个元素属性复制(不重构场景)

如果无法重构类结构,需手动遍历ScriptA的列表,逐个创建ScriptB的LootItemsList实例并复制属性值:

修改ScriptB的Start方法:

void Start(){
    ScriptA scriptA = ObjA.GetComponent<ScriptA>();
    _lootItemsListToUse = new List<ScriptB.LootItemsList>();
    
    foreach(var sourceItem in scriptA._lootItemsListToUse)
    {
        var targetItem = new ScriptB.LootItemsList();
        targetItem._lootItem = sourceItem._lootItem;
        targetItem._lootItemOrigin = sourceItem._lootItemOrigin;
        targetItem._lootColliderActivationTime = sourceItem._lootColliderActivationTime;
        
        _lootItemsListToUse.Add(targetItem);
    }
}
方案对比
  • 方案1:代码简洁易维护,后续修改LootItemsList字段无需同步多份代码,是长期最优解。
  • 方案2:适合临时快速修复,但如果LootItemsList字段变更,需同步修改复制逻辑,维护成本较高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:33:11