C# Unity - 引用具有 Sprite 字段的可编写脚本对象的自定义类

问题描述 投票:0回答:0

我正在尝试制作一个商店系统,有一个

public List<CargoStock> StockList;

这是 CargoStock.cs:

[System.Serializable]
public class CargoStock
{
    //public CargoSO CargoSO; // Un-commenting this gives the error.
    public short Amount;
    public bool Import;
    public bool Export;

    public CargoStock() { }

    public CargoStock(CargoSO cargoSO, short amount)
    {
        //this.CargoSO = cargoSO;
        this.Amount = amount;
    }
}

真正的错误源自 CargoSO.cs 内部:

[CreateAssetMenu(fileName = "CargoSO", menuName = "Scriptables/CargoSO", order = 3)]
[System.Serializable]

public class CargoSO : ScriptableObject
{
    public CargoTypes CargoType;
    public int ID;
    public string Description;
    public int Price;
    public int Weight;
    public Sprite Icon; // Results in following console errors:
    (0,0): error  - Sprite is not a supported type. Use a supported type or provide a custom serializer
    (0,0): error  - Could not create serializer for UnityEngine.Sprite.
    (0,0): error  - Sprite is not a supported type. Use a supported type or provide a custom serializer
    (0,0): error  - Could not create deserializer for UnityEngine.Sprite.
    

}

我意识到它是因为我有一个自定义类,它引用了一个带有 Sprite 类型的 ScriptableObject .. 如果我将 CargoStock.cs 变成 SO 或 MonoBehaviour,这个错误就会消失,但是我需要这个

CargoStock
成为一个自定义类,这样我就可以在编辑器中创建任意多个,只需添加新的
CargoStock
Inspector
中的List<CargoStock>元素。 这样我就可以简单地添加一个新的 StockCargo > 设置想要的 CargoSO 和数量,保存 StockList 脚本对象并完成:

[System.Serializable]
[CreateAssetMenu(fileName = "CargoShopStockSO", menuName = "GameDataSOs/CargoShopStockSO", order = 3)]

public class CargoShopStockSO : ScriptableObject
{
    public List<CargoStock> CargoStocks;
}

这样我可以有一个单独的 SO 来保存每个商店的 stockList,但我可以轻松地更改库存,而不必为每个 CargoStock 实例创建 100 个 SO...

所以我真的需要 CargoStock 像现在一样成为自定义类。

作为变通办法,我可以做什么?或者我该如何解决这些错误? 谢谢。

编辑:我知道我可以使用 int 作为 ID 系统,以便稍后在需要时链接回 CargoSO,但我希望能够通过 Inspector 为每个 CargoStock 设置 CargoSO,以便设计人员可以轻松调整这些东西,并且不必查找匹配的 CargoSO 的 ID。

c# unity3d serialization scriptable-object
© www.soinside.com 2019 - 2024. All rights reserved.