Unity不同脚本同名内部类列表复制报错,求正确实现方法
问题分析
ScriptA和ScriptB中各自定义的LootItemsList是两个完全独立的类——即使字段结构完全一致,C#也会将它们视为不同类型,因此直接赋值列表或强制类型转换都会触发错误。
解决方案
方案1:重构为共享类(推荐)
将LootItemsList提取为独立的可序列化类,让ScriptA和ScriptB共用同一类型,从根源解决类型不匹配问题。
- 创建独立脚本
LootItemsList.cs:
using UnityEngine; using System.Serializable; [System.Serializable] public class LootItemsList { public GameObject _lootItem; public Vector3 _lootItemOrigin; public float _lootColliderActivationTime = 0.5f; }
- 修改ScriptA:
public class ScriptA: MonoBehaviour{ public List<LootItemsList> _lootItemsListToUse; }
- 修改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
相关产品推荐
相关产品推荐

