如何将类列表从一个脚本复制到另一个包含相同类的脚本

She*_*lie 0 c# unity-game-engine

脚本A

public class ScriptA: MonoBehaviour{

public List<LootItemsList> _lootItemsListToUse;

[System.Serializable]
public class LootItemsList
{
    public GameObject _lootItem;
    public Vector3 _lootItemOrigin;
    public float _lootColliderActivationTime = 0.5f;
}}
Run Code Online (Sandbox Code Playgroud)

脚本B

 public class ScriptB: MonoBehaviour{

public List<LootItemsList> _lootItemsListToUse;

[System.Serializable]
public class LootItemsList
{
    public GameObject _lootItem;
    public Vector3 _lootItemOrigin;
    public float _lootColliderActivationTime = 0.5f;
}

void Start(){
ScriptA scriptA = ObjA.GetComponent<ScriptA>();
    _lootItemsListToUse = scriptA._lootItemsListToUse;
}}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:错误 CS0029 无法将类型“System.Collections.Generic.List<ScriptB.LootItemsList>”隐式转换为“System.Collections.Generic.List<ScriptA.LootItemsList>”

我也尝试过这个

_lootItemsListToUse  = new List<ScriptA.LootItemsList>((IEnumerable<ScriptA.LootItemsList>)script._lootItemsList);
Run Code Online (Sandbox Code Playgroud)

MS studio 中没有错误,但我在播放时遇到此错误:InvalidCastException:指定的演员无效。(包装类型转换)System.Object.__castclass_with_cache(object,intptr,intptr)

请有人帮我找到复制此列表的正确方法吗?谢谢

der*_*ugo 5

您的两种类型 - 只是因为它们碰巧具有相同的名称和字段名称 - 没有任何关系。他们是完全不同的类型。


最明显的答案是:不要实施两次。而是相应地参考它

ScriptA.cs

public class ScriptA: MonoBehaviour
{
    public List<LootItemsList> _lootItemsListToUse;

    [System.Serializable]
    public class LootItemsList
    {
        public GameObject _lootItem;
        public Vector3 _lootItemOrigin;
        public float _lootColliderActivationTime = 0.5f;
    }
}
Run Code Online (Sandbox Code Playgroud)

ScriptB.cs

public class ScriptB: MonoBehaviour
{
    public List<ScriptA.LootItemsList> _lootItemsListToUse;
    
    void Start()
    {
        ScriptA scriptA = ObjA.GetComponent<ScriptA>();
        _lootItemsListToUse = scriptA._lootItemsListToUse;
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至:根本不要将该类嵌套在另一个类下,但在外部作用域中有第三个脚本

LootItemList.cs

[System.Serializable]
public class LootItemsList
{
    public GameObject _lootItem;
    public Vector3 _lootItemOrigin;
    public float _lootColliderActivationTime = 0.5f;
}
Run Code Online (Sandbox Code Playgroud)

ScriptA.cs

public class ScriptA: MonoBehaviour
{
    public List<LootItemsList> _lootItemsListToUse;
}
Run Code Online (Sandbox Code Playgroud)

ScriptB.cs

public class ScriptB: MonoBehaviour
{
    public List<LootItemsList> _lootItemsListToUse;
    
    void Start()
    {
        ScriptA scriptA = ObjA.GetComponent<ScriptA>();
        _lootItemsListToUse = scriptA._lootItemsListToUse;
    }
}
Run Code Online (Sandbox Code Playgroud)